Option Explicit
Sub testFX()
Dim ListSheet, FilePath$
'adapter le chemin ici ou injecter un dialog getopenfilename
FilePath$ = "C:\Users\patricktoulon\Desktop\Classeur1.xlsx"
ListSheet = ListSheetOnClosedFileXML(FilePath)
MsgBox Join(ListSheet, vbCrLf)
End Sub
Function ListSheetOnClosedFileXML(lPath As String)
Dim Archiveur, fichierZiP$, fichierxml$, xDoc As Object, noeud, TbL(), A&, X&
ReDim Preserve TbL(1 To 300)
'les chemins de fichiers
fichierZiP = Left(lPath, InStrRev(lPath, ".")) & "zip"
fichierxml = Mid(lPath, 1, InStrRev(lPath, "\")) & "workbook.xml"
'on les supprimes si ils existent
If Dir(fichierZiP) <> "" Then Kill fichierZiP
Do While Dir(fichierZiP) <> "": DoEvents: Loop
If Dir(fichierxml) <> "" Then Kill fichierxml
Do While Dir(fichierxml) <> "": DoEvents: Loop
'on copie le fichier Excel(xlsx , xlsm , xlt , xlb) en format zip
FileCopy lPath, fichierZiP
Do While fichierZiP = "": DoEvents: Loop
'on ouvre un object shell.application
Set Archiveur = CreateObject("Shell.Application")
DoEvents
'on sort en accès direct le fichier voulu en l'occurrence ici le workbook.xml qui se trouve dans
'fichierZiP & "\xl\workbook.xml"
With Archiveur
.Namespace(ThisWorkbook.Path).copyhere .Namespace(fichierZiP & "\xl\").Items.Item("workbook.xml")
End With
' Charger le XML
Set xDoc = CreateObject("MSXML2.DOMDocument.6.0")
xDoc.async = False
xDoc.Load fichierxml
' Ajouter espace de noms pour les feuilles
xDoc.SetProperty "SelectionNamespaces", "xmlns:ss='http://schemas.openxmlformats.org/spreadsheetml/2006/main'"
' Parcourir les feuilles en mode Xpath
For Each noeud In xDoc.SelectNodes("//ss:sheet")
A = noeud.getattribute("sheetId")
TbL(A) = noeud.Attributes.getNamedItem("name").Text
If A > X Then X = A
Next
ReDim Preserve TbL(1 To X)
'on supprime zip et xml on en a plus besoin
If Dir(fichierZiP) <> "" Then Kill fichierZiP
If Dir(fichierxml) <> "" Then Kill fichierxml
ListSheetOnClosedFileXML = TbL
End Function