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