我在VBA中有可以独立运行或可以被另一个例程调用的例程。当被称为子例程(子例程)或主例程(父例程)时,有些操作可能会执行,也可能不想执行。我可以调用VBA中的一个内置函数来告诉我我正在执行的代码是父母还是孩子吗?
我创建了全局变量来测试父母/孩子,但我想有一个更优雅的解决方案。
答案 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 ,则会得到以下信息:
如果仅运行TestMe2
并按 Ctrl + L ,则会相应地得到它:
答案 2 :(得分:1)
答案 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宠坏了...