《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴"实战",并做"战术总结",以便大家能很好的应用。教程的目的是要求大家在实际工作中分发VBA程序,写好的程序可以升级。本套教程共三册三十个专题,本讲的内容是VBA高级应用30例应用6 第5部分:5 利用VBA从XML文件中导出数值数据

【分享成果,随喜正能量】我们能在生时多做善事,则临死何惧?我们能在平日贡献社会,则虽死犹生。每一个在你的生命里出现的人,都有原因,喜欢你的人给了你温暖和勇气,你喜欢的人让你学会了爱和自持,你不喜欢的人教会你宽容与尊重,不喜欢你的人让你自省与成长。
应用6 第5部分:5 利用VBA从XML文件中导出数值数据
这部分开始我们深入讲解这个应用:如何利用VBA操作XML文件,我给大家介绍的有三部分内容,一是如何导出数值数据,二是如何修改工具栏,三是如何导出工作表中的图片。可以说,这部分内容值得深入研究的还很多,我给大家展示的只是很少的一部分而已,希望有兴趣的朋友能深入地研究。我们先来研究如何导出数值数据。
如之前讲解的手工修正XML文件的方法,利用VBA处理XML文件也同样需要以下几个步骤:
a)解压缩.xlsx或.xlsm文件
b) 提取适当的XML文件
c)将XML文件写回文件夹结构
d)把文件还原
这里,我将利用一个类模块来完成主要的工作;同时为了处理XML文件,我们还要做如下的引用:

本专题提供的实例应用程序如下:
-
本专题利用到的文件:高级应用06文件夹-2
-
高级应用06-2.xlsm
-
示例1.xlsm
-
示例1和示例2的备份(文件夹,用于原始文件的恢复)
目的:在上述的"示例1.xlsm"文件中有名称为"mySheet"的工作表,这个工作表中有很多的数据,我们要把这些数据导出到程序文件"高级应用06-2.xlsm"的"sheet1"工作表中。
一般情况下,这种操作是复制+粘贴,如果应用VBA对工作表的操作,方法是多种多样的,在我之前的教程中有讲解,本专题的内容是利用VBA对XML文件进行操作获得导出的数据,这里我们只给大家数值数据的导出代码,操作的是工作表的xml文档,对于其他的操作没有展开,大家可以自己研究利用styles.xml文档。

为了实现我们的目的,我们按下面的步骤:
1) 解压.xlsx或.xlsm文件(类模块):
Public Sub UnzipFile()
Dim FSO As Object
Dim oShellApp As Object
Set FSO = CreateObject("scripting.filesystemobject")
'从源文件的位置派生要解压缩到的文件夹,FolderName(类属性)
XMLFolderRoot = FolderName
'在与sourcefile相同的文件夹中创建一个专用解压缩文件夹
On Error Resume Next
'删除所有以前存在的文件夹
FSO.deletefolder XMLFolderRoot & "*", True
Kill XMLFolderRoot & "*.*"
On Error GoTo 0
'创建普通文件夹
If FolderExists(XMLFolderRoot) = False Then
MkDir XMLFolderRoot
End If
XLFolder = XMLFolderRoot & "xl\"
Set oShellApp = CreateObject("Shell.Application")
'将文件复制到新创建的文件夹中
oShellApp.Namespace(XMLFolderRoot).CopyHere oShellApp.Namespace(SourceFile).items
On Error Resume Next
'清理临时文件夹
FSO.deletefolder Environ("Temp") & "\Temporary Directory*", True
Set oShellApp = Nothing
Set FSO = Nothing
Exit Sub
End Sub
代码截图:
2)获取属于特定工作表的xml文件信息(类模块)
使用OpenXML包时最基本的操作之一是操作文件中工作表的XML文档。当然,我们希望根据一定的信息从包中提取正确的XML:工作表的名称。下面显示的代码提取适当的rId(关系标识符)属性值,该属性值列在该文件的"工作表"节点中的文件workbook.xml中。
这个操作我将利用两段代码来完成,首先在"workbook.xml"文件中获得指定工作表的"r:id"值;例如本专题给的例子是从工作表"mySheet"中导出数据,那么首先要获得该工作表的"rid"为"rid3",然后找出哪个xml文件属于该Id,程序中获得的文件名称是"worksheets/sheet3.xml".(当然,第二个步骤也可以使用另一种方法:获取属于特定rid的xml文件,这个方法在我提供的程序文件中有:Function GetSheetNameFromId)。我们看下面的两段代码:
Private Function GetSheetIdFromSheetName(sSheetName) As String
'得到rid
Dim oXMLDoc As MSXML2.DOMDocument
Dim oXMLNode As MSXML2.IXMLDOMNode
Dim oXMLNodeList As MSXML2.IXMLDOMNodeList
If mvXLFolder <> "" And Sheet2Change <> "" Then
Set oXMLDoc = New MSXML2.DOMDocument
oXMLDoc.Load XLFolder & "workbook.xml"
Set oXMLNodeList = oXMLDoc.SelectNodes("/workbook/sheets/sheet")
For Each oXMLNode In oXMLNodeList
If oXMLNode.Attributes.getNamedItem("name").NodeValue = sSheetName Then
GetSheetIdFromSheetName = oXMLNode.Attributes.getNamedItem("r:id").NodeValue
Exit Function
End If
Next
End If
End Function
End If
End Function
代码的截图:


代码的讲解:在本例子中,上述第一段代码得到的返回值是"rid3",第二段代码得到的返回值是:"worksheets/sheet3.xml"。
3)提取XML文件(标准模块)
下面的过程从解压缩的文件夹中提取xml文件:
Public Function GetXMLFromFile(sFileName As String) As String
Dim oXMLDoc As MSXML2.DOMDocument
If Len(XLFolder) = 0 Then
GetXMLFromFile = ""
Else
Set oXMLDoc = New MSXML2.DOMDocument
oXMLDoc.Load XLFolder & sFileName
GetXMLFromFile = oXMLDoc.XML
Set oXMLDoc = Nothing
End If
End Function
代码的截图:

4)将XML文件中的信息导出到指定文件中(类模块)
下面的函数是将XML文件中的信息导出到程序文件中的Sheet1工作表中:
Function WriteXML2Sheet(sXML As String)
'填入处理的工作表是sheet1
Dim oNode As MSXML2.IXMLDOMNode
代码的截图:

5)文件的还原(类模块)
下面的代码将压缩文件还原成原始压缩文件。
Public Sub ZipAllFilesInFolder()
Dim oShellApp As Object
Dim sDate As String
Dim sDefPath As String
Dim vFileNameZip As Variant
Dim FSO As Object
Dim lFileCt As Long
代码的部分截图:
我20多年的VBA实践经验,全部浓缩在下面的各个教程中:

