如何判断 Sub 是否被立即调用 window
How to tell if Sub is called from immediate window
有些潜艇我只想 运行 来自直接 window,比如这个有点冒险的潜艇:
Public Sub clear()
Application.SendKeys "^a", True
Application.SendKeys "{delete}", True
End Sub
万一你解决不了;它向应用程序发送 ctrl+a 和 Del,并具有清除周围所有内容的效果当时的光标。
我通过键入 clear
在立即 window 中使用它,立即 window 中的所有内容都被删除。
如您所知,这个 Sub 非常危险,并且相对容易意外调用。因此,我想在立即 window
调用时仅 运行
- 不是来自另一个 Sub
- 不是来自表单控件
- 不是来自 ActiveX(虽然那实际上只是一个子)
- 不是来自用户调用(通过 Developer/Macros 选项卡)
也不是来自任何其他来源(我已经列出了所有这些,因为我认为即使你不能直接说出它是由直接 window 调用的,你也可以说通过排除其他选项间接地)
这可以通过编程方式完成吗?理想情况下,我只想在 clear()
sub 的开头进行简单的布尔检查,告诉它什么都不做,除非被立即调用 window.
N.B.
一个途径可能是通过使用调用堆栈 (ctrl+L打开对话框),因为我注意到立即调用在堆栈中没有留下任何痕迹,而列出了调用 clear()
的子程序,因此可以排除。但我不确定如何通过 VBA
访问它
我知道这不是你问题的答案,但如果你想"clear"你的直接window,这就是我使用的:
Sub clear()
For i = 0 To 100
Debug.Print ""
Next i
End Sub
一个简单的解决方案是添加一个参数
Public Sub clear(sCaller As String)
If sCaller = "Immediate" Then
Application.SendKeys "^a", True
Application.SendKeys "{delete}", True
End If
End Sub
这可能也不是您想要的,但显然可以将风险降至最低
我发现了一种结合了一些想法的方法:
Public Sub clear(Optional s As Variant)
If TypeName(Application.Caller) = "Error" And IsMissing(s) = False Then
'Do code
End If
End Sub
发生的事情是,如果从范围(仅功能)或按钮调用子程序,那么这会被 TypeName
测试捕获,因为这些将 return Range
和 String
分别。错误选项是立即 window、Sub 或用户调用。用户不能提供额外的参数,因此排除了这种情况。最后,我们希望子调用不会包含参数。
s
是 Variant
,因此您可以在 window 中输入 clear whatever
,而不必在 "
中输入 watever
](表示文本)。
显然可以通过适当的论证变得更安全。显然它并不像希望这个词所要表达的那样理想!当然,它也没有真正回答问题。
有些潜艇我只想 运行 来自直接 window,比如这个有点冒险的潜艇:
Public Sub clear()
Application.SendKeys "^a", True
Application.SendKeys "{delete}", True
End Sub
万一你解决不了;它向应用程序发送 ctrl+a 和 Del,并具有清除周围所有内容的效果当时的光标。
我通过键入 clear
在立即 window 中使用它,立即 window 中的所有内容都被删除。
如您所知,这个 Sub 非常危险,并且相对容易意外调用。因此,我想在立即 window
调用时仅 运行- 不是来自另一个 Sub
- 不是来自表单控件
- 不是来自 ActiveX(虽然那实际上只是一个子)
- 不是来自用户调用(通过 Developer/Macros 选项卡)
也不是来自任何其他来源(我已经列出了所有这些,因为我认为即使你不能直接说出它是由直接 window 调用的,你也可以说通过排除其他选项间接地)
这可以通过编程方式完成吗?理想情况下,我只想在 clear()
sub 的开头进行简单的布尔检查,告诉它什么都不做,除非被立即调用 window.
N.B.
一个途径可能是通过使用调用堆栈 (ctrl+L打开对话框),因为我注意到立即调用在堆栈中没有留下任何痕迹,而列出了调用 clear()
的子程序,因此可以排除。但我不确定如何通过 VBA
我知道这不是你问题的答案,但如果你想"clear"你的直接window,这就是我使用的:
Sub clear()
For i = 0 To 100
Debug.Print ""
Next i
End Sub
一个简单的解决方案是添加一个参数
Public Sub clear(sCaller As String)
If sCaller = "Immediate" Then
Application.SendKeys "^a", True
Application.SendKeys "{delete}", True
End If
End Sub
这可能也不是您想要的,但显然可以将风险降至最低
我发现了一种结合了一些想法的方法:
Public Sub clear(Optional s As Variant)
If TypeName(Application.Caller) = "Error" And IsMissing(s) = False Then
'Do code
End If
End Sub
发生的事情是,如果从范围(仅功能)或按钮调用子程序,那么这会被 TypeName
测试捕获,因为这些将 return Range
和 String
分别。错误选项是立即 window、Sub 或用户调用。用户不能提供额外的参数,因此排除了这种情况。最后,我们希望子调用不会包含参数。
s
是 Variant
,因此您可以在 window 中输入 clear whatever
,而不必在 "
中输入 watever
](表示文本)。
显然可以通过适当的论证变得更安全。显然它并不像希望这个词所要表达的那样理想!当然,它也没有真正回答问题。