use*_*973 4 excel vba debug-print
在VBA中,Debug.Print
打印到立即窗口。
我刚刚发现,使用分号(;
)可以将其打印在插入符号/文本光标的位置,这似乎很奇怪。
Debug.Print "a" & "b" & "c"
Debug.Print ; "a"; "b"; "c"
Debug.Print "a", "b", "c"
Run Code Online (Sandbox Code Playgroud)
打印以下内容。
abc
abc
a b c
Run Code Online (Sandbox Code Playgroud)
这是我在文档中找到并进一步了解之前的主要问题。
我现在的问题是是否可以使用这样的命名参数:
Debug.Print object:="..."
Run Code Online (Sandbox Code Playgroud)
Intellisense通常有助于查找参数的名称,但不会列出任何名称。
我也尝试过object
或outputlist
喜欢它在文档中显示,但它引发了错误。
是Debug.Print
在这方面有什么不同?
Debug
陈述确实与其他所有陈述不同。如果Debug
在对象浏览器中寻找模块,即使显示隐藏的类和成员,也找不到。
Debug.Print
和Debug.Assert
语句实际上是烘焙到[parser]语言中的-此处的逗号并不表示“参数分隔符”,而是[显然]为Print
方法保留的一种特殊形式的语法(注意:VBA用户代码不能Print
用于方法名称,它是保留的)。
因此,Debug
语句基本上是特殊的关键字。对于参数列表语法元素显示了IntelliSense / parameter quick-info ,但从语法上讲,a的“参数” Debug.Print
是输出列表,就像Print语句一样。
请注意,VBE自动将?
令牌转换为Print
语句:
Debug.? --> Debug.Print
Run Code Online (Sandbox Code Playgroud)
有很多历史包bag 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可见的类:
Debug.? --> Debug.Print
Run Code Online (Sandbox Code Playgroud)
..然后从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);
};
Run Code Online (Sandbox Code Playgroud)
如果真是这样,那么错误438就是VBA所说的“找不到IVBPrint实现”的方式