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对象.有人有什么建议吗?
贾森
我认为您遇到了问题,因为您是通过选项 -> 自定义功能区 -> 导入/导出导入 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)