=> Exercices sur Tableau Indéxés Séquentiellement (Dynamic Array) ;-)
Bonjour Jean-Marie, Xavier, le Forum
J'espère que Xavier n'a pas eu un évanouissement en voyant ce code Jean-Marie !
Bon sinon je suppose que tu as travaillé en test sans enregistrer tes classeurs et que tu as renommé ceux-ci pour le Post "FichierA", "FichierB" & "FichierC"... Car sous PC pour un fichier enregistré il faut préciser l'extention Workbooks("FichierA.xls") sinon y a pas bon (ou alors encore une différence Mac)
Pour le reste c'est tout OK, sauf que l'on part un peu plus loin que la demande de Xavier avec un troisième classeur ne reportant que les items étant en doublon, mais il est fort probable que celà lui sera utile.
Par contre je ne suis pas d'accord sur la dénomination "'Tableau dynamique" pour les "vColA" et "vColA", car là ça peut porter à confusion... En effet entre l'anglais "Dynamic Array" et "Tableau Dynamique" on pourrait penser que c'est idem, alors que "Dynamic Array" serait plutôt en français "Tableau Indéxé Séquentiellement", et là les vColA & vColB sont des Tableaux tout simple reflétant des plages (Array), même si ces plage sont dimensionnées dynamiquement (end(xlUp)... Enfin ce n'est vraiment pas important, c'est juste dans un soucis de précision pour éviter des confusions.
Et tant que l'on parle de Dynamic Arrays, donc de "Tableau Indéxés Séquentiellement", alors voici deux Procédures pour exactement le même résultat que mon code plus haut qui travaillait sur les Objets Ranges(probablement 100 fois plus rapide sur des gros gros tableaux)
Public Sub CompareTwoFilesDynamicArraySimple()
Dim TabA As Variant 'Tableau (Array) liée à la plage à définir dans le code
Dim TabB As Variant 'Tableau (Array) liée à la plage à définir dans le code
Dim TabDynamicArray() As String 'Tableau indexé séquentiellement (Dynamic Array)
Dim I As Long, J As Long
'On détermine la plage des cellules du 1er fichier A et on bascule les données dans le tableau
With Workbooks("FichierA.xls").Worksheets("Feuil1")
TabA = .Range("A1:A" & .Range("A65536").End(xlUp).Row)
End With
'On détermine la plage des cellules du 1er fichier B et on bascule les données dans le tableau
With Workbooks("FichierB.xls").Worksheets("Feuil1")
TabB = .Range("A1:A" & .Range("A65536").End(xlUp).Row)
End With
For I = 1 To UBound(TabA, 1) 'On prend une valeur du Tableau A
'Dimensionnement & Construction du Tableau Dynamique Première Colonne (tous les Items)
ReDim TabDynamicArray(UBound(TabA), 2)
TabDynamicArray(I - 1, 0) = TabA(I, 1)
For J = 1 To UBound(TabB, 1) 'On prend une valeur du Tableau B
'On fait une comparaison de ces deux valeurs
If TabA(I, 1) = TabB(J, 1) Then
'Suite Construction du Tableau Dynamique Seconde Colonne (les Items communs)
TabDynamicArray(I - 1, 1) = TabB(J, 1)
End If
Next J
Next I
'Ecriture dans le FichierA avec report integral du Tableau Dynamique
With Workbooks("FichierA.xls").Worksheets("Feuil1")
.Range("A1:B" & .Range("A65536").End(xlUp).Row) = TabDynamicArray
End With
End Sub
Public Sub CompareTwoFilesDynamicArrayAdvanced()
Dim TabA As Variant 'Tableau (Array) liée à la plage à définir dans le code
Dim TabB As Variant 'Tableau (Array) liée à la plage à définir dans le code
Dim TabDynamicArray() As String 'Tableau indexé séquentiellement (Dynamic Array)
Dim TabDynamicArrayInOrder() As String 'Tableau indexé séquentiellement (Dynamic Array)
Dim I As Long, J As Long, L As Long 'Variable de boucle
Dim x As Long 'Variable d'Indexation séquentielle
'On détermine la plage des cellules du 1er fichier A et on bascule les données dans le tableau
With Workbooks("FichierA.xls").Worksheets("Feuil1")
TabA = .Range("A1:A" & .Range("A65536").End(xlUp).Row)
End With
'On détermine la plage des cellules du 1er fichier B et on bascule les données dans le tableau
With Workbooks("FichierB.xls").Worksheets("Feuil1")
TabB = .Range("A1:A" & .Range("A65536").End(xlUp).Row)
End With
For I = 1 To UBound(TabA, 1) 'On prend une valeur du Tableau A
''Dimensionnement Construction du Tableau Dynamique Première Colonne (tous les Items)
ReDim Preserve TabDynamicArray(2, x)
TabDynamicArray(0, x) = TabA(I, 1)
For J = 1 To UBound(TabB, 1) 'On prend une valeur du Tableau B
' On fait une comparaison de ces deux valeurs
If TabA(I, 1) = TabB(J, 1) Then
'Suite Construction du Tableau Dynamique Seconde Colonne (les Items communs)
TabDynamicArray(1, x) = TabB(J, 1)
End If
Next J
x = x + 1 'Incrémentattion du numéro séquentiel
Next I
'Le Tableau dynamique est à l'envers, remise à l'endroit (je crois que Zon a une astuce)
For I = 0 To UBound(TabDynamicArray, 2)
ReDim Preserve TabDynamicArrayInOrder(UBound(TabDynamicArray, 2), 2)
TabDynamicArrayInOrder(I, 0) = TabDynamicArray(0, I)
TabDynamicArrayInOrder(I, 1) = TabDynamicArray(1, I)
Next I
'Ecriture dans le FichierA avec report integral du Tableau Dynamique à l'endroit
With Workbooks("FichierA.xls").Worksheets("Feuil1")
.Range("A1:B" & .Range("A65536").End(xlUp).Row) = TabDynamicArrayInOrder
End With
End Sub
La seconde méthode ici n'est pas justifiée puisque l'on connait la dimension à l'avance, mais c'est plus en tant qu'exercice de démostration, par contre donc dans ce second cas on est obligé de construre le tableau séquentiel à l'envers... D'où la nécessité de le remettre à l'endroit... Et je pense que si Zon passe par ici il a une astuce plus efficace que de redescendre et reconstruire le tableau... (il me semble que j'avis vu un barbatruc lol ?)
Bon sinon je croise aussi les doigts pour que la mise en page de ce post passe correctement, car dans cette mini fenêtre c'est illisible lol
Bon App
@+Thierry
PS Sorry Xavier de t'emprunter ton Fil de la sorte, j'espère que tu n'auras pas mal à la tête !