XL 2016 Coller nom classeur sur plage cellules

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 !

safranien

XLDnaute Occasionnel
Bonjour à tous

soit le code ci-dessous qui vient ouvrir et copier les données de la feuille Sheets1 de chaque classeur contenus dans un dossier (tous les classeurs n'ont qu'une seule feuille nommée Sheets1). Actuellement ce dernier me recopie le nom du classeur uniquement dans la première cellule de la colonne A après import des données. Je cherche à ce que ce nom de fichier soit dupliqué sur toutes les lignes. Je n'arrive pas à trouver comment écrire la ligne de code me permettant de réaliser cela. Pouvez vous m'aider svp ?

Merci

VB:
Sub fusionremarque()
 Dim wb As Workbook
  Dim targetWb As Workbook
  Dim myFolder As String
  Dim myFile
  Dim lastRow As Long
  Dim ws As Worksheet
  Dim lastRowWb As Long
 
  Dim nomfichier As String
 
  Application.DisplayAlerts = False

  ' Set the directory containing the Excel files => Définir le répertoire contenant les fichiers Excel
  myFolder = "C:\Users\XXXX\Mon Drive\Downloads\Fab\datas\"

  ' Set the target workbook => Définir le classeur cible
  Set targetWb = ThisWorkbook
  Set ws = targetWb.Worksheets("Sheet1") ' Assumes data is pasted to Sheet1. Change if needed. => Suppose que les données sont collées dans Sheet1. Changer si besoin



  ' Loop through each file in the directory => Parcourez chaque fichier du répertoire  ouvre tous les fichier et sous dossier et répéter l'opération jusqu'a ce que soit faux
  myFile = Dir(myFolder & "*.xlsx")

  Do While myFile <> ""


  ' Get the first empty row in the target sheet => obtenir la premiere ligne vide dans la feuille cible
  lastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row + 1
  lastRow2 = ws.Cells(Rows.Count, "A").End(xlDown).Row + 1
 
    Set wb = Workbooks.Open(myFolder & myFile)

    If Not wb Is Nothing Then

      ' Select the range A:AL from row 2 to last filled row => Sélectionnez la plage A:AL de la ligne 2 à la dernière ligne remplie
      nomfichier = wb.Name
      lastRowWb = wb.Sheets(1).Cells(Rows.Count, "B").End(xlUp).Row ' Assumes data is on Sheet1. Change if needed. =>Suppose que les données se trouvent sur la feuille Sheet1. Changez si nécessaire.
      wb.Worksheets("Sheet1").Columns.EntireColumn.Hidden = False
      wb.Worksheets("Sheet1").Rows.EntireRow.Hidden = False
      wb.Worksheets("Sheet1").Range("A2:I" & lastRowWb).Copy 'Starts from row 2 => Commence à partir de la rangée 2

      ' Paste the data into the target workbook => Collez les données dans le classeur cible
      ws.Cells(lastRow, 2).PasteSpecial xlPasteValues
      ws.Cells(lastRow, 1).Value = myFile
     
     

      ' Clean-up => nettoyer
      wb.Close False
      Set wb = Nothing

    Else
      MsgBox "Error opening file: " & myFolder & myFile, vbCritical
    End If

    myFile = Dir()
  Loop
 
  Application.DisplayAlerts = True

  MsgBox "Data consolidation complete!", vbInformation
End Sub

Ce qui permettrait de passer de ça

1739888628227.png


à ça

1739888661777.png
 

Pièces jointes

  • 1739888542224.png
    1739888542224.png
    18.6 KB · Affichages: 10
Solution
Re,
Salut cousinhub

J'aime pas PQ 🤭 safranien, voici le code modifié 😉
VB:
Sub fusionremarque()
  Dim wb As Workbook
  Dim targetWb As Workbook
  Dim myFolder As String
  Dim myFile
  Dim lastRow As Long, LastRowB As Long, lastRowWb As Long
  Dim ws As Worksheet
  '
  Application.DisplayAlerts = False
  ' Set the directory containing the Excel files => Définir le répertoire contenant les fichiers Excel
  myFolder = "C:\Users\spaiva\Mon Drive\Downloads\Fab\datas\"
  myFolder = ThisWorkbook.Path & "\"

  ' Set the target workbook => Définir le classeur cible
  Set targetWb = ThisWorkbook
  Set ws = targetWb.Worksheets("Sheet1") ' Assumes data is pasted to Sheet1. Change if needed. => Suppose que les données sont collées dans Sheet1...
Bonjour,

Simplement, un truc du style
VB:
ws.Range("A2:A" & lastRow).Value = MyFile

En revanche il faudra calculer la 1ère ligne d'après ce que je vois
Bonjour

merci pour ta proposition. Malheureusement, ça ne fonctionne pas. Le code recopie bien le nom du premier fichier ouvert sur les lignes correspondants aux lignes importées mais ensuite ça écrase ces valeurs avec le nom du deuxième fichier ouvert (et ainsi de suite).

Pour mieux expliquer : le code ouvre le premier fichier et importe les données dans mon fichier, admettons jusqu'à la ligne 50. Il faut alors que le code mette le nom du premier fichier ouvert de A2 à A50. Ensuite, ça ouvre le deuxième fichier et importe les données de la ligne 51 à 100 par exemple. Et alors, il faut que le nom de ce deuxième fichier s'inscrive de A51 à A100. Et ainsi de suite.

La ligne ws.Cells(lastRow, 1).Value = myFile présente actuellement dans le code va bien inscrire le nom de chaque fichier mais uniquement en A2 et A51 pour reprendre mon exemple.

1739891641377.png
 
Dernière édition:
Re,
J'ai bien dit qu'il fallait adapter ce que j'avais donné 😒
Sans fichier, je ne pourrais aller plus loin !
voici l'ensemble. Enregistrer les fichiers 3405 et 3409 dans un dossier nommé datas et dans le code, il faut définir le chemin d'accès où tu auras enregistré le dossier datas pour la variable myfolder :
myFolder = "C:\Users\...
 

Pièces jointes

Bonjour,
En utilisant Power Query, nativement installé depuis la version 2016.
Il faudra tout d'abord :
- Configurer PQ tel qu'expliqué dans l'onglet "Lisez-moi" (c'est à faire une bonne fois pour toute)
- Renseigner le répertoire contenant les fichiers à importer (j'ai déjà mis le chemin présent dans ton code), dans l'onglet "Paramètres", cellule A2
- Cliquer sur "Importer"
- Regarder le résultat dans l'onglet "Data"
Bonne fin d'apm
 

Pièces jointes

Re,
Salut cousinhub

J'aime pas PQ 🤭 safranien, voici le code modifié 😉
VB:
Sub fusionremarque()
  Dim wb As Workbook
  Dim targetWb As Workbook
  Dim myFolder As String
  Dim myFile
  Dim lastRow As Long, LastRowB As Long, lastRowWb As Long
  Dim ws As Worksheet
  '
  Application.DisplayAlerts = False
  ' Set the directory containing the Excel files => Définir le répertoire contenant les fichiers Excel
  myFolder = "C:\Users\spaiva\Mon Drive\Downloads\Fab\datas\"
  myFolder = ThisWorkbook.Path & "\"

  ' Set the target workbook => Définir le classeur cible
  Set targetWb = ThisWorkbook
  Set ws = targetWb.Worksheets("Sheet1") ' Assumes data is pasted to Sheet1. Change if needed. => Suppose que les données sont collées dans Sheet1. Changer si besoin
  ' Loop through each file in the directory => Parcourez chaque fichier du répertoire  ouvre tous les fichier et sous dossier et répéter l'opération jusqu'a ce que soit faux
  myFile = Dir(myFolder & "*.xlsx")
  Do While myFile <> ""
    ' Get the first empty row in the target sheet => obtenir la premiere ligne vide dans la feuille cible
    lastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row + 1
    lastRow2 = ws.Cells(Rows.Count, "A").End(xlUp).Row + 1
    '
    Set wb = Workbooks.Open(myFolder & myFile)
    If Not wb Is Nothing Then
      ' Select the range A:AL from row 2 to last filled row => Sélectionnez la plage A:AL de la ligne 2 à la dernière ligne remplie
      lastRowWb = wb.Sheets(1).Cells(Rows.Count, "B").End(xlUp).Row ' Assumes data is on Sheet1. Change if needed. =>Suppose que les données se trouvent sur la feuille Sheet1. Changez si nécessaire.
      wb.Worksheets("Sheet1").Columns.EntireColumn.Hidden = False
      wb.Worksheets("Sheet1").Rows.EntireRow.Hidden = False
      wb.Worksheets("Sheet1").Range("A2:I" & lastRowWb).Copy 'Starts from row 2 => Commence à partir de la rangée 2
      ' Paste the data into the target workbook => Collez les données dans le classeur cible
      ws.Cells(lastRow, 2).PasteSpecial xlPasteValues
      ' On vient de coller les données, on récupère la dernière ligne remplie de la colonne B
      LastRowB = ws.Range("B" & Rows.Count).End(xlUp).Row
      ' On inscrit le nom du fichier sur toutes les lignes
      ws.Range("A" & lastRow & ":A" & LastRowB).Value = myFile
      ' Clean-up => nettoyer
      wb.Close False
      Set wb = Nothing
    Else
      MsgBox "Error opening file: " & myFolder & myFile, vbCritical
    End If
    myFile = Dir()
  Loop
  Application.DisplayAlerts = True
  MsgBox "Data consolidation complete!", vbInformation
End Sub

A+
 
Dernière édition:
Bonjour wDog66 et CousinHub,

merci beaucoup pour vos propositions. Je n'ai jamais utilisé PQ mais je me pencherai sur le sujet un jour 😄
Le code fonctionne, je n'étais pas très loin d'y arriver, il me manquait ce petit coup de pouce salvateur. Pour que ça fonctionne, j'ai juste dû supprimer
VB:
myFolder = ThisWorkbook.Path & "\"
et modifier la plage de
Code:
wb.Worksheets("Sheet1").Range("A2:I" & lastRowWb).Copy
.

Merci encore et bonne journée 👍
 
- 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
XL 2021 VBA excel
Réponses
4
Affichages
75
Réponses
3
Affichages
453
Réponses
9
Affichages
382
Réponses
4
Affichages
538
Réponses
3
Affichages
514
Retour