【发布时间】:2017-05-22 08:49:51
【问题描述】:
我只想从即时窗口运行一些潜艇,比如这个有点冒险的潜艇:
Public Sub clear()
Application.SendKeys "^a", True
Application.SendKeys "{delete}", True
End Sub
万一你无法解决;它将 ctrl+a 和 Del 发送到应用程序,并具有清除当时光标周围的任何内容的效果。
我通过输入clear 在即时窗口中使用它,即时窗口中的所有内容都会被删除。
正如您可能知道的那样,这个 Sub 非常危险并且相对容易意外调用。因此,我希望它在从即时窗口调用时运行 only
- 不是来自另一个子
- 不是来自表单控件
- 不是来自 ActiveX(虽然它实际上只是一个子)
- 不是来自用户调用(通过开发人员/宏选项卡)
也不是来自任何其他来源(我已经列出了所有这些,因为我认为即使您不能直接判断它是由即时窗口调用的,您也可以通过排除其他来源来间接判断选项)
这可能以编程方式进行吗?理想情况下,我只想在我的 clear() 子程序的开头进行一个简单的布尔检查,告诉它什么都不做,除非被即时窗口调用。
注意
一种方法可能是通过使用 调用堆栈(ctrl+L 打开对话框),我立即注意到调用不会在堆栈中留下任何痕迹,而调用clear() 的子程序会被列出,因此可以排除。但我不确定如何通过 VBA 访问它
【问题讨论】:
-
您说“这个 Sub 非常危险,并且相对容易意外调用。”所以我将函数重命名为例如
cleardebug所以它不同于listbox.clear()之类的任何东西,并且不会再意外调用它。不应该有人不小心调用了一个名为cleardebug的函数,无法想象这种情况会意外发生。 -
@Peh 我同意它可能对 vba 调用有所帮助,但我不完全相信有两个原因;首先,我能想到的意外调用的主要形式只是在运行宏窗口中单击了错误的宏——更改名称并不能解决这个问题。其次,键入
cleardebug感觉比手动执行 ctrl+a+del 更费力(显然您可以选择一个不同的名称,但要找到足够明显的东西以令人难忘但又足够模糊以至于在 VBA 中没有其他含义,并且足够简洁打字很难)! -
好吧,让我说一下,网络上有大约 1000 个关于如何清除即时窗口的讨论、操作方法和教程,以及针对该问题的大约 10 种不同的解决方案。如果有一个解决方案,比如将即时窗口检测为函数调用者(或者像你建议的相反),我想有人已经找到了。我认为除了讨论已经指出的这些之外,没有更好的解决方案。
-
@Peh 有效点,但是一个新的问题措辞可能会吸引一些不同的想法,我发现在我所做的研究中没有提到这种方法(几乎可以肯定是因为这是一种徒劳的方法,但可能是因为它没有被考虑)
-
我一直使用 MZ 工具上提供的按钮来清除即时窗口 - 不幸的是不再免费了。 mztools.com
标签: vba excel immediate-window