簡體   English   中英

VBA中的Debug.Print

[英]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:="..."

智能感知通常有助於查找參數的名稱,但它不會列出任何名稱。

我也試過objectoutputlist喜歡它顯示了文檔,但它拋出一個錯誤。

Debug.Print在這方面有所不同嗎?

Debug語句確實與其他所有語句不同。 如果在對象瀏覽器中查找Debug模塊,即使顯示了隱藏的類和成員,也無法找到它。

Debug.PrintDebug.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成為該“類”的“方法”,以便能夠跟蹤我們對其他早期綁定標識符引用的使用:

VBE7.DLL; VBA.DebugClass.Print(程序)

但確實沒有這樣的事情:帶有輸出列表的語句被解析為語言分析器和編譯器級別,而字面上你在VBA中做過的每個其他成員調用都是某個模塊的成員 - 點擊F2並瀏覽VBA標准庫的成員:你會發現CLng類型轉換, NowDateAdd日期/時間函數, MsgBoxDoEvents等等 - 都屬於某個模塊。 Debug語句更接近StopResume關鍵字,在較低級別處理。


進一步證明,除了簡單的事實,VBE中的默認語法高亮將突出顯示DebugPrint在明亮的關鍵字藍色,如果您編譯用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代碼調用它...

PrintMethodTest客戶端代碼

可以調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM