gpt4 book ai didi

excel - 在 VBA 中调试.打印

转载 作者:行者123 更新时间:2023-12-02 09:42:27 48 4
gpt4 key购买 nike

在 VBA 中 Debug.Print 打印到立即窗口。

我刚刚发现使用分号 (;) 可以使其打印在 caret/text cursor 的位置这看起来很奇怪。

Debug.Print "a" & "b" & "c"
Debug.Print ; "a"; "b"; "c"
Debug.Print "a", "b", "c"

打印以下内容。

abc
abc
a b c

这是我在文档中找到它并进一步理解它之前的主要问题。

Use a semicolon (;) to position the insertion point immediately following the last character displayed.

我现在的问题是是否可以使用named argument像这样:

Debug.Print object:="..."

智能感知通常有助于查找参数的名称,但它不会列出任何名称。

我还尝试了 objectoutputlist 就像文档中显示的那样,但它引发了错误。

Debug.Print 在这方面有什么不同吗?

最佳答案

Debug 语句确实与其他内容不同。如果您在对象浏览器中查找 Debug 模块,您将找不到它,即使显示了隐藏的类和成员。

Debug.PrintDebug.Assert 语句实际上被融入到语言 [解析器] 本身中 - 这里的逗号并不意味着“参数分隔符”,而是一种特殊形式的语法,[显然] 为 Print 方法保留(注意:VBA用户代码不能使用 Print 作为方法名称,它是保留的)。

所以 Debug 语句基本上是特殊类型的关键字。 IntelliSense/参数快速信息显示了参数列表语法元素,但从语法上讲,Debug.Print 的“参数”是一个输出列表,与 Print statement 完全相同。

请注意,VBE 自动将 ? token 转换为 Print 语句:

Debug.? --> Debug.Print

Print 有相当多的历史包袱:关键字/命令(及其 ? 简写)在旧的 BASIC 方言中用于将内容输出到屏幕......或实际的[点阵!]打印机。

所以简短的回答是,Debug 语句是使用关键字而不是成员调用进行的 - 这就是为什么 IntelliSense 对它们没有任何用处,因为没有任何参数。 p>

Rubberduck 项目有一个关于这些语句的有趣故事...因为它实际上不可能以与任何其他隐式 Debug.Print 不同的方式解析典型的 callStmt 语句(即它看起来和解析就像任何其他过程调用一样),我们必须为语句提供其自己的专用解析器规则,并“声明”一个假的 DebugClass 模块,并使 Print 成为该“类”的“方法”,以便能够像我们对其他早期绑定(bind)标识符引用所做的那样跟踪使用:

VBE7.DLL;VBA.DebugClass.Print (procedure)

但确实不存在这样的事情:带有输出列表的语句在解析器和编译器级别被烘焙到语言中,而实际上您在 VBA 中进行的所有其他成员调用都是某些模块的成员 - 按 F2 并浏览 VBA 标准库的成员:您会发现 CLng 类型转换、NowDateAdd 日期/时间函数、 MsgBoxDoEvents 以及许多其他函数 - 所有属于某个模块。但 Debug 语句更接近 StopResume 关键字,在较低级别处理。

<小时/>

进一步证明,除了表面上看到的以外,还有一个简单的事实:如果您编译用 C# 编写的 COM 可见类,VBE 中的默认语法突出显示将以明亮的关键字蓝色突出显示 DebugPrint:

[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 client code

可以调用 DoSomething 方法,但 Print 方法将抛出错误 438 - 就像您尝试使用 Debug 以外的任何内容来限定它一样。那么 Print 是如何在 Access 报告的代码隐藏中工作的呢?

该接口(interface)没有记录,因此这纯粹是猜测,但有一个 IVBPrint 接口(interface),看起来非常像 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);
};

如果是这样的话,那么 error 438 is just VBA's way to say "IVBPrint implementation not found"

关于excel - 在 VBA 中调试.打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57148609/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com