将事件添加到UI按钮单击

jas*_*son 5 vba ms-word ms-office word-vba

我在Microsoft Word中创建了一个自定义功能区,但是我在将事件附加到功能区中的按钮时遇到问题.以下是我的代码:

UI XML:

<mso:cmd app="Word" dt="1" />
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon startFromScratch="true" >
    <tabs>
      <tab id="CustomTab" label="MyTasks" >
           <group id="Group1" label="Details Labels">
             <menu id="Menu1" label="Details" size="large">
                <menu id="Menu21" label="Dates">
                   <button id="my_date" onAction="foo_eventhandler" label="Some Date" />
                </menu>
             </menu>
         </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
Run Code Online (Sandbox Code Playgroud)

然后我在Modules/NewMacros VBA代码中有以下VBA代码:

Sub foo_eventhandler(control As IRibbonControl)

End Sub
Run Code Online (Sandbox Code Playgroud)

注意:

我通过打开Word - >转到文件 - >选项 - >自定义功能区 - >导入/导出来导入XML.然后我选择我的XML文件并导入它.

但是,当运行此代码时,我收到错误"Argument Not Optional".如果我运行相同的代码没有"控制为IRibbonControl"它没关系,但我需要能够获得Sender对象.有人有什么建议吗?

贾森

Cub*_*ase 3

我认为您遇到了问题,因为您是通过选项 -> 自定义功能区 -> 导入/导出导入 XML 代码。此方法实际上适用于希望永远看不到“页面布局”选项卡并将其隐藏的一般用户。他们可以导出自定义色带并将其导入到具有相同布局的新机器上。

对于开发人员来说,更好的方法是使用最优秀的 Word 和 Excel CustomUIEditor。 http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2009/08/07/7293.aspx

您需要执行的步骤是创建正常的启用宏的 Word 模板(.dotm)文件并保存它。然后在 CustomUIEditor 中打开该文件并粘贴 XML(减去第一行)。我用另一个按钮扩展了您的 XML 代码,并将标签添加到 XML 中,以便 VBA 知道按下的是哪个按钮。

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon startFromScratch="false" >
    <tabs>
      <tab id="CustomTab" label="MyTasks" >
           <group id="Group1" label="Details Labels">
             <menu id="Menu1" label="Details" size="large">
                <menu id="Menu21" label="Dates">
                   <button id="my_date_1" onAction="foo_eventhandler" label="Some Date" tag="Date1" />
                   <button id="my_date_2" onAction="foo_eventhandler" label="Some Other Date" tag="Date2" />
                </menu>
             </menu>
         </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
Run Code Online (Sandbox Code Playgroud)

我通常将功能区代码放在Ribbon模块中。在回调代码中,您只需要使用.Tag输入control变量的属性来知道按下了哪个按钮,您将看到与 XML 中的标记相对应的按钮。IE:

Sub foo_eventhandler(control As IRibbonControl)
    MsgBox "Hooray! for " & control.Tag
End Sub
Run Code Online (Sandbox Code Playgroud)