Рассмотрим XSLT , специализированный язык для преобразования XML файлов, который можно использовать с его функцией document()
для объединения всех XML-файлов в каталоге. Затем импортируйте полученный преобразованный файл как один документ в Excel. Office VBA может запускать XSLT 1.0 с библиотекой MS XML.
Ниже предполагается, что точная структура сохраняется во всех XML файлах (независимо от повторяющихся элементов), где каждый документ отображается на root уровень <MFK_XML>
. Добавьте к приведенным ниже <xsl:copy-of ...>
строкам для каждого документа. Если у вас есть сотни, рассмотрите возможность создания XSLT-документа в al oop с VBA, Python, et c. Если файлы относительно малы по сравнению с опубликованными, XSLT является жизнеспособным решением, но имеет ограничения памяти.
XSLT (сохранить как .xsl, специальный файл * xml)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/MFK_XML">
<MFK_XML>
<xsl:copy-of select="document('First.xml')/MFK_XML/*" />
<xsl:copy-of select="document('Second.xml')/MFK_XML/*" />
<xsl:copy-of select="document('Third.xml')/MFK_XML/*" />
<!-- ADD: <xsl:copy-of select="document('XXXX.xml')/MFK_XML/*" /> -->
</MFK_XML>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
VBA (не требуется l oop)
Sub XSLTransform()
On Error GoTo ErrHandle
' ENABLE Microsoft XML, v#.# IN REFERENCES
Dim xmldoc As New MSXML2.DOMDocument60, xslDoc As New MSXML2.DOMDocument60
Dim newDoc As New MSXML2.DOMDocument60
Dim xWb As Workbook
' LOAD XML AND XSL FILES
xmldoc.async = False
xmldoc.Load "C:\Path\To\Any.xml"
xslDoc.async = False
xslDoc.Load "C:\Path\To\Script.xsl"
xslDoc.setProperty "AllowDocumentFunction", True
' TRANSFORM XML
xmldoc.transformNodeToObject xslDoc, newDoc
newDoc.Save "C:\Path\To\Transformed.xml"
Set xWb = Workbooks.OpenXML("C:\Path\To\Transformed.xml")
xWb.SaveAs "C:\Path\To\Final.xlsx"
xWb.Close False
ExitHandle:
Set xmldoc = Nothing: Set xslDoc = Nothing: Set newDoc = Nothing
Set xWb = Nothing
Exit Sub
ErrHandle:
MsgBox Err.Number & " - " & Err.Description, vbCritical
Resume ExitHandle
End Sub