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

相关推荐
VBA63373 天前
VBA 64位API声明语句第025讲
vba
Access开发易登软件5 天前
Access 导入 Markdown 表格:把文档里的数据写进表
前端·html·vba·markdown·access开发
zhongwei22811 天前
vba将一个文件夹的内容复制到另外一个文件夹的函数,若存在则是否覆盖的参数。复制前检查源文件夹是否存在。若目标文件夹不存在,则新建
前端·vba
Access开发易登软件20 天前
Access 复杂业务计算,SQL 写在 VBA 还是存储过程?
microsoft·vba·access·access开发
SunnyDays10111 个月前
如何使用 Python 添加和编辑 Excel VBA 宏(无需安装 Excel)
开发语言·python·excel·vba
taller_20001 个月前
【005】PiE 与传统 VBA 的核心区别
python·vba·pie·py
VBA63372 个月前
VBA密匙暗码加密技术
vba
VBA63372 个月前
VBA代码加密解决方案目录及说明
vba
VBA63372 个月前
如何学习VBA之2.1.3 VBA的错误处理
vba