是否可以从C#COM互操作对象写入VBA即时窗口?

是否可以从C#COM互操作对象写入VBA即时窗口?,c#,vba,com,interop,C#,Vba,Com,Interop,我已经编写了一个C#COM对象供MSAccess使用。就我的目的而言,它工作得很好,但我希望在创建新对象时进行版本检查,并通过即时窗口通知VBA程序员新版本可用 这可能吗?我尝试过Debug.Print和Console.WriteLine,但两者都不起作用 我发现有好几个帖子(比如)问了这个问题,但没有给出答案。有可能。。。但不漂亮也不可靠 这是我在做了研究和实验后写的一个VBA sub,它可以满足你的需要。基本上作为概念的证明而提供 Sub ImmediateWindowSendKeys(ke

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

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


我发现有好几个帖子(比如)问了这个问题,但没有给出答案。

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

这是我在做了研究和实验后写的一个VBA sub,它可以满足你的需要。基本上作为概念的证明而提供

Sub ImmediateWindowSendKeys(keys As String)
    set w = Application.VBE.windows("Immediate")
    w.SetFocus
    SendKeys keys
    w.Visible = True
End Sub
我想你可以把它转换成你想要的语言,或者甚至从C#调用这个sub。此方法的主要问题是,如果您正在单步执行代码、在当前处理中的任何位置设置断点或生成弹出警报(这是对发送密钥的限制),则此方法不起作用。但是,如果使用F5或从即时窗口运行,则它确实可以工作

我将尝试找出一种访问窗口内容的方法,但现在这是我能提供的最好的方法

编辑:

根据你的评论,这应该是同样无用的。然而,我才刚刚开始涉足这类事情,所以这是一种游戏。这将在当前模块的末尾添加注释

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

两者都不起作用。DefaultTraceListener.Write/Line()应该试一试。谢谢你的建议。我查看了DefaultTraceListener的文档,发现它被添加到Debug.Listeners和Trace.Listeners中,所以我尝试遍历这两个文件并调用WriteLine。输出最终进入VS的输出窗口。有没有办法“注册”VBA为听众?谢谢你的建议,丹尼尔。如果我用尽所有其他的可能性,也许我会走这条路。问题是它需要一个对Access应用程序的引用,如果不显式地传递它,我就无法获得它(除非有某种黑客的方式获得它,这是可能的)。所以我不确定如何在创建对象时做到这一点,因为VBA不允许在新语句中使用参数。无论如何,这个想法+1;这可能有用——谢谢!没错。我突然忘记了“消费”的确切含义。我将添加另一种可能的方法来向开发人员发送消息,这种方法可能同样有用。正如@DanielCook指出的,虽然这可能有效,但它确实很脆弱。它也没有考虑到用户可能在使用即时窗口中间的事实,因此你可能会追加到一半的书面命令…虽然这可能是最后的办法,但请尽量避免。也就是说,如果没有更好的结果出现,我将+1用于横向思考