1

一些我只想从即时窗口运行的潜艇,比如这个有点冒险的潜艇:

Public Sub clear()

Application.SendKeys "^a", True
Application.SendKeys "{delete}", True

End Sub

万一你无法解决;它向应用程序发送ctrl+aDel,并具有清除当时光标周围的任何内容的效果。

我通过键入在即时窗口中使用它,即时窗口clear中的所有内容都被删除。

正如您可能知道的那样,这个 Sub 非常危险并且相对容易意外调用。因此,我希望它在从即时窗口调用时运行

  • 不是来自另一个子
  • 不是来自表单控件
  • 不是来自 ActiveX(虽然这实际上只是一个子)
  • 不是来自用户调用(通过开发人员/宏选项卡)

而且也不是来自任何其他来源(我已经列出了所有这些,因为我认为即使您不能直接判断它是由即时窗口调用的,您也可以通过排除其他选项来间接判断)

这可能以编程方式进行吗?理想情况下,我只想在我的clear()sub 开始时进行一个简单的布尔检查,告诉它什么都不做,除非被即时窗口调用。


注意

一种方法可能是通过使用调用堆栈ctrl+L打开对话框),因为我注意到立即调用在堆栈中没有留下任何痕迹,而 subs 调用clear()被列出,因此可以排除。但我不确定如何通过 VBA 访问它

4

3 回答 3

1

一个简单的解决方案是添加一个参数

Public Sub clear(sCaller As String)

If sCaller = "Immediate" Then
    Application.SendKeys "^a", True
    Application.SendKeys "{delete}", True
End If

End Sub

这也可能不是您想要的,但显然可以将风险降到最低

于 2017-05-22T10:17:38.137 回答
0

我知道这不是您问题的答案,但是如果您想“清除”您的即时窗口,这就是我使用的:

Sub clear()
For i = 0 To 100
    Debug.Print ""
Next i
End Sub
于 2017-05-22T09:18:57.433 回答
0

我找到了一种结合了一些想法的方法:

Public Sub clear(Optional s As Variant)

If TypeName(Application.Caller) = "Error" And IsMissing(s) = False Then
'Do code
End If

End Sub

正在发生的事情是,如果从范围(仅限函数)或按钮调用 sub,那么这将被TypeName测试捕获,因为它们将分别返回RangeString。错误选项是立即窗口、Sub 或用户调用。额外的参数不能由用户给出,因此被排除在外。最后,我们希望子调用不会包含参数。

sVariant这样您就可以在即时窗口中输入,clear whatever而不必watever输入"(表示文本)。

显然可以通过适当的论点变得更安全。显然,这并不理想,因为希望这个词本来就是要显示的!当然,它也不能真正回答这个问题。

于 2017-05-22T11:02:50.550 回答