' https://analystcave.com/vba-xml-working-xml-files/
Sub ListSheetNames()
' Chemin :
Dim origPath As String
Dim origFich As String
Dim zipPath As String
' Créer une instance de Shell.Application
Dim shellApp As Object
' Ouvrir le fichier .zip comme un fichier ZIP
Dim zip As Object
' Parcourir les éléments pour trouver le dossier "xl"
Dim item As Object
' Parcourir les éléments dans "xl" pour trouver workbook.xml
Dim subItem As Object
' Extraire workbook.xml dans TEMP
Dim xmlFile As String
' Charger le document XML
Dim XDoc As Object
Dim xmlContent As Object
' Collecte des nom des Feuilles
Dim sheetNames As Collection
Dim sheetName As Variant
Dim startPos As Long, endPos As Long
Dim cheminFich As String
' -----------------------------------------------------------------------------
' Chemin du fichier XLSX
origPath = "C:\Users\VotreChemin\LeDossier\"
origFich = "LeFichier.xlsx"
zipPath = origPath & origFich & ".zip"
' Renommer temporairement en .zip
Name origPath & origFich As zipPath
' Créer une instance de Shell.Application
Set shellApp = CreateObject("Shell.Application")
' Ouvrir le fichier .zip comme un fichier ZIP
Set zip = shellApp.Namespace(CStr(zipPath))
' Vérifier si le fichier ZIP a été ouvert correctement
If Not zip Is Nothing Then
' Parcourir les éléments pour trouver le dossier "xl"
For Each item In zip.Items
If item.Name = "xl" Then
' Parcourir les éléments dans "xl" pour trouver workbook.xml
For Each subItem In item.GetFolder.Items
If InStr(subItem.Name, "workbook.xml") > 0 Then
' Extraire workbook.xml dans TEMP
'xmlFile = Environ("TEMP") & "\workbook.xml"
'xmlFile = origPath & CStr(subItem.Name)
xmlFile = Environ("TEMP") & "\" & CStr(subItem.Name)
' Copie effective depuis le ZIP vers TEMP
shellApp.Namespace(Environ("TEMP")).CopyHere subItem
' CopyHere fait l’extraction asynchrone, donc il faut attendre que le fichier apparaisse dans TEMP avant de le lire :
Do While Dir(xmlFile) = ""
DoEvents
Loop
' Lire le contenu XML
Set XDoc = CreateObject("MSXML2.DOMDocument")
XDoc.async = False: XDoc.validateOnParse = False
'XDoc.Load (ThisWorkbook.Path & "\workbook.xml")
'XDoc.Load (origPath & CStr(subItem.Name))
XDoc.Load (xmlFile)
'Get Document Elements
Set xmlContent = XDoc.DocumentElement
'MsgBox xmlContent.XML
Exit For
End If
Next subItem
Exit For
End If
Next item
End If
' Extraire les noms des feuilles
Set sheetNames = New Collection
If Len(xmlContent.XML) > 0 Then
startPos = InStr(1, xmlContent.XML, "<sheet name=""")
Do While startPos > 0
startPos = startPos + Len("<sheet name=""")
endPos = InStr(startPos, xmlContent.XML, """")
sheetName = Mid(xmlContent.XML, startPos, endPos - startPos)
sheetNames.Add sheetName
startPos = InStr(endPos, xmlContent.XML, "<sheet name=""")
Loop
End If
' Afficher les noms des feuilles
For Each sheetName In sheetNames
Debug.Print sheetName
Affichage = Affichage & (i + 1) & " - " & sheetName & vbCrLf
Next sheetName
' Remettre le fichier à son nom d'origine
Name zipPath As origPath & origFich
' Resultat
MsgBox Affichage
Set XDoc = Nothing ' Libère le XML
If Dir(xmlFile) <> "" Then Kill xmlFile
End Sub