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

时间:2017-10-05 20:04:11

标签: excel vba compiler-errors arguments byref

所以我正在使用我的程序。它工作和运行,所以我复制它并制作了第二个版本,我可以添加额外的功能,同时仍然有一个工作程序。我没有看到我的新代码有任何问题,所以我准备逐步完成它。突然之间,在我的其他版本中完美运行的东西会导致编译错误。具体如下。

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

我一次又一次地检查,但是这个完全相同的代码在我的其他文件中正常工作。在此文件中,它突出显示"格式"并抛出以下编译错误。 Compile Error: arguments or property

有谁知道为什么excel会对此感到沮丧?如果存在编译错误,我是否应该查看它突出显示的位置?

1 个答案:

答案 0 :(得分:3)

你有一些名为Format 的地方的范围内的东西(即可以从调用Format函数的地方访问),{{1 shadowing 你想要调用的Format函数。

YowE3K suggested如果您右键点击Format来电并选择"定义" (或 Shift + F2 ),它将带您进入阴影声明。

从那里你有几个选择:

  • 重命名Format标识符[可能会破坏代码中的大量内容]
  • 完全限定 Format来电,即Format,或仅VBA.Strings.Format,甚至Strings.Format

我的建议是完全限定那个调用,然后尝试再次编译,并完全限定任何/所有调用导致相同的编译错误。 然后重命名名为VBA.Format的任何内容,以便它不再阴影来自VBA标准库的函数。

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

Rubberduck toolbar showing all references

Rubberduck工具栏会告诉您Format何时引用了正确的函数:

Rubberduck toolbar showing VBA.Strings.Format

您也可以轻松找到所有对此的引用,无论是否合格 - 因此,无论身在何处,都可以轻松完全限定它们。

Rubberduck还可以轻松地以搜索/替换失败的方式重构/重命名该函数:

"Format" function renamed to "Renamed", VBA.Strings.Format call remained unchanged

巧合的是,目前正在进行新的代码检查,特别是找到像这样的阴影标识符

至于Format参数类型不匹配,您的屏幕截图似乎与您发布的代码不匹配,因此一切皆有可能,但除非ByRef分配给{ eqn函数(应该返回,而不是已分配),然后无需传递MakeEqn(隐式或明确) ) - 它可以传递ByRef(Rubberduck为您提供检查结果 - 另一个用于隐式返回类型,另一个用于两个过程的隐式ByVal访问修饰符,其他几个用于其他你发布的代码中的问题。)