XL 2016 VBA - Trouver les feuilles d'un classeur fermé

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Solution
Bonjour,
Dans le lien que j'ai fourni je donne des exemples de connections. Tu as la fonction GenereCSTRING qui te permet de créer une connexion sans rien y connaître.

ModuleRequeteurUniversel contient tout ce qui est utile pour jouer avec une base de données que ce soit SQL serveur, Oracle, MySQL, Excel, CSV etc.

GenereCSTRING te retourne le conectionString en fonction du type te base de données à traiter, dans notre cas xls. Notes que des paramètres optionnel permettent de choisir les informations en fonction du type de base. Serveur par exemple sera utile pour SQL serveur, Oracle, MySQL.

VB:
Sub test()
Dim CN As Object, Tables() As String
Set CN = CreateObject("Adodb.connection")
CN.Open GenereCSTRING(Xls...
Bonjour,
Petit update sur les codes de récupération DB des noms de feuilles sur un classeur donné peut-être particulier (en quoi ?)

Avec la méthode @dysorthographie: (une supplémentaire _xlnm)

1757247806010.png


Avec la méthode @patricktoulon: (il en manque)

1757248075212.png

Je vais essayer de simplifier le fichier et le poster.
 
Dernière édition:
Bonjour à tous
comme l'aurent m'a beaucoup plus avec son idée originale
je l'ai refaite 100% vba sans powershell;;
VB:
'********************************************************
'collection fonctions particulières et originales disk Rac 3
'liste des feuilles dans un classeur fermé sur une idée de @laurent950
'auteur :patricktoulon
'version patricktoulon 100% VBA
'********************************************************

Option Explicit

Sub testFX()
    Dim ListSheet, FilePath$
    'adapter le chemin ici ou injecter un dialog getopenfilename
    FilePath$ = "C:\Users\patricktoulon\Desktop\tototo.xlsx"
    ListSheet = ListSheetOnClosedFileXML(FilePath)
    If UBound(ListSheet) > 0 Then MsgBox Join(ListSheet, vbCrLf)
End Sub

Function ListSheetOnClosedFileXML(lPath As String)
    Dim Archiveur, fichierZiP$, fichierxml$, xDoc As Object, noeud, TbL(), A&, FwK
    
    'les chemins de fichiers
    fichierZiP = Replace(lPath, ".xlsx", ".zip")
    fichierxml = Mid(lPath, 1, InStrRev(lPath, "\")) & "workbook.xml"
    
    'on les supprimes si ils existent
    If Dir(fichierZiP) <> "" Then Kill fichierZiP
    If Dir(fichierxml) <> "" Then Kill fichierxml
    
    'on copie le fichier Excel(xlsx , xlsm , xlt , xlb) en format zip
    FileCopy lPath, fichierZiP
    
    'on ouvre un object shell.application
    Set Archiveur = CreateObject("Shell.Application")
    '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
        Set FwK = .Namespace(fichierZiP & "\xl\").Items.Item("workbook.xml")
        If FwK Is Nothing Then 'si le workbook.xml n'est pas trouvé(fichier eventuellement corrompu)
            '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 If
        'copie du fichier dans la destination
        .Namespace(ThisWorkbook.Path).copyhere FwK.Path
    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 = A + 1: ReDim Preserve TbL(1 To A)
        TbL(A) = noeud.Attributes.getNamedItem("name").Text
    Next
    
    '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
 
@patricktoulon,
je ne sais pas ce que tu fait mais ma fonction ne rate aucune feuille
Comment peux-tu en être si sûr ? Le doute est toujours utile, surtout si c'est @Dudu2 qui te met l'embrouille
1757250412880.gif
.

Le mystère est résolu...

Méthode @dysorthographie:
Quand y a du filtre sur une feuille, ça retourne une ou plusieurs (?) valeurs <feuille>_xlnm#_FilterDatabase ou bizarrement <feuille> n'est pas la feuille où se trouve le filtre. C'est pas grave, ça se repère facilement.

Méthode @patricktoulon:
Quand le nom de la feuille contient une valeur numérique elle n'apparait pas.

2 fichiers fournis:
- DB_Tables 2 méthodes.xlsm (Macro pour tester)
- Test Case #4.xlsx (classeur de test)
 

Pièces jointes

Dernière édition:
corrigé pour ado
VB:
Option Explicit
Sub test()
    Dim ListSheet, FilePath$
    'adapter le chemin ici ou injecter un dialog getopenfilename
    FilePath$ = "C:\Users\patricktoulon\Desktop\tototo.xlsx"
    ListSheet = ListSheetOnClosedFile(FilePath)
    If UBound(ListSheet) > 0 Then
        MsgBox Join(ListSheet, vbCrLf)
    Else
        MsgBox "La connection au classeur n'a pas pu lister les feuille du classeur"
    End If
End Sub
Function ListSheetOnClosedFile(lPath As String)
    'patricktoulon collection Ado
    Dim Connection As Object, recordST As Object, TbL(), A&
    Set Connection = CreateObject("ADODB.Connection") ' Créer connexion ADO
    ' Ouvrir connexion (type de connection pour les version superieures a 2003/2007 et +)
    Connection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & lPath & ";" & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    Set recordST = Connection.OpenSchema(20) ' Récupérer la liste des feuilles ' 20 = adSchemaTables
    Do Until recordST.EOF
        'Debug.Print recordST!TABLE_NAME
        If recordST!TABLE_NAME Like "*$*" Then
            A = A + 1
            ReDim Preserve TbL(1 To A)
            TbL(A) = Replace(Replace(recordST!TABLE_NAME, "$", ""), "'", "")
        End If
        recordST.MoveNext
    Loop
    recordST.Close: Connection.Close: Set recordST = Nothing: Set Connection = Nothing
    If A = 0 Then
        ListSheetOnClosedFile = Array() ' on met un tableau vide pour eviter l'erreur dans la sub appelante
    Else
        ListSheetOnClosedFile = TbL
    End If
End Function
j'ai bien les feuilles avec un nombre comme nom et les nom composés
1757253688681.png

il y a un seul bémol par rapport a la xml c'est qu'il ne sont pas dans l'ordre ni d'ajout ni de modif
tandis que la xml ils sont dans l'ordre
 
ok je vais tester

edit:
avec un filtre actif dans un tableau structuré ca le fait pas
avec un filtre sur range ca le fait (ça fait des doublons en fait )
donc pour le ado:
VB:
Option Explicit
Sub test()
    Dim ListSheet, FilePath$
    'adapter le chemin ici ou injecter un dialog getopenfilename
    FilePath$ = "C:\Users\patricktoulon\Desktop\tototo.xlsx"
    ListSheet = ListSheetOnClosedFile(FilePath)
    If UBound(ListSheet) > 0 Then
        MsgBox Join(ListSheet, vbCrLf)
    Else
        MsgBox "La connection au classeur n'a pas pu lister les feuille du classeur"
    End If
End Sub
Function ListSheetOnClosedFile(lPath As String)
    'patricktoulon collection Ado
    Dim Connection As Object, recordST As Object, TbL(), A&
    Set Connection = CreateObject("ADODB.Connection") ' Créer connexion ADO
    ' Ouvrir connexion (type de connection pour les version superieures a 2003/2007 et +)
    Connection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & lPath & ";" & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    Set recordST = Connection.OpenSchema(20) ' Récupérer la liste des feuilles ' 20 = adSchemaTables
    Do Until recordST.EOF
        Debug.Print recordST!TABLE_NAME
        If InStr(recordST!TABLE_NAME, "xlnm#_FilterDatabase") = 0 Then
            If recordST!TABLE_NAME Like "*$*" Then
                A = A + 1
                ReDim Preserve TbL(1 To A)
                TbL(A) = Replace(Replace(Replace(recordST!TABLE_NAME, "$", ""), "'", ""), "_xlnm#_FilterDatabase", "")
            End If
        End If
        recordST.MoveNext
    Loop
    recordST.Close: Connection.Close: Set recordST = Nothing: Set Connection = Nothing
    If A = 0 Then
        ListSheetOnClosedFile = Array() ' on met un tableau vide pour eviter l'erreur dans la sub appelante
    Else
        ListSheetOnClosedFile = TbL
    End If
End Function
pour le xml on change rien là encore il n'a que faire
par contre on peut garantir l'ordre identique
VB:
'********************************************************
'collection fonctions particulière et originales disk Rac 3
'liste des feuilles dans un classeur fermé sur une idée de @laurent950
'auteur :patricktoulon
'version patricktoulon 100% VBA
'********************************************************

Option Explicit

Sub testFX()
    Dim ListSheet, FilePath$
    'adapter le chemin ici ou injecter un dialog getopenfilename
    FilePath$ = "C:\Users\patricktoulon\Desktop\tototo.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
    If Dir(fichierxml) <> "" Then Kill fichierxml
   
    'on copie le fichier Excel(xlsx , xlsm , xlt , xlb) en format zip
    FileCopy lPath, fichierZiP
   
   
    '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
 
a hh:!! un fichier n'est pas supprimé là
soit le zip soit le xml
vérifie avec un point d'arrêt
on fait peut être face a un soucis d'autorisation sur le dossier du thisworkbook peut être va t il falloir remettre environ("Temp")

edit :je viens de tester ton classeur1.xlsx et chez moi les deux methode fonctionnent
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Excel et Insee
Réponses
6
Affichages
551
Réponses
4
Affichages
208
  • Résolu(e)
Microsoft 365 transposer
Réponses
6
Affichages
144
Réponses
4
Affichages
119
Retour