Ouvrir plusieurs fichier automatiquement et réaliser une importation de don

Bonjour, je souhaite importer des données de plusieurs fichiers différent dans un seul fichier. Pour le moment mon code fonctionne pour réaliser cette tâche, cependant je dois préciser à la main le chemin de chaque dossier. Je recherche une méthode permettant d'ouvrir une boite de dialogue pour sélectionner les fichiers qui m'intéresse et ensuite réaliser la même fonction d'importation.

Je vous joins mon code:

Sub TableauConsoUO()
Application.DisplayAlerts = False

Dim fichierSource1 As Workbook ' Classeur source
Dim feuilleSource1 As Worksheet ' Feuille source
Dim plageSource1 As Range ' Plage source

Dim fichierDestination As Workbook ' Classeur de destination
Dim feuilleDestination As Worksheet ' Feuille de destination
Dim plageDestination As Range ' Plage de destination

' Chemin et nom du fichier source
Dim cheminSource As String
cheminSource = "C:\Users\rubeng\Documents\Donnee_ALCYONE\Suivi_Presta_MensuelV2"

' Nom de la feuille source
Dim nomFeuilleSource As String
nomFeuilleSource = "Nb_heure_presta"

' Plage de données source à importer
Dim adressePlageSource As String
adressePlageSource = "J11:V15" ' Remplacez par la plage réelle que vous souhaitez importer

' Classeur de destination (classeur actuel)
Set fichierDestination = ThisWorkbook

' Feuille de destination
Set feuilleDestination = fichierDestination.Sheets("Synthèse Consommation UO") ' Remplacez par le nom de la feuille de destination

Dim derniereLigne As Long
derniereLigne = feuilleDestination.Cells(feuilleDestination.Rows.Count, "A").End(xlUp).Row
Dim prochaineLigne As Long
prochaineLigne = derniereLigne + 1

' Plage de destination (à partir de la première cellule de la feuille destination)
Set plageDestination = feuilleDestination.Range("A" & prochaineLigne)

' Ouvrir le fichier source
Set fichierSource1 = Workbooks.Open(cheminSource)

' Vérifier si la feuille source existe dans le fichier source
On Error Resume Next
Set feuilleSource1 = fichierSource1.Sheets(nomFeuilleSource)
On Error GoTo 0

If feuilleSource1 Is Nothing Then
MsgBox "La feuille source spécifiée n'a pas été trouvée dans le fichier source."
Exit Sub
End If

' Vérifier si la plage source existe dans la feuille source
On Error Resume Next
Set plageSource1 = feuilleSource1.Range(adressePlageSource)
On Error GoTo 0

If plageSource1 Is Nothing Then
MsgBox "La plage source spécifiée n'a pas été trouvée dans la feuille source."
Exit Sub
End If
' Copier les valeurs de la plage source vers la plage de destination
plageSource1.Copy Destination:=plageDestination

' Fermer le fichier source sans sauvegarder les modifications
fichierSource1.Close False

' Libérer les variables
Set plageSource1 = Nothing
Set plageDestination = Nothing
Set feuilleSource1 = Nothing
Set feuilleDestination = Nothing
Set fichierSource1 = Nothing

End Sub

Je vous remercie par avance :)

Edit Modo : Mis code entre balises. Merci d'utiliser l'icone </> dans la barre de menu et de coller vos codes dans la fenêtre

Bonjour Ruben,

Une proposition en pièce jointe (voir module 1). J'ai sorti les déclarations des variables de la boucle de traitement des fichiers. Dans la boucle, j'ai laissé les "Exit Sub" mais tu peux les remplacer par des "Exit For" si tu veux passer au traitement du fichier suivant. J'ai testé la partie sélection des fichiers mais pas la partie import.

Cdlt,

Cylfo

10ruben.xlsm (18.83 Ko)

Merci pour votre réponse, la sélection de fichier se réalise bien. Je vais l'adapter avec une importation de fichier.

Cylfo je n'ai pas réussi avec ta méthode.

Cependant j'ai trouvé une autre solution qui fonctionne, je vous la joint à la suite.

Sub TEST_ImporterPlageDonneesSatisfactionClient()

Application.DisplayAlerts = False


Dim fichierSource1 As Workbook ' Classeur source
Dim feuilleSource1 As Worksheet ' Feuille source
Dim plageSource1 As Range ' Plage source

Dim fichierDestination As Workbook ' Classeur de destination
Dim feuilleDestination As Worksheet ' Feuille de destination
Dim plageDestination As Range ' Plage de destination

' Chemin et nom du fichier source
Dim cheminSource As Variant
cheminSource = Application.GetOpenFilename(MultiSelect:=False)

' Nom de la feuille source
Dim nomFeuilleSource As String
nomFeuilleSource = "Nb_heure_presta"

' Plage de données source à importer
Dim adressePlageSource As String
adressePlageSource = "K8:V8" ' Remplacez par la plage réelle que vous souhaitez importer

