Bonjour,
je n'ai pas cherché à corriger le code dépassant vingt lignes pour une simple copie !
Même si la logique est bonne, un code pur VBA est bien moins efficace (car interprété)
que celui conçu autour des fonctionnalités internes d'Excel (pré-compilées elles !) …
En respectant la règle TBTO, démonstration testée sur une version Windows
avec des données contigües (bloc sans ligne ni colonne vide) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Sub Demo()
Dim Rc As Range, Rw As Range
Application.ScreenUpdating = False
For Each Rw In Feuil1.Cells(1).CurrentRegion.Rows
With Feuil2.Cells(1).CurrentRegion.Columns(1)
Set Rc = .Find(Rw.Cells(1).Value)
If Rc Is Nothing Then Set Rc = .Cells(.Rows.Count).Offset(1)
Rw.Copy Rc
End With
Next
Set Rc = Nothing
End Sub |
Un bon code n'utilise pas de
Select ni d'
Activate surtout au sein d'une boucle ! Sinon ralentissement …
_____________________________________________________________________________________________________
Merci de cliquer sur

pour chaque message ayant aidé puis sur

pour clore cette discussion …
_____________________________________________________________________________________________________
Je suis Charlie - Je suis Bardo
Désolé, je n'avais pas vu l'utilisation de la fonction de feuille de calculs EQUIV et la copie des valeurs uniquement …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Sub Demo2()
Dim Rw As Range
Application.ScreenUpdating = False
With Feuil2
With .Cells(1).CurrentRegion
C& = .Columns.Count
R& = .Rows.Count
End With
For Each Rw In Feuil1.Cells(1).CurrentRegion.Rows
V = Application.Match(Rw.Cells(1).Value, .Cells(1).Resize(R), 0)
If IsError(V) Then R = R + 1: V = R
.Cells(V, 1).Resize(, C).Value = Rw.Value
Next
End With
End Sub |
La variable
V est de type
Variant afin de ne pas déclencher d'erreur …
_____________________________________________________________________________________________________
Merci de cliquer sur

pour chaque message ayant aidé puis sur

pour clore cette discussion …
Partager