Obtenir les noms de feuilles d’un classeur Excel en VBA
L’article Importer plusieurs feuilles Excel dans une table Access en VBA montrait comment importer automatiquement le contenu de feuilles Excel (feuilles de même structure, obligatoirement) dans une table Access.
Dans cet article, on supposait que les feuilles étaient connues au préalable, et listées dans Access. Mais comment faire si le nombre de feuilles Excel est inconnu et variable ?
La solution
L’idée est d’obtenir en VBA la liste des feuilles du classeur Excel concerné. Une petite fonction fera l’affaire :
- Comme on va piloter Excel à distance (par Automation), votre base Access doit comporter une référence à la bibliothèque Microsoft Excel x.y Object Library (x.y variant selon votre pack Office. Office 2013 équivaut à 15.0, par exemple). Dans VBE, faites Outils / Références et cochez la bibliothèque susnommée (tiens, voilà que j’écris comme une circulaire de police ! 🙂 ).
- Recopiez la fonction suivante dans un module standard de votre base de données :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
' --- ' LISTE DES FEUILLES D'UN CLASSEUR EXCEL ' --- ' Function ListeFeuillesExcel( _ ByVal strClasseur As String) As Variant ' Quelques variables... Dim xlApp As Excel.Application Dim wbk As Excel.Workbook Dim sht As Excel.Worksheet Dim intFeuilles As Integer Dim intI As Integer Dim astrFeuilles() As String ' Ouvrir le classeur Set xlApp = New Excel.Application Set wbk = xlApp.Workbooks.Open(strClasseur) ' Nombre de feuilles intFeuilles = wbk.Sheets.Count ReDim astrFeuilles(1 To intFeuilles) For intI = 1 To intFeuilles astrFeuilles(intI) = wbk.Sheets(intI).Name Next ' Libérer les objets ! wbk.Close False xlApp.Quit Set wbk = Nothing Set xlApp = Nothing ListeFeuillesExcel = astrFeuilles End Function |
La fonction démarre une instance d’Excel, ouvre le classeur, et en extrait les noms de feuilles. Ceux-ci sont renvoyés dans un tableau, et pourront être exploités dans Access.
Exemple
Si vous vous reportez à l’article de départ, vous trouvez un bout de code qui importe des feuilles Excel dont on connaît le nom :
1 2 3 4 5 6 7 8 9 10 11 |
Sub TestImportExcel() Dim varFeuilles As Variant ' Liste des feuilles Excel à importer varFeuilles = Array("Acteurs1", "Acteurs2", _ "Acteurs3", "Acteurs4", "Acteurs5") ' Importation proprement dite ImportExcel "C:\Users\Hervé\Documents\Acteurs.xlsx", _ varFeuilles, True, "tbl Acteurs - Import" End Sub |
Maintenant, si les noms de feuilles sont inconnus, vous pouvez adapter ce code de cette manière :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub TestImportExcel() Dim strClasseur As String Dim varFeuilles As Variant ' Chemin du classeur strClasseur = "C:\Users\Hervé\Documents\Acteurs.xlsx" ' Liste des feuilles Excel à importer varFeuilles = ListeFeuillesExcel(strClasseur) ' Importation proprement dite ImportExcel strClasseur, _ varFeuilles, True, "tbl Acteurs - Import" End Sub |
Hop là !
Chaque appel de la fonction démarre « un nouvel Excel ». Si vous deviez l’utiliser dans une boucle, aménagez un peu pour éviter la séquence Démarrer Excel / Arrêter Excel qui ne sera pas performante.
Julie > Content que marche !
Je vous remercie pour votre rapidité à répondre aux questions! Et pour ce code présenté encore une fois de manière très claire. C’est parfait ca marche nikel! 😉
Julie