有没有办法告诉当前正在运行的Sub是父级还是被调用的子级

时间:2019-08-08 13:30:06

标签: excel vba

我在VBA中有可以独立运行或可以被另一个例程调用的例程。当被称为子例程(子例程)或主例程(父例程)时,有些操作可能会执行,也可能不想执行。我可以调用VBA中的一个内置函数来告诉我我正在执行的代码是父母还是孩子吗?

我创建了全局变量来测试父母/孩子,但我想有一个更优雅的解决方案。

4 个答案:

答案 0 :(得分:3)

我认为,一种好的方法是为具有开关(参数)的动作本身创建一个过程,并为其调用一个过程。

Private Sub MyProcedure(Optional ByVal IsChild As Boolean = True) 'set default here
    If IsChild Then
        'child
    Else
        'parent
    End If
End Sub

现在您可以有一个程序来调用它

Public Sub ParentCallMyProcedure()
    MyProcedure IsChild:=False
End Sub

Public Sub ChildCallMyProcedure()
    MyProcedure IsChild:=True
    'which would be the same as
    MyProcedure
End Sub

例如,如果您想通过按钮调用MyProcedure,请使用

Public Sub Button1_Click()
    MyProcedure IsChild:=False
End Sub

在所有其他过程中,只需使用MyProcedure,而IsChild是默认的True

至少这比公共/全局变量更优雅。

答案 1 :(得分:2)

在.Net中,获取方法信息的方法称为方法Reflection。在C#-How can I find the method that called the current method?中非常简单。 VBA不支持它,但是您可以运行它,并通过变量或将其记录到工作表或数据库中来记录有关它的数据。

如果您将代码停在被调用子/函数的中间并调用Call Stack diaglog box,则有一种方法。例如,想象以下顺序:

Sub TestMe()
    Testme2
End Sub

Sub Testme2()
    Stop
End Sub

如果运行代码并在进入Stop后按 Ctrl + L ,则会得到以下信息:

enter image description here

如果仅运行TestMe2并按 Ctrl + L ,则会相应地得到它:

enter image description here

答案 2 :(得分:1)

以下并不是真正的解决方案,它可能会根据您的设置而起作用:

enter image description here

答案 3 :(得分:0)

这是我过去使用过的Occam的Razor解决方案。

Public ChildCount as Integer
Sub EveryProc()
  ChildCount = ChildCount + 1
  ... rest of code...
  ChildCount = ChildCount - 1
  End Sub

这使我可以测试我进入子例程的距离,因为对于父级,ChildCount将为1,对于子级将为> 1。我认为第一次进入VBA时,ChildCount将为零,因此您需要在每个子程序的开头和结尾处递增和递减变量。 我被SAP宠坏了...