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例程.