如何调试VBA运行时错误1004‘应用程序定义或对象定义错误’:通用诊断方法及底层错误信息获取
虽然网上已经有不少关于VBA运行时错误1004“应用程序定义或对象定义错误”的讨论,但大多都是针对特定场景或具体错误实例的解决方案,很少有人讲通用的底层诊断和调试方法。所以我想换个思路,本着“授人以渔而非授人以鱼”的原则,和大家聊聊怎么正确调试这个令人头疼的错误。
有文档提到过一种可能性:
在访问其他应用程序的对象时,可能会有无法映射到Visual Basic错误的错误传播回你的程序
这也就是说,不管在什么应用上下文里用VBA,理论上都应该能获取到更详细的错误信息,但目前我还没找到一套系统的深入排查方法。
下面我给两个实际遇到的场景做参考,但我不是来求这些场景的具体解决方案的,主要是想搞清楚怎么获取错误的更多细节:
场景1
我写了个脚本用来批量处理Excel文件的简单操作。在我自己的机器(Office 365环境)上用相同数据运行,一切正常(先不管场景2的问题)。但把脚本发给同样用Office 365的目标机器运行时,就在这行代码触发了1004错误:Workbooks(newFileName).Worksheets("rekenblad").Range("G7").Value = "=" & adminCosts & "-$I$7"
这里的adminCosts是Double类型,因为我和目标机器的区域设置不一样,我在脚本早期版本里已经加了处理小数点符号的代码:
If Application.International(xlDecimalSeparator) = "," Then adminCosts = Replace(adminCosts, ".", ",") ElseIf Application.International(xlDecimalSeparator) = "." Then adminCosts = Replace(adminCosts, ",", ".") End If
不过按理说这不该是问题,因为这个变量的值是从主机的单元格复制来的,小数点符号肯定是对的(调试的时候也确认过这一点)。但就是这行代码跑不起来。有意思的是,这段代码在我自己的机器上跑完全没问题,在目标机器的Excel里手动给G7单元格输同样的内容也能行,甚至在目标机器的即时窗口里直接给这个区域赋值也正常,但就是找不到问题出在哪。
场景2
在目标机器上调试半天没结果,我们把数据转移到我的机器上跑脚本。结果处理到三分之二的文件时,同样在上面那行代码触发了1004错误。排查后发现,对应的单元格存的是String类型而不是Double类型,这个问题很容易就找到了,但场景1的情况就完全不一样了。
内容的提问来源于stack exchange,提问作者Sjors Hijgenaar

