OFFICE2007之后使用了OpenXml标准(伟大的改变),定制文本级的Ribbon可以通过修改压缩包内的xml文件来实现。
先学习一下VBA中操作XML的方法
先引用Microsoft XML V6.0,对应的文件是msxml6.dll。前期绑定,方便使用智能提示。
一、DOM方式创建一个XML文件:内容是自定义Ribbon的一个简单框架。文件保存在桌面。
Sub CreateXmlFile() '创建文档对象模型
Dim xmldoc As New DOMDocument '创建根节点,XML文档有且必须仅有一个根节点。
Dim root As IXMLDOMElement
'http://schemas.microsoft.com/office/2006/01/customui 2007版本使用的命名空间
'http://schemas.microsoft.com/office/2009/07/customui 2010版本使用的命名空间
Set root = xmldoc.createElement("customUI")
root.setAttribute "xmlns", "http://schemas.microsoft.com/office/2009/07/customui"
Set xmldoc.DocumentElement = root '指定根节点 'ribbon元素
Dim xmlribbon As IXMLDOMElement
Set xmlribbon = xmldoc.createElement("ribbon")
root.appendChild xmlribbon 'tabs元素
Dim xmltabs As IXMLDOMElement
Set xmltabs = xmldoc.createElement("tabs")
xmlribbon.appendChild xmltabs 'tab元素
Dim xmltab As IXMLDOMElement
Set xmltab = xmldoc.createElement("tab")
xmltab.setAttribute "id", "CustomTab"
xmltab.setAttribute "label", "自定义标签"
xmltabs.appendChild xmltab 'group元素
Dim xmlgroup As IXMLDOMElement
Set xmlgroup = xmldoc.createElement("group")
xmlgroup.setAttribute "id", "CustomGroup"
xmlgroup.setAttribute "label", "自定义分组"
xmltab.appendChild xmlgroup 'button元素,并设置button的属性
Dim xmlbutton As IXMLDOMElement
Set xmlbutton = xmldoc.createElement("button")
xmlbutton.setAttribute "id", "btn"
xmlbutton.setAttribute "label", "插入公司名称"
xmlbutton.setAttribute "size", "large"
xmlbutton.setAttribute "onAction", "InsertCompanyName"
xmlgroup.appendChild xmlbutton '文件保存到桌面
xmldoc.Save ("C:\Users\stone\Desktop\1.xml")
End Sub
下面是创建出来xml文件内容。创建出的文件标签不能自动换行。只好手工排版。
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon>
<tabs>
<tab id="CustomTab" label="自定义标签">
<group id="CustomGroup" label="自定义分组">
<button id="btn" label="插入公司名称" size="large" onAction="InsertCompanyName"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
二、对已有的XML文件添加新的元素:给group添加一个menu元素,menu元素下添加两个button子元素
Sub AppendXmlFile() Dim xmldoc As New DOMDocument Dim b As Boolean
'加载xml文件,成功返回true
b = xmldoc.Load("C:\Users\stone\Desktop\1.xml")
If Not b Then Exit Sub ' Dim xmlgroups As IXMLDOMNodeList
' Dim xmlgroup As IXMLDOMElement
' Set xmlgroups = xmldoc.getElementsByTagName("group") '所有的group元素,返回一个集合
' Set xmlgroup = xmlgroups(0) '取集合中第一个group元素 Dim xmlgroup As IXMLDOMNode
'Xpath 选取第一个group节点
Set xmlgroup = xmldoc.SelectSingleNode("//tab[@id='CustomTab']/group[0]") 'menu元素
'为了避免产生xmlns="",要添加的节点的namespaceURI需要和父节点一致。下同
Dim xmlmenu As IXMLDOMElement
Set xmlmenu = xmldoc.createNode(NODE_ELEMENT, "menu", xmlgroup.NamespaceURI)
xmlmenu.setAttribute "id", "CustomMenu"
xmlgroup.appendChild xmlmenu 'button元素
Dim xmlbutton1 As IXMLDOMElement
Set xmlbutton1 = xmldoc.createNode(NODE_ELEMENT, "button", xmlmenu.NamespaceURI)
xmlbutton1.setAttribute "id", "btn1"
xmlbutton1.setAttribute "label", "按钮一" Dim xmlbutton2 As IXMLDOMElement
Set xmlbutton2 = xmldoc.createNode(NODE_ELEMENT, "button", xmlmenu.NamespaceURI)
xmlbutton2.setAttribute "id", "btn2"
xmlbutton2.setAttribute "label", "按钮二" xmlmenu.appendChild xmlbutton1
xmlmenu.appendChild xmlbutton2 Debug.Print xmldoc.XML
xmldoc.Save ("C:\Users\stone\Desktop\1.xml") End Sub
下面是添加新节点后的XML文件内容
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon>
<tabs>
<tab id="CustomTab" label="自定义标签">
<group id="CustomGroup" label="自定义分组">
<button id="btn" label="插入公司名称" size="large" onAction="InsertCompanyName"/>
<menu id="CustomMenu">
<button id="btn1" label="按钮一"/>
<button id="btn2" label="按钮二"/>
</menu>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
一个小知识点:
创建子节点时,如果没有指名namespaceURI,在appendchild后,子节点带一个xmlns=""的属性。如果创建子节点时指定namespaceURI等于父节点的URI可以屏蔽这个麻烦,就不会生成xmlns=""了。
DOMDocument的两个方法:
Function selectNodes(queryString As String) As IXMLDOMNodeList
Function selectSingleNode(queryString As String) As IXMLDOMNode
queryString是一个Xpath表达式。
Xpath语法参考W3C网站:http://www.w3school.com.cn/xpath/xpath_syntax.asp