最后,我想将单元格移动到发生最后一次错误的位置。 修改:忘记说我正在使用Excel 2003。
答案 0 :(得分:18)
根据评论中的要求......
在Excel VBA帮助中查找“应用程序”对象的“调用者”属性。当您从VBA例程中使用它时,它将告诉您对例程的调用来自何处 - 范围,图表等。
使用'Application.Caller'时要注意的一件重要事情是它并不总是Range对象。查看帮助,但该属性返回Variant值,该值可以是Range,String或Error。 (在您感兴趣的情况下,它是一个Range对象,但您需要注意这一点。)
由于上述原因,以及VBA语法在对象与值之间的变幻莫测,使用'Application.Caller'可能会很棘手。如下所示:
Debug.Print Application.Caller.Address
当调用者不是Range时,代码中的将失败。做类似的事情:
Dim v
v = Application.Caller
将“编译”,但会在调用者 一个范围时创建循环引用,因为您试图访问调用范围的值。
这就意味着最好为自己编写一个小实用功能:
Public Function currentCaller() As String
If TypeOf Application.Caller Is Range Then
Dim rng As Range
Set rng = Application.Caller
currentCaller = rng.Address(External:=True)
Else
currentCaller = CStr(Application.Caller)
End If
End Function
然后从你的错误处理程序中调用它,你想知道调用的来源。
还有一件事 - 显然这只能在实际调用VBA例程后告诉你调用者。如果调用公式中有错误,Excel将向您的单元格返回错误值,而不会调用您的VBA例程。
答案 1 :(得分:2)
将VBA函数包装在另一个函数中,该函数将单元格位置和值存储为变体。保持这个“包装”功能尽可能基本,这样就不会产生任何其他错误。
如果您正在尝试调试应用程序崩溃错误,则包装函数甚至可以将这些值存储在逗号分隔的文本文件中。一旦存储,Excel可能会崩溃所有它想要的,你仍然知道单元格的位置和值是什么,因为你事先将它们存储在Excel之外。
答案 2 :(得分:0)
可以使用错误处理程序完成吗?
以下我的意思的一个例子:
sub code1()
on error goto cell A1
end sub