启动应用程序时 VBA 类型不匹配
Posted
技术标签:
【中文标题】启动应用程序时 VBA 类型不匹配【英文标题】:VBA Type Mismatch when application is started 【发布时间】:2017-04-27 15:09:34 【问题描述】:我在使用用于触发 sub 的显示对象时遇到了一些问题。显示对象的结果不是真就是假,我用的是_Change方法。代码很简单。
Private Sub clamshellLblRequest_Change()
If Not tagDisplay Is Nothing Then
GoTo execute
Else
Set tagDisplay = LoadedDisplays
GoTo execute
End If
execute:
If clamshellLblRequest.Value = 1 Then
LogDiagnosticsMessage "Requesting clamshell label information"
Call labels.clamshell
End If
End Sub
当我第一次启动应用程序时,我收到一个特定于该值的“类型不匹配”错误 (13)。我有几个其他显示对象,我以相同的方式使用相同的数据类型,但似乎没有这个问题。还有什么可能导致这种情况?
更新: 我有一个模块,我使用标准计时器,其中包括以下内容。
Public Sub tenthSec()
'Create a program delay, DateTime Timer resolution in MSWindows is 0.01. Needed for tag updates.
t = Timer
While Timer - t < 0.1
Wend
End Sub
当我在评估对象的值之前执行调用 timers.tenthSec 时,它似乎不会引发类型不匹配。
...
execute:
Call timers.tenthSec
If clamshellLblRequest.Value = 1 Then
LogDiagnosticsMessage "Requesting clamshell label information"
Call labels.clamshell
End If
End Sub
我不会将此称为解决方案,也许是创可贴。有什么想法吗?
【问题讨论】:
你在哪里定义你的变量?类型不匹配来自那里,我们看不到它。clamshellLblRequest.Value
是对象值。它不是从 VBA 本身定义的。它是布尔值。
不要写 Sub
等待,而是这样做:Application.Wait(Now + #0:00:01#)
这会为您的代码增加一秒钟的等待时间。
我不明白If clamshellLblRequest.Value = 1 Then
部分,因为如果Value
是Boolean
类型,那么条件will never be true。你确定Value
是Boolean
?
此代码绑定的软件是专有的。它不会接受1
作为True
。它让我陷入了很长时间的循环,因为我无法弄清楚为什么我的代码在随机的地方会如此损坏。基本上,当我与外部软件交互时,我需要使用1
和0
而不是True
和False
。
【参考方案1】:
同意@Masoud 关于等待的观点。您还可以在循环内使用 DoEvents,它允许其他事情继续计算等。此外,您不需要执行:并使用您拥有的代码转到,您应该能够执行类似这样的操作(注意Not Is Nothing 到 Is Nothing 的变化:
Private Sub clamshellLblRequest_Change()
If tagDisplay Is Nothing Then
Set tagDisplay = LoadedDisplays
End If
Application.Wait(Now + #0:00:01#)
' or
For i = 1 to 1000
DoEvents
Next i
If clamshellLblRequest.Value = 1 Then
LogDiagnosticsMessage "Requesting clamshell label information"
Call labels.clamshell
End If
End Sub
【讨论】:
这似乎合乎逻辑。我将重复使用的任务(不一定在一个软件中重复使用,但在许多软件中经常使用)保存在模块中,以便我可以轻松地将它们转储并访问它们。以上是关于启动应用程序时 VBA 类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章
查找文件夹/子文件夹名称时 MS Access VBA 运行时错误“13”类型不匹配