Autre point à améliorer, la ligne n°16 :
If VA(x, z) = W Then SaveRemove.Add W, CStr(W): Exit For
Si la condition est vraie, pas besoin de continuer la boucle car W étant déjà inscrit pour être effacé …
Tu as raison pour les boucles, moins il y en a …
Par contre ici c'est assez rapide vu le peu de données et le travail en mémoire.
De mon côté, je partirais sur la base de Demo4 alimentant le dictionnaire avec la première colonne sans doublon
puis dédoublonner chaque colonne suivante pour intégration ou exclusion via deux collections annexes :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| Sub Demo4a()
Dim COL(-1 To 1) As New Collection, C&, R&, V
With Feuil3.UsedRange.Columns
On Error Resume Next
For Each V In .Item(1).Value
If V > "" Then COL(0).Add V, V
Next
For C = 3 To 5 Step 2
For Each V In .Item(C).Value
If V > "" Then COL(1).Add V, V
Next
For Each V In COL(1)
W = COL(0)(V)
COL(W > "").Add V, V
W = ""
Next
Set COL(1) = New Collection
Next
On Error GoTo 0
For Each V In COL(-1): COL(0).Remove V: Next
.Cells(1, 9).CurrentRegion.Clear
If COL(0).Count Then
ReDim V(1 To COL(0).Count, 0)
For R = 1 To COL(0).Count: V(R, 0) = COL(0)(R): Next
.Cells(1, 9).Resize(COL(0).Count).Value = V
End If
End With
Erase COL
End Sub |
Si par contre l'écart entre les colonnes est variable, (exemple: 1,4,6,11)
juste avec une variable tableau indiquant les numéros de colonnes :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| Sub Demo4b()
Dim COL(-1 To 1) As New Collection, C&, R&, V
VA = [{1,3,5}]
With Feuil3.UsedRange.Columns
On Error Resume Next
For Each V In .Item(VA(1)).Value
If V > "" Then COL(0).Add V, V
Next
For C = 2 To UBound(VA)
For Each V In .Item(VA(C)).Value
If V > "" Then COL(1).Add V, V
Next
For Each V In COL(1)
W = COL(0)(V)
COL(W > "").Add V, V
W = ""
Next
Set COL(1) = New Collection
Next
On Error GoTo 0
For Each V In COL(-1): COL(0).Remove V: Next
.Cells(1, 9).CurrentRegion.Clear
If COL(0).Count Then
ReDim V(1 To COL(0).Count, 0)
For R = 1 To COL(0).Count: V(R, 0) = COL(0)(R): Next
.Cells(1, 9).Resize(COL(0).Count).Value = V
End If
End With
Erase COL
End Sub |
Et si vraiment une variable tableau regroupant les colonnes est nécessaire :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| Sub Demo4c()
Dim COL(-1 To 1) As New Collection, C&, R&, V
With Feuil3.UsedRange
VA = Application.Index(.Value, .Parent.Evaluate("ROW(1:" & .Rows.Count & ")"), [{1,3,5}])
On Error Resume Next
For R = 1 To UBound(VA)
If VA(R, 1) > "" Then COL(0).Add VA(R, 1), VA(R, 1)
Next
For C = 2 To UBound(VA, 2)
For R = 1 To UBound(VA)
If VA(R, C) > "" Then COL(1).Add VA(R, C), VA(R, C)
Next
For Each V In COL(1)
W = COL(0)(V)
COL(W > "").Add V, V
W = ""
Next
Set COL(1) = New Collection
Next
On Error GoTo 0
For Each V In COL(-1): COL(0).Remove V: Next
.Cells(1, 9).CurrentRegion.Clear
If COL(0).Count Then
ReDim V(1 To COL(0).Count, 0)
For R = 1 To COL(0).Count: V(R, 0) = COL(0)(R): Next
.Cells(1, 9).Resize(COL(0).Count).Value = V
End If
End With
Erase COL
End Sub |
Partager