【问题标题】:Is it possible to write to the VBA immediate window from a C# COM interop object?是否可以从 C# COM 互操作对象写入 VBA 即时窗口?
【发布时间】:2012-10-17 17:07:43
【问题描述】:

我编写了一个供 MSAccess 使用的 C# COM 对象。它对我的目的来说工作得很好,但我想在创建新对象时进行版本检查,并通过即时窗口通知 VBA 程序员有新版本可用。

这可能吗?我尝试过 Debug.Print 和 Console.WriteLine 但都不起作用。

我发现有几个帖子(如this)提出了这个问题,但并没有真正提供答案。

【问题讨论】:

  • 都不行。 DefaultTraceListener.Write/Line() 应该试一试。
  • 感谢您的建议。我查看了 DefaultTraceListener 的文档,发现它被添加到 Debug.Listeners 和 Trace.Listeners 中,所以我尝试遍历两者并调用 WriteLine。输出最终进入 VS 的输出窗口。有什么方法可以将 VBA“注册”为侦听器?

标签: c# vba com interop


【解决方案1】:

有可能……但不漂亮也不可靠。

这是我在进行研究和实验后刚刚写的一个 VBA 子程序,它可以满足您的需求。主要作为概念证明提供。

Sub ImmediateWindowSendKeys(keys As String)
    set w = Application.VBE.windows("Immediate")
    w.SetFocus
    SendKeys keys
    w.Visible = True
End Sub

我假设您可以将其转换为您想要的语言,甚至可以从 C# 调用此子程序。此方法的主要问题是,如果您正在单步执行代码、在当前处理的任何位置设置断点或生成弹出警报(这是发送键的限制),它就不起作用。但是,如果使用 F5 或从即时窗口运行,它确实可以工作。

我会尝试找出一种访问窗口内容的方法,但目前这是我能提供的最好的方法。

编辑:

根据您的评论,这应该同样没用。然而,我才刚刚开始涉足这种事情,所以这是一种游戏。这会将 cmets 添加到当前模块的末尾。

Sub AddCommentsToEndOfModule()
    Set cm = Application.vbe.ActiveCodePane.CodeModule
    cm.InsertLines cm.CountOfLines + 1, "'Dear Developer " & vbCrLf & "'Hi" & vbCrLf & "'Sincerely," & vbCrLf & "'Me"
End Sub

【讨论】:

  • 感谢丹尼尔的建议。如果我用尽所有其他可能性,也许我会走这条路。问题是它需要对 Access 应用程序的引用,如果不明确传递它,我就无法获得它(除非有一些骇人听闻的方法来获取它,这是可能的)。所以我不确定如何在创建对象时做到这一点,因为 VBA 不允许在 New 语句中使用参数。无论如何+1的想法;可能有用——谢谢!
  • 确实如此。我突然忘记了“消费”到底是什么意思。我将添加另一种可能的方法来向开发人员发送消息,这可能同样有用。
  • 虽然这可能有效,正如@DanielCook 指出的那样,但它真的真的脆弱。它也没有考虑到用户可能正在使用即时窗口的事实 - 因此您可能会附加半写的命令/等......虽然这可能是最后的手段,但请如果可以的话,避免它。也就是说,如果没有更好的结果,我会为横向思考 +1
猜你喜欢
  • 2011-11-15
  • 2011-06-28
  • 2011-01-12
  • 1970-01-01
  • 2017-10-17
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多