Copier-coller colonne à partir d'une entête VBA

Salut 3GB,

encore merci pour le rajout de la ligne de code, qui semblait plutôt pas mal, par contre je me heurte a un imprévu, si je mets la ligne de code, il m'indique :

erreur de compilation : référence incorrecte ou non qualifiée

pour palier à ça, je me suis dit que je rajoute la notion : Workbooks("00_Recap). pour qu'il soit plus content ;) il a aimé, mais du coup bloque sur

sfilename = Dir(.Path & "\*.xlsx")

en me disant là aussi référence inconnue...

c'est horrible cette sensation de ne rien maitriser ;)

Salut trueblood,

Peux-tu remettre le code, tel qu'il est désormais, en entier ? Normalement, .path doit renvoyer à un objet workbook dans un with.

Cdlt,

Sub Compilation()
Dim sfilename As String, theader
    With Workbooks("00_Recap").Worksheets("DATA").Range("Tableau1") 'classeur exécutant (destination)
    theader = Application.Transpose(Application.Transpose(.Rows(0).Resize(1, .Columns.Count - 1))) 'tableau avec noms en-têtes alimenté par les colonnes du tableau1 de "DATA"
    End With
'With ThisWorkbook 'classeur exécutant (destination)
'    theader = Application.Transpose(.Worksheets("DATA").Range("A1:A11").Value) 'tableau avec noms en-têtes alimenté par A1:A11 de "DATA"

    sfilename = Dir(.Path & "\*.xlsx") '1ere entrée répertoire avec filtre sur xlsx (pour boucle sur fichiers source)

    Do While sfilename <> "" 'si correspondance trouvée

        If sfilename <> .Name Then 'si nom fichier <> nom classeur exec.
            'Appelle macro Importer (arguments : chemin complet fichier source, feuille dest, liste entêtes)

            Importer .Path & "\" & sfilename, .Worksheets("DATA"), theader
        End If
        sfilename = Dir 'suivant
    Loop
End With
End Sub

Sub Importer(strFichierSource$, wsDest As Worksheet, theader)
Dim r As Range, NBL&, nvl&, i&
nvl = wsDest.Range("Tableau1").Rows.Count + 1 'nouvelle ligne dans tableau
Application.DisplayAlerts = False
With Workbooks.Open(strFichierSource, 0, True) 'avec fichier source ouvert à l'instant
    With .Worksheets("Feuil1") 'avec "Feuil1"
        NBL = .UsedRange.Rows.Count - .UsedRange.Row 'nb de lignes des colonnes
        For i = LBound(theader) To UBound(theader) 'pour chaque nom d'en-tête
            Set r = .Cells.Find(theader(i)) 'r est la cellule obtenue suite à la recherche de l'entete en cours
            wsDest.Range("Tableau1[" & theader(i) & "]").Cells(nvl).Resize(NBL).Value = r.Offset(1, 0).Resize(NBL).Value
        Next i
    End With
    wsDest.Range("Tableau1[Provenance]").Cells(nvl).Resize(NBL).Value = .Name '<<< A ADAPTER nom colonne PROVENANCE pour récupérer nom source
    .Close False
End With
Application.DisplayAlerts = True
End Sub

Bonjour 3GB,

dsl de ma réponse si tardive (pb de vacances et d'ordinateur) ;)

Bonjour trueblood,

Ce n'est plus clair dans ma mémoire. Voici le code tel qu'il devrait être syntaxiquement parlant mais je ne me suis pas attardé sur la macro Importer :

Sub Compilation()
Dim sfilename As String, theader
With Workbooks("00_Recap") 'classeur executant
    with .Worksheets("DATA").Range("Tableau1")
        theader = Application.Transpose(Application.Transpose(.Rows(0).Resize(1, .Columns.Count - 1)))
    end with
    sfilename = Dir(.Path & "\*.xlsx") '1ere entrée répertoire avec filtre sur xlsx (pour boucle sur fichiers source)
    Do While sfilename <> "" 'si correspondance trouvée
        If sfilename <> .Name Then 'si nom fichier <> nom classeur exec.
            Importer .Path & "\" & sfilename, .Worksheets("DATA"), theader
        End If
        sfilename = Dir 'suivant
    Loop
End With
End Sub

Sub Importer(strFichierSource$, wsDest As Worksheet, theader)
Dim r As Range, NBL&, nvl&, i&
nvl = wsDest.Range("Tableau1").Rows.Count + 1 'nouvelle ligne dans tableau
Application.DisplayAlerts = False
With Workbooks.Open(strFichierSource, 0, True) 'avec fichier source ouvert à l'instant
    With .Worksheets("Feuil1") 'avec "Feuil1"
        NBL = .UsedRange.Rows.Count - .UsedRange.Row 'nb de lignes des colonnes
        For i = LBound(theader) To UBound(theader) 'pour chaque nom d'en-tête
            Set r = .Cells.Find(theader(i)) 'r est la cellule obtenue suite à la recherche de l'entete en cours
            wsDest.Range("Tableau1[" & theader(i) & "]").Cells(nvl).Resize(NBL).Value = r.Offset(1, 0).Resize(NBL).Value
        Next i
    End With
    wsDest.Range("Tableau1[Provenance]").Cells(nvl).Resize(NBL).Value = .Name '<<< A ADAPTER nom colonne PROVENANCE pour récupérer nom source
    .Close False
End With
Application.DisplayAlerts = True
End Sub

Cdlt,

merci pour ton retour.

la syntaxe est surement mieux mais la macro me dit dès le début erreur d'exécution '9' : l'indice n'appartient pas à la selection et m'indique la ligne de code étant problématique :

With Workbooks("00_Recap") 'classeur executant

merci 3GB pour l'aide apportée, je vais essayé de trouver une solution en pas par pas.

L'erreur 9, dans le cas des classeurs, signifie que le fichier "00_Recap" n'est pas reconnu. Donc soit le nom de fichier est incorrect et il faudrait le nommer correctement, "00_Recap.xlsm" par exemple. Soit ce classeur, censé être l'exécutant, n'est pas ouvert et n'a donc rien à voir. Donc, il faudrait remplacer la ligne par thisworkbook comme je l'avais fait lors de mon post du 23/04/2021 à 11h46.

Pour rappel, il est censé être le classeur de destination également. Est-ce bien le cas ?

Rechercher des sujets similaires à "copier coller colonne partir entete vba"