VBA中操作XML
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:\Users\stone\Desktop\1.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:\Users\stone\Desktop\1.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:\Users\stone\Desktop\1.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


浙公网安备 33010602011771号