【发布时间】:2017-08-14 00:52:36
【问题描述】:
我在 Excel 中构建了一个表单。它由 3 个命令按钮和一个包含复选框的框架组成。复选框在userform_initialize 处根据 Excel 工作表中的表格动态填充(这个想法很容易让用户自定义)。框架的原因是可能有很多复选框,我希望用户能够滚动它们。
我现在的目标是为表单创建键盘快捷键。我卡住的地方是我不能蛮力为每个复选框编写KeyDown 处理程序,因为我不知道哪些复选框会存在。我意识到如果我可以在表单级别拥有事件处理程序也会更好。谷歌搜索找到了表单的 KeyPreview 属性。不幸的是,VBA IDE 中的属性窗口没有显示它,当我尝试通过将Me.KeyPreview = True 设置为userform_initialize 以编程方式访问它时,VBA 抛出编译错误:“找不到方法或数据成员” - 我期望给出的它不在属性窗口中,但值得一试。
我觉得我显然遗漏了一些东西,所以我想在花时间学习如何编写然后将表单完全重写为 MSDN 示例代码中的类之前先问一下: https://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview(v=vs.110).aspx。 我有那么幸运吗?
我承认我的 VBA 知识有限,我正在寻求扩展它。任何我应该红色的一般概念或上下文将不胜感激。
更新
我现在正在考虑GetAsyncKeyState 和Application.Onkey。
据我了解,GetAsyncKeyState 仅在无限 DoEvents 循环中有效。我尝试启动一个,希望表单仍能加载,但当然没有——我陷入了困境。
Application.Onkey 的问题是我无法将事件函数分配给用户表单模块中的键。这让我感到困惑,因为其他事件处理程序可以进入用户表单模块。事实上,我会把它放在Userform_Initialize 过程中。是不是因为不是表单事件而是应用事件?
编辑
我似乎有一些可行的方法,但是对于此处描述的奇怪问题: Event handling class will not fire unless I use a breakpoint when initializing form 谢谢@UGP
【问题讨论】:
-
该链接适用于 VB.NET 而不是 VBA。它不能简单地应用于它。
KeyPreview只是 Access VBA 中的一种方法,在 Excel 中不起作用。 -
也许this可以帮到你。
-
非常感谢@UGP,我一直抱有希望直到最后。海报说“
KeyPress是一个特例——通过在表单级别打开KeyPreview,我可以在表单的Form_KeyPress事件中捕获mLastKeyPressedAscii所需的KeyAscii,并传递它”。看来我又回到了第一方?另外,上面发布的更新。