标签:VBA
我们经常会在VBA代码中看到Application.Caller,它到底起什么作用,往往让人感到模糊。下面,我们就来详细讲讲,对其有更深入的理解。
有下列3种常见情形。
情形1:如果从单元格/单元格区域调用VBA代码,那么Application.Caller返回代表该区域的Range对象。
例如,如果从单元格/单元格区域调用UDF(用户定义函数),并且希望获取从中调用它的单元格/单元格区域的地址,那么可以使用以下代码实现。本例返回Range,也可以将它设置为某个对象。
代码语言:javascript复制Function testRange()
Dim objCaller As Object '或Range
Set objCaller = Application.Caller
Debug.Print objCaller.Address '或Application.Caller.Address
testRange = objCaller.Address
End Function
效果如下图1所示。
图1
情形2:如果调用者是某控件(例如,下拉菜单、列表框、命令按钮等)或形状,则Application.Caller返回代表调用者名称的字符串。
例如,如果从某个形状/控件调用下面的函数,则它将打印并返回形状/控件的名称。
代码语言:javascript复制Function testControl()
Debug.Print Application.Caller
testControl = Application.Caller
End Function
效果如下图2所示。
图2
情形3:如果调用者是VBA过程或函数,则Application.Caller返回错误。
例如,如果在某个过程或函数中调用上面的函数testControl,则它将返回错误。
代码语言:javascript复制Sub CalltestControl()
Call testControl
End Sub
效果如下图3所示。
图3
注意,Application.Caller在立即窗口中不工作。
相关文章:一段代码,显式确定工作表列表框选项状态>>>