VBA:如何在工作簿/工作表中发生最后一个错误时通过VBA代码获取最后一个使用过的单元格?

Van*_*mex 4 excel scripting vba excel-vba

最后,我想将单元格移动到发生最后一次错误的位置.编辑:忘了说我正在使用Excel 2003.

jto*_*lle 19

根据评论中的要求......

在Excel VBA帮助中查找"应用程序"对象的"调用者"属性.当您从VBA例程中使用它时,它将告诉您对例程的调用来自何处 - 范围,图表等.

使用'Application.Caller'时要注意的一件重要事情是它并不总是Range对象.查看帮助,但该属性返回Variant值,该值可以是Range,String或Error.(在您感兴趣的情况下,它是一个Range对象,但您需要注意这一点.)

由于上述情况,以及VBA语法在对象与值之间的变幻莫测,使用'Application.Caller'可能会很棘手.画一条线:

Debug.Print Application.Caller.Address
Run Code Online (Sandbox Code Playgroud)

当调用者不是Range时,代码中的代码将失败.做类似的事情:

Dim v
v = Application.Caller
Run Code Online (Sandbox Code Playgroud)

将"编译",但会在调用者一个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
Run Code Online (Sandbox Code Playgroud)

然后从错误处理程序中调用它,您想知道调用的来源.

还有一件事 - 显然,只有在实际调用VBA例程后,这才能告诉您调用者.如果调用公式中有错误,Excel将向您的单元格返回错误值,而不会调用您的VBA例程.