' Classeur de destination (classeur actuel)
Set fichierDestination = ThisWorkbook

' Feuille de destination
Set feuilleDestination = fichierDestination.Sheets("Synthèse Consommation UO") ' Remplacez par le nom de la feuille de destination

Dim derniereLigne As Long
derniereLigne = feuilleDestination.Cells(feuilleDestination.Rows.Count, "A").End(xlUp).Row
Dim prochaineLigne As Long
prochaineLigne = derniereLigne + 1

' Plage de destination (à partir de la première cellule de la feuille destination)
Set plageDestination = feuilleDestination.Range("A" & prochaineLigne)

' Ouvrir le fichier source
Set fichierSource1 = Application.Workbooks.Open(cheminSource)

' Vérifier si la feuille source existe dans le fichier source
On Error Resume Next
Set feuilleSource1 = fichierSource1.Sheets(nomFeuilleSource)
On Error GoTo 0

If feuilleSource1 Is Nothing Then
MsgBox "La feuille source spécifiée n'a pas été trouvée dans le fichier source."
Exit Sub
End If

' Vérifier si la plage source existe dans la feuille source
On Error Resume Next
Set plageSource1 = feuilleSource1.Range(adressePlageSource)
On Error GoTo 0

If plageSource1 Is Nothing Then
MsgBox "La plage source spécifiée n'a pas été trouvée dans la feuille source."
Exit Sub
End If
' Copier les valeurs de la plage source vers la plage de destination
plageSource1.Copy
plageDestination.PasteSpecial Paste:=xlPasteValues
plageDestination.PasteSpecial Paste:=xlPasteFormats


' Fermer le fichier source sans sauvegarder les modifications
fichierSource1.Close False

' Libérer les variables
Set plageSource1 = Nothing
Set plageDestination = Nothing
Set feuilleSource1 = Nothing
Set feuilleDestination = Nothing
Set fichierSource1 = Nothing

MsgBox "La plage de données a été importée avec succès."
End Sub

Ok mais tu es obligé de relancer la macro à chaque import. Quel était le point de blocage avec la méthode que je t'ai fournie, si la partie sélection fonctionnait, cela devait être de l'ordre du réglage à faire pour la partie import.

Merci également comme cela a été fait (par un modérateur) sur le post initial de mettre le code entre balise en utilisant l'icône </>.

Votre partie sélection fonctionnait, mais je n'ai pas trouvé de solution qui fonctionne pour ouvrir mon fichier excel et réaliser copier/coller derrière.

Vous n'auriez pas 2 fichiers (anonymisés) à importer pour tester ?

Je ne peux malheureusement pas vous les partager car ils contient des informations privés.

Bon tu aurais pu fabriquer un jeu d'essai ... je l'ai fait juste avec des données renseignées en colonne A et B à partir de la ligne 1. Donc il faudra que tu adaptes à tes plages de données;

Le zip contient le fichier destination avec le bouton d'exécution de l'import et 2 fichiers à importer cohérents avec les plages A1:Bxx que j'ai défini. J'ai testé, cela ajoute bien les données des 2 fichiers sources à la suite des dernières données du fichier destination.

12ruben.zip (33.37 Ko)

Cdlt,

Cylfo

Je te remercie de ton aide, le code fonctionne parfaitement !

Je le repose ici pour ceux que ça intéresserait:

Sub TEST2()

Dim wbsonde As Workbook, wbdest As Workbook
Dim ws As Worksheet, wsdest As Worksheet
Dim dossiersonde$, dossiercompil$, filecompil$, filesonde$, num$
Dim dl&, nvl&
Dim plageDestination As Range
Dim prochaineLigne As Long
Dim derniereLigne As Long

dossiersonde = "C:\Users\rubeng\Documents\Donnee_ALCYONE\Test" 'dossier à sonder (fichiers avec 6 onglets)

Application.ScreenUpdating = False

' Classeur de destination (classeur actuel)
Set wbdest = ThisWorkbook
' Feuille de destination
Set wsdest = wsdest.Sheets("Synthèse Consommation UO") ' Remplacez par le nom de la feuille de destination

' Plage de destination (à partir de la première cellule de la feuille destination)
Set plageDestination = feuilleDestination.Range("A" & prochaineLigne)

'ouverture d'un fichier à sonder à la fois
filesonde = Dir(dossiersonde & "*.xls*")
While filesonde <> "" 'tant qu'il existe des fichiers dans le dossier à sonder
Set wbsonde = Workbooks.Open(dossiersonde & filesonde) 'on ouvre le fichier
' Nom de la feuille source

With wbsonde 'avec ce fichier
Dim nomFeuilleSource As String
nomFeuilleSource = "Nb_heure_presta"

' Plage de données source à importer
Dim adressePlageSource As String
adressePlageSource = "K8:V8" ' Remplacez par la plage réelle que vous souhaitez importer

derniereLigne = feuilleDestination.Cells(feuilleDestination.Rows.Count, "A").End(xlUp).Row

prochaineLigne = derniereLigne + 1

' Vérifier si la feuille source existe dans le fichier source
On Error Resume Next
Set feuilleSource1 = fichierSource1.Sheets(nomFeuilleSource)
On Error GoTo 0

If feuilleSource1 Is Nothing Then
MsgBox "La feuille source spécifiée n'a pas été trouvée dans le fichier source."
Exit Sub
End If

' Vérifier si la plage source existe dans la feuille source
On Error Resume Next
Set plageSource1 = feuilleSource1.Range(adressePlageSource)
On Error GoTo 0

If plageSource1 Is Nothing Then
MsgBox "La plage source spécifiée n'a pas été trouvée dans la feuille source."
Exit Sub
End If
' Copier les valeurs de la plage source vers la plage de destination
plageSource1.Copy
plageDestination.PasteSpecial Paste:=xlPasteValues
plageDestination.PasteSpecial Paste:=xlPasteFormats

' Fermer le fichier source sans sauvegarder les modifications
fichierSource1.Close False

' Libérer les variables
Set plageSource1 = Nothing
Set plageDestination = Nothing
Set feuilleSource1 = Nothing
Set wsdest = Nothing
End With
Wend

'for each wb in workbooks 'pour chaque classeur de la collection
' if wb.name like 'Compil*" then wb.close true 'si fichier compil, on ferme et sauve
'next wb

Application.ScreenUpdating = True

MsgBox "terminé"

End Sub

Sub TEST3()
Dim dlgSelFic As FileDialog
Dim acFiles() As String
Dim nIF As Integer
Dim nIFSup As Integer

' Sélection des fichiers à importer
Set dlgSelFic = Application.FileDialog(msoFileDialogFilePicker)
With dlgSelFic
.Title = "Sélectionner les fichiers à importer ..."
.AllowMultiSelect = True
If .Show = False Then Exit Sub ' si aucune sélection => sortie
nIFSup = .SelectedItems.Count
ReDim acFiles(1 To .SelectedItems.Count) As String
For nIF = 1 To nIFSup
acFiles(nIF) = .SelectedItems(nIF)
Next
End With

Dim fichierSource1 As Workbook ' Classeur source
Dim feuilleSource1 As Worksheet ' Feuille source
Dim plageSource1 As Range ' Plage source

Dim fichierDestination As Workbook ' Classeur de destination
Dim feuilleDestination As Worksheet ' Feuille de destination
Dim plageDestination As Range ' Plage de destination
Dim adressePlageSource As String
Dim derniereLigne As Long
Dim prochaineLigne As Long

Dim nomFeuilleSource As String

Application.ScreenUpdating = False

' Classeur de destination (classeur actuel)
Set fichierDestination = ThisWorkbook
' Feuille de destination
Set feuilleDestination = fichierDestination.Sheets("Synthèse Consommation UO") ' Remplacez par le nom de la feuille de destination

' Nom de la feuille source
nomFeuilleSource = "Nb_heure_presta"

For nIF = 1 To nIFSup

' Ouvrir le fichier source
Set fichierSource1 = Workbooks.Open(Filename:=acFiles(nIF), ReadOnly:=True, AddToMru:=False)

' Vérifier si la feuille source existe dans le fichier source
On Error Resume Next
Set feuilleSource1 = fichierSource1.Sheets(nomFeuilleSource)
On Error GoTo 0

If feuilleSource1 Is Nothing Then
MsgBox "La feuille source spécifiée n'a pas été trouvée dans le fichier source."
Exit For ' Passer au fichier suivant
End If

' Adresse de la plage de données source à importer en partant du principe que seule la ligne de fin varie d'un fichier à un autre
'adressePlageSource = feuilleSource1.Range("K8:V8")

' Plage source
Set plageSource1 = feuilleSource1.Range("K8:V8")

' Dernière ligne renseignée
derniereLigne = feuilleDestination.Cells(feuilleDestination.Rows.Count, "A").End(xlUp).Row
prochaineLigne = derniereLigne + 1

' Plage de destination (à partir de la première cellule de la feuille destination)
Set plageDestination = feuilleDestination.Range("A" & prochaineLigne)

' Copier les valeurs de la plage source vers la plage de destination
plageSource1.Copy
plageDestination.PasteSpecial Paste:=xlPasteValues
plageDestination.PasteSpecial Paste:=xlPasteFormats
' Fermer le fichier source sans sauvegarder les modifications
fichierSource1.Close False

' Libérer les variables
Set plageSource1 = Nothing
Set plageDestination = Nothing
Set feuilleSource1 = Nothing
Set fichierSource1 = Nothing
Next

Set feuilleDestination = Nothing
Application.ScreenUpdating = True
End Sub
Rechercher des sujets similaires à "ouvrir fichier automatiquement realiser importation don"