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 SubBonjour 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 SubCdlt,
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 executantmerci 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 ?