将事件添加到UI按钮单击

时间:2014-02-19 15:59:14

标签: 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>

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

Sub foo_eventhandler(control As IRibbonControl)

End Sub

注意:

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

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

杰森

1 个答案:

答案 0 :(得分:3)

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

对于开发人员来说,更好的方法是使用最优秀的CustomUIEditor for Word和Excel。 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>

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

Sub foo_eventhandler(control As IRibbonControl)
    MsgBox "Hooray! for " & control.Tag
End Sub