一篇短文,深入理解Application.Caller

2022-03-04 15:53:41 浏览数 (1)

标签: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在立即窗口中不工作。

相关文章:一段代码,显式确定工作表列表框选项状态>>>

0 人点赞