最终,我想将单元格移动到上次发生错误的位置。 编辑:忘记说我正在使用 Excel 2003。
最佳答案
根据评论中的要求...
在 Excel VBA 帮助中查找“Application”对象的“Caller”属性。当您从 VBA 例程中使用它时,它会告诉您对例程的调用来自哪里 - 什么范围、图表等。
使用“Application.Caller”时需要注意的重要一点是它并不总是 Range 对象。查看帮助,发现该属性返回一个 Variant 值,可以是 Range、String 或 Error。 (如果您感兴趣的话,它是一个 Range 对象,但您需要注意这一点。)
由于上述原因,以及 VBA 语法在对象与值方面的变幻莫测,使用“Application.Caller”可能会很棘手。放置一行:
Debug.Print Application.Caller.Address
当调用者不是 Range 时,代码中的 将失败。做类似的事情:
Dim v
v = Application.Caller
将“编译”,但当调用者是 Range 时会创建循环引用,因为您试图访问调用 Range 的值。
这一切都意味着最好为自己编写一些实用函数:
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 例程。
关于VBA:当工作簿/工作表中发生最后一个错误时,如何通过 VBA 代码获取最后使用的单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3861431/