[英]Debug.Print in VBA
在VBA Debug.Print
打印到立即窗口。
我剛剛發現使用分號( ;
)使它在插入符/文本光標的位置打印,這似乎很奇怪。
Debug.Print "a" & "b" & "c"
Debug.Print ; "a"; "b"; "c"
Debug.Print "a", "b", "c"
打印以下內容。
abc
abc
a b c
在我在文檔中找到它並且理解它之前,這是我的主要問題。
我現在的問題是,是否可以使用這樣的命名參數 :
Debug.Print object:="..."
智能感知通常有助於查找參數的名稱,但它不會列出任何名稱。
我也試過object
或outputlist
喜歡它顯示了文檔,但它拋出一個錯誤。
Debug.Print
在這方面有所不同嗎?
Debug
語句確實與其他所有語句不同。 如果在對象瀏覽器中查找Debug
模塊,即使顯示了隱藏的類和成員,也無法找到它。
Debug.Print
和Debug.Assert
語句實際上是語言[parser]本身 - 這里的逗號並不意味着“參數分隔符”,而是一種特殊形式的語法[顯然]為Print
方法保留(注意: VBA用戶代碼不能使用Print
作為方法名稱,它是保留的)。
所以Debug
語句基本上是特殊類型的關鍵字 。 IntelliSense /參數quick-info顯示為參數列表語法元素,但從語法上講, Debug.Print
的“參數”是輸出列表 ,與Print語句完全相同。
注意VBE自動轉?
令牌進入Print
語句:
Debug.? --> Debug.Print
有相當多的歷史包袱與Print
:關鍵字/命令(和它的?
簡寫)是在舊的BASIC方言用來輸出東西到屏幕...或實際[點陣!]打印機。
所以簡短的回答是, Debug
語句是用關鍵字而不是成員調用 - 這就是為什么IntelliSense與它們沒有任何用處,因為沒有任何參數。
Rubberduck項目有一個有趣的故事與這些語句...因為它實際上不可能解析典型的Debug.Print
語句與任何其他隱式callStmt
不同(即它看起來和解析像任何其他過程調用),我們有給該語句提供自己的專用解析器規則,並“聲明”一個假的DebugClass
模塊,並使Print
成為該“類”的“方法”,以便能夠跟蹤我們對其他早期綁定標識符引用的使用:
但確實沒有這樣的事情:帶有輸出列表的語句被解析為語言分析器和編譯器級別,而字面上你在VBA中做過的每個其他成員調用都是某個模塊的成員 - 點擊F2並瀏覽VBA標准庫的成員:你會發現CLng
類型轉換, Now
和DateAdd
日期/時間函數, MsgBox
, DoEvents
等等 - 都屬於某個模塊。 但Debug
語句更接近Stop
或Resume
關鍵字,在較低級別處理。
進一步證明,除了簡單的事實,VBE中的默認語法高亮將突出顯示Debug
和Print
在明亮的關鍵字藍色,如果您編譯用C#編寫的COM可見類:
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("6F25002E-2C9F-4D77-8CCB-A9C0E4FB2EF1")]
public interface ITestClass
{
[DispId(1)]
void Print(string value);
[DispId(2)]
void DoSomething();
}
[ComVisible(true)]
[ComDefaultInterface(typeof(ITestClass))]
[ClassInterface(ClassInterfaceType.None)]
[Guid("6F25002E-2C9F-4D77-9624-6CA79D4F088A")]
[ProgId("PrintTest.Class1")]
[EditorBrowsable(EditorBrowsableState.Always)]
public class Class1 : ITestClass
{
public void Print(string value)
{
/* no-op */
}
public void DoSomething()
{
/* no-op */
}
}
..然后從VBA代碼調用它...
可以調用DoSomething
方法,但是Print
方法將拋出錯誤438 - 就像你試圖用除Debug
之外的任何東西來限定它一樣。 那么Print
如何在Access報告的代碼隱藏中工作呢?
界面沒有記錄,所以這是純粹的推測,但有一個IVBPrint
接口看起來非常像VBA將要尋找的東西:
[
odl,
uuid(000204F0-0000-0000-C000-000000000046),
nonextensible
]
interface IVBPrint : IUnknown {
HRESULT _stdcall WriteText([in] BSTR strText);
[propput]
HRESULT _stdcall Column([in] long retVal);
[propget]
HRESULT _stdcall Column([out, retval] long* retVal);
};
如果是這種情況,那么錯誤438就是VBA說“未找到IVBPrint實現”的方式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.