2012-10-17 38 views
1

我寫了一個C#COM對象供MSAccess使用。它對我的目的非常有用,但是我想在創建新對象時進行版本檢查,並通過即時窗口通知VBA程序員新版本可用。是否可以從C#COM互操作對象寫入VBA立即窗口?

這可能嗎?我試過Debug.Print和Console.WriteLine,但都不起作用。

我發現了幾個帖子(如this)提出的問題,但沒有真正提供答案。

+1

兩者都無效。 DefaultTraceListener.Write/Line()應該有一個鏡頭。 –

+0

感謝您的建議。我查看了DefaultTraceListener的文檔,發現它被添加到Debug.Listeners和Trace.Listeners中,所以我嘗試通過迭代並調用WriteLine。輸出結束到VS的輸出窗口。任何將VBA註冊爲監聽器的方法? – transistor1

回答

2

這是可能的...但不漂亮或可靠。

這是一個VBA sub,我在做了你想做的研究和實驗後才寫了。基本上提供作爲概念證明。

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

我假設你可以將它轉換成你想要的語言,甚至可以從C#調用這個子類。這種方法的主要問題在於,如果您單步執行代碼,在當前處理的任何位置設置斷點或生成彈出警報(這是發送密鑰的限制),則它不起作用。但是,如果使用F5或從直接窗口運行,它確實有效。

我會嘗試找出一種方法來訪問窗口的內容,但現在這是我能提供的最好的。

編輯:

根據您的評論,這應該是同樣無用的。不過,我剛剛開始涉足這類事情,所以這是一種遊戲。這會將註釋添加到當前模塊的末尾。

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

感謝Daniel的建議。如果我耗盡所有其他可能性,也許我會走這條路。問題在於它需要引用Access應用程序,如果不明確地傳遞Access應用程序,我不能得到這個應用程序(除非有一些詭異的方式來獲取它,這是可能的)。所以我不確定我如何在對象創建上做到這一點,因爲VBA不允許在New語句中使用參數。無論如何+1的想法;這可能會有用 - 謝謝! – transistor1

+0

夠正確。我突然忘記了「消費」究竟意味着什麼。我將添加另一種可能的方法來向開發人員發送消息,這可能同樣有幫助。 –

+1

儘管這可能有用,正如@DanielCook指出的那樣,它確實是非常脆弱的。它也沒有考慮到用戶可能正在使用即時窗口的事實 - 因此你可能會追加到半寫的命令/等等......雖然這可能是最後的手段,但請如果可以的話避免它。也就是說,如果沒有更好的事情發生,我會+1進行橫向思考 – Basic