Générer autant d'onglet que de fichier Excel présent dans le dossier
Bonsoir,
Il y a bien un domaine où je ne maitrise pas une miettes c'est bien : ET ben non ce soir je ne parle pas de Power Query ! Non, c'est la gestion de fichiers "extérieurs" au fichier Excel ouvert.
Mon intention est celle-ci :
J'ai un fichier Excel comportant une macro, je la lance.
Cette dernière "scanne" le dossier où il se trouve, et pour chaque fichier Excel trouvé (il n'y aura que ça dans le dossier) la macro copiera la seule feuille contenu dans ce fichier (peut importe le nom de la feuille) et la copiera sur le fichier comportant la macro, une fois copiée cet onglet devra porter le nom du classeur dont la feuille provient.
Alors je vais dire comme beaucoup de demandeur : cela ne me semble pas trop compliqué, mais je ne connais pas les instructions de gestions de fichiers.
Mes applications sont pour la très grande majorité "autonomes" !
Je vous joint pour l'exemple deux fichiers : LRD et GRD :
qui comportent comme annoncé une seule feuille dont le nom importe peu.
Et une fichier résultat pour vous montrer le résultat attendu :
il y a donc trois feuilles, une feuille "Action", puis la feuille "LRD" et la feuille "GRD". L'ordre des feuilles importées n'a pas d'importance.
Le nombre de fichier est "inconnu". J'imagine donc une boucle "tant qu'il reste un fichier".
il sera possible pour une gestion simplifier de renommer à votre convenance le fichier comportant la macro, voir même le déplacer dans le dossier parent de celui comportant les autres fichiers et ce dossier pourra porter le nom que vous voulez.
Merci @ vous.
@ bientôt
LouReeD
Bonjour LouReed
Voici le code demandé et testé
Sub ImportXFichier1Feuille()
Dim Chemin As String, NomFic As String
Dim Wbk As Workbook, Sht As Worksheet
Chemin = ThisWorkbook.Path & "\"
NomFic = Dir(Chemin & "*.xlsx")
Do While NomFic <> ""
Set Wbk = Workbooks.Open(Chemin & NomFic)
Wbk.Sheets(1).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Wbk.Close SaveChanges:=False
NomFic = Dir
Loop
MsgBox "Import des fichiers terminé"
End SubA+
Bonjour à tous,
Une variante avec quelques ajouts :
- Choix du dossier
- Ouverture du classeur en lecture seule et sans maj des liaisons éventuelles
- Le nom de la feuille ajoutée est = au nom du classeur sans l'extension
(sauf si le nom du classeur est >31 caractères, dans ce cas on reprend le nom de la feuille)
- Affichage du nombre de fichiers traités
Option Explicit
Sub Import_Feuilles()
Dim Emplacement As String
Dim FSO As Object
Dim Dossier As Object
Dim Fichier As Object
Dim Wbk As Workbook
Dim Sht As Worksheet
Dim i As Integer
' Choix du dossier
With Application.FileDialog(msoFileDialogFolderPicker) ' Fenêtre de sélection d'un dossier (constante =4)
.Title = "Sélectionnez un emplacement."
.ButtonName = "Sélectionner"
.InitialFileName = "C:\"
.Show
If .SelectedItems.Count > 0 Then Emplacement = .SelectedItems(1) ' Nom du dossier avec chemin (vide si abandon)
End With
If Emplacement <> "" Then
Application.ScreenUpdating = False
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Dossier = FSO.GetFolder(Emplacement)
For Each Fichier In Dossier.Files
If UCase(Right(Fichier, 5)) = ".XLSX" Then ' Uniquement les classeur Xlsx
Set Wbk = Workbooks.Open(Fichier, 0, True) ' Ouvre en lecture seule et sans maj des liaisons
On Error Resume Next
' Err si nom du classeur >31 caractères
' Le nom sera le nom de la Feuille source
Wbk.Sheets(1).Name = Left(Fichier.Name, Len(Fichier.Name) - 5) ' Affecte le nom du classeur (sans l'ext) à la feuille 1
On Error GoTo 0
Wbk.Sheets(1).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) ' Copie en dernier
Wbk.Close SaveChanges:=False ' Ferme sans maj
i = i + 1 ' Compteur
End If
DoEvents
Next Fichier
ThisWorkbook.Sheets(1).Activate
Application.ScreenUpdating = True
If i <> 0 Then
MsgBox i & " Fichier(s) traité(s)", vbOKOnly
Else
MsgBox "Aucun fichier Xlsx trouvé", vbOKOnly
End If
End If
End SubBonne journée
Bonjour,
Merci à vous deux !
Je vais comme cela pouvoir finir mon projet et en plus je vais (enfin) apprendre la gestion de fichiers externes.
En plus j'ai deux visions de la chose : brute pour une mise place d'un développeur et avec "interface" pour une mise en place pour des éventuels utilisateurs !
Je n'ai pour le moment pas encore testé vos codes, mais vous ayant croisé plusieurs fois sur les fils je n'ai aucun doute.
Encore merci, bon dimanche.
@ bientôt
LouReeD
Et bien après essais voici ce que je peux en dire : IMPECABLE !
Juste une info pour JExceL2fr : les onglets ne sont pas renommés avec le nom du fichier dont ils proviennent. J'ai ajouté un "Application.ScreenUpdating" afin d'éviter le clignotement de l'écran.
Sinon le code d'Eric_Angers me convient, mais pour mon utilisation je vais mettre en "veille" la demande du dossier à traiter, mais je garde le code. J'aime bien également la gestion d'erreur de la longueur du fichier source de la feuille.
Encore merci @ vous deux ! Je vous donne un code promo pour pouvoir télécharger ma dernière application de jeu ArkaLouReeD en cadeaux : FUN !
Je plaisante, aucune restriction sur le téléchargement ! C'est free !
Ho, c'était juste pour faire un peu de "pub" !
@ bientôt
LouReeD