OFFICE2007之后使用了OpenXml标准(伟大的改变),定制文本级的Ribbon可以通过修改压缩包内的xml文件来实现。
先学习一下VBA中操作XML的方法
先引用Microsoft XML V6.0,对应的文件是msxml6.dll。前期绑定,方便使用智能提示。
一、DOM方式创建一个XML文件:内容是自定义Ribbon的一个简单框架。文件保存在桌面。
1 Sub CreateXmlFile() 2 3 '创建文档对象模型 4 Dim xmldoc As New DOMDocument 5 6 '创建根节点,XML文档有且必须仅有一个根节点。 7 Dim root As IXMLDOMElement 8 'http://schemas.microsoft.com/office/2006/01/customui 2007版本使用的命名空间 9 'http://schemas.microsoft.com/office/2009/07/customui 2010版本使用的命名空间 10 Set root = xmldoc.createElement("customUI") 11 root.setAttribute "xmlns", "http://schemas.microsoft.com/office/2009/07/customui" 12 Set xmldoc.DocumentElement = root '指定根节点 13 14 'ribbon元素 15 Dim xmlribbon As IXMLDOMElement 16 Set xmlribbon = xmldoc.createElement("ribbon")
17 root.appendChild xmlribbon 18 19 'tabs元素 20 Dim xmltabs As IXMLDOMElement 21 Set xmltabs = xmldoc.createElement("tabs") 22 xmlribbon.appendChild xmltabs 23 24 'tab元素 25 Dim xmltab As IXMLDOMElement 26 Set xmltab = xmldoc.createElement("tab") 27 xmltab.setAttribute "id", "CustomTab" 28 xmltab.setAttribute "label", "自定义标签" 29 xmltabs.appendChild xmltab 30 31 'group元素 32 Dim xmlgroup As IXMLDOMElement 33 Set xmlgroup = xmldoc.createElement("group") 34 xmlgroup.setAttribute "id", "CustomGroup" 35 xmlgroup.setAttribute "label", "自定义分组" 36 xmltab.appendChild xmlgroup 37 38 'button元素,并设置button的属性 39 Dim xmlbutton As IXMLDOMElement 40 Set xmlbutton = xmldoc.createElement("button") 41 xmlbutton.setAttribute "id", "btn" 42 xmlbutton.setAttribute "label", "插入公司名称" 43 xmlbutton.setAttribute "size", "large" 44 xmlbutton.setAttribute "onAction", "InsertCompanyName" 45 xmlgroup.appendChild xmlbutton 46 47 '文件保存到桌面 48 xmldoc.Save ("C:UsersstoneDesktop1.xml") 49 End Sub
下面是创建出来xml文件内容。创建出的文件标签不能自动换行。只好手工排版。
1 <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> 2 <ribbon> 3 <tabs> 4 <tab id="CustomTab" label="自定义标签"> 5 <group id="CustomGroup" label="自定义分组"> 6 <button id="btn" label="插入公司名称" size="large" onAction="InsertCompanyName"/> 7 </group> 8 </tab> 9 </tabs> 10 </ribbon> 11 </customUI>
二、对已有的XML文件添加新的元素:给group添加一个menu元素,menu元素下添加两个button子元素
1 Sub AppendXmlFile() 2 3 Dim xmldoc As New DOMDocument 4 5 Dim b As Boolean 6 '加载xml文件,成功返回true 7 b = xmldoc.Load("C:UsersstoneDesktop1.xml") 8 If Not b Then Exit Sub 9 10 ' Dim xmlgroups As IXMLDOMNodeList 11 ' Dim xmlgroup As IXMLDOMElement 12 ' Set xmlgroups = xmldoc.getElementsByTagName("group") '所有的group元素,返回一个集合 13 ' Set xmlgroup = xmlgroups(0) '取集合中第一个group元素 14 15 Dim xmlgroup As IXMLDOMNode 16 'Xpath 选取第一个group节点 17 Set xmlgroup = xmldoc.SelectSingleNode("//tab[@id='CustomTab']/group[0]") 18 19 'menu元素 20 '为了避免产生xmlns="",要添加的节点的namespaceURI需要和父节点一致。下同 21 Dim xmlmenu As IXMLDOMElement 22 Set xmlmenu = xmldoc.createNode(NODE_ELEMENT, "menu", xmlgroup.NamespaceURI) 23 xmlmenu.setAttribute "id", "CustomMenu" 24 xmlgroup.appendChild xmlmenu 25 26 'button元素 27 Dim xmlbutton1 As IXMLDOMElement 28 Set xmlbutton1 = xmldoc.createNode(NODE_ELEMENT, "button", xmlmenu.NamespaceURI) 29 xmlbutton1.setAttribute "id", "btn1" 30 xmlbutton1.setAttribute "label", "按钮一" 31 32 Dim xmlbutton2 As IXMLDOMElement 33 Set xmlbutton2 = xmldoc.createNode(NODE_ELEMENT, "button", xmlmenu.NamespaceURI) 34 xmlbutton2.setAttribute "id", "btn2" 35 xmlbutton2.setAttribute "label", "按钮二" 36 37 xmlmenu.appendChild xmlbutton1 38 xmlmenu.appendChild xmlbutton2 39 40 Debug.Print xmldoc.XML 41 xmldoc.Save ("C:UsersstoneDesktop1.xml") 42 43 End Sub
下面是添加新节点后的XML文件内容
1 <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> 2 <ribbon> 3 <tabs> 4 <tab id="CustomTab" label="自定义标签"> 5 <group id="CustomGroup" label="自定义分组"> 6 <button id="btn" label="插入公司名称" size="large" onAction="InsertCompanyName"/> 7 <menu id="CustomMenu"> 8 <button id="btn1" label="按钮一"/> 9 <button id="btn2" label="按钮二"/> 10 </menu> 11 </group> 12 </tab> 13 </tabs> 14 </ribbon> 15 </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