【问题标题】:Adding KeyBindings with CommandParameter to call a sub()使用 CommandParameter 添加 KeyBindings 以调用 sub()
【发布时间】:2020-02-06 05:13:39
【问题描述】:

我想添加将调用带有参数的子的 KeyBindings。例如:

Sub dummy(text As String)
    MsgBox (text)
End Sub

Dim kbNew As KeyBinding
Set kbNew = KeyBindings.Add(KeyCategory:=wdKeyCategoryCommand, Command:="dummy", KeyCode:=BuildKeyCode(wdKeyControl, wdKeyAlt, wdKeyQ), CommandParameter:="show me")

这不起作用。但是当我使用 MS 文档中的示例时,它正在工作:

Set kbNew = KeyBindings.Add(KeyCategory:=wdKeyCategoryCommand, Command:="FontSize", KeyCode:=BuildKeyCode(wdKeyControl, wdKeyAlt, wdKeyQ), CommandParameter:="8")

调用不带参数的 sub 也可以:

Sub dummy()
    MsgBox ("show me")
End Sub
Set kbNew = KeyBindings.Add(KeyCategory:=wdKeyCategoryCommand, Command:="dummy", KeyCode:=BuildKeyCode(wdKeyControl, wdKeyAlt, wdKeyQ))

【问题讨论】:

    标签: vba parameters ms-word key-bindings


    【解决方案1】:

    只有内置命令支持传递命令参数。对于“普通”宏,这是不可能的。

    从逻辑上看问题时,按下应用字体大小 8 的组合键是静态的 - 它始终应用字体大小 8 而不是其他任何东西。因此,按下组合键来运行自定义过程也本质上是静态的——组合键应该如何处理可变输入?没有动态传递任何东西的设施。

    如果组合键调用的过程需要处理变量信息,则需要将其存储在某个地方并且宏可以读取它。例如,这可能是文档中书签或内容控件中的文本、文档Variable 的值或CustomXMLPart 中的节点,或者外部存储在文件或注册表中的内容。或者让宏显示InputBox

    【讨论】:

    • 感谢您的回答。您对动态变量是正确的。但就我而言,我想传递诸如“标题 1”之类的静态信息。甚至尺寸参数中的“8”也必须保存在某个地方。我正在使用不同的静态参数调用相同的过程(子)。解决方案是编写大量的 subs 来包装不同的参数。它有效,但感觉很脏 - DRY 原则。
    • @iki 是的,就是这样。 FWIW,如果您只想应用一种样式,您可以为每种样式分配一个键绑定,而不是编写一个子来应用样式...
    • 谢谢,我已经知道了。这不是那么简单。我需要为每个键绑定“应用样式并运行一些重复代码”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2013-09-08
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多