VBA高级应用30例 应用6 第5部分:5 利用VBA从XML文件中导出数值数据

《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实践经验,全部浓缩在下面的各个教程中:

相关推荐
VBA63379 天前
VBA信息获取与处理专题七第二节 网络通信过程的解读
vba
VBA633714 天前
数组与字典解决方案第二十九讲 数组的创建方法小结及回填的注意事项
vba
小妖6661 个月前
excel 怎么在单元格内容自动加上一段文字不能用公式
excel·vba
VBA63371 个月前
VBA之Word应用第五章第五节 Range对象的属性(四)
vba
VBA63371 个月前
VBA信息获取与处理专题七第一节 网络通信基础
vba
yivifu1 个月前
怎样将Word文档中脚注引用后面的空格轻松删除
word·vba
VBA63371 个月前
VBA之Excel应用第五章第四节 变量的生命周期
vba
VBA63371 个月前
VBA中类的解读及应用第三十五讲 类对象的生死轮回----“二师兄”的成长历程之七
vba
SunnyDays10111 个月前
使用 C# 添加、修改和删除 Excel VBA 宏 (无需 Microsoft Office Interop)
c#·excel··vba