VBA:我的程序在格式上抛出编译错误

VBA: my program is throwing compile error on Format

所以我正在使用我的程序。它工作并运行,所以我复制它并制作了第二个版本,我可以在仍然有一个工作程序的同时添加额外的功能。我没有发现我的新代码有任何问题,所以我准备单步执行它。突然间,在我的其他版本中运行良好的东西抛出了编译错误。具体如下。

Dim elapsedTime As String
Dim startTime As Date
startTime = Now()
'code
elapsedTime = Format(Now() - startTime, "h:m:s")

我检查了一遍又一遍,但是这个完全相同的代码在我的其他文件中工作正常。在此文件中,它突出显示 "Format" 并抛出以下编译错误。

有谁知道为什么 excel 会对此如此生气?如果有编译错误,我是否应该查看它突出显示的地方?

你有一个名为 Format 某处 的东西在范围内(即可以从调用 Format 函数的地方访问),并且 Format 事情是 隐藏 您要调用的 Format 函数。

As 如果您右键单击该 Format 调用并 select "Definition"(或 Shift+F2), 这将带你到阴影声明。

从那里你有几个选择:

  • 重命名 Format 标识符 [并可能破坏代码中的大量内容]
  • 完全限定 Format 调用,即 VBA.Strings.Format,或只是 Strings.Format,甚至 VBA.Format

我的建议是完全限定 that 调用,然后尝试再次编译,并完全限定 any/all 导致相同编译错误的调用。 然后 重命名名为 Format 的任何内容,这样它就不再 shadows VBA 标准中的函数图书馆。

如果您使用 Rubberduck(我管理的开源 VBIDE 插件项目),您可以轻松找到阴影标识符的所有引用:

Rubberduck 工具栏会告诉您 Format 指的是正确的函数:

而且您也可以轻松找到对它的所有引用,无论是否合格 - 因此无论它们在哪里,都可以很容易地完全限定它们。

Rubberduck 还使 refactor/rename 函数变得容易,以 search/replace 失败的方式:

巧合的是,目前正在进行一项新的代码检查,专门用于定位 隐藏标识符


至于 ByRef 参数类型不匹配,您的屏幕截图似乎与您发布的代码不匹配,所以一切皆有可能,但除非在正文中分配了 eqn MakeEqn函数(应该是returned,不是assigned),那就不用传了ByRef (隐式或显式)- 它可以传递 ByVal (Rubberduck 为您提供检查结果 - 另一个用于隐式 return 类型,另一个用于隐式 Public两个过程的访问修饰符,以及您发布的代码中其他问题的其他几个访问修饰符。