[VBA-E]Trouver et recopier des cellules d'une feuille à une autre
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| Sub findproc()
Dim i As Integer, j As Integer, feuil1 As Worksheet, feuil2 As Worksheet, critere As String, reponse As Range, NbLignesFeuil2 As Long, NbLignesFeuil1 As Long, li As Long, co As Long
Set feuil1 = ThisWorkbook.Worksheets("feuil1")
Set feuil2 = ThisWorkbook.Worksheets("feuil2")
NbLignesFeuil1 = feuil1.Cells(65536, 1).End(xlUp).Row
NbLignesFeuil2 = feuil2.Cells(65536, 1).End(xlUp).Row
For i = 2 To NbLignesFeuil2
critere = feuil2.Cells(i, 1)
Set reponse = feuil1.Range(Cells(2, 1), Cells(NbLignesFeuil1, 1)).Find(critere, feuil1.Cells(2, 1), xlValue, xlWhole, xlByRows, xlNext)
If Not reponse Is Nothing Then
li = reponse.Row
f2.Cells(i, 2) = f1.Cells(li, 2)
End If
Next i
End Sub |
Je dispose de deux feuilles. Les elements des premieres colonnes de chaque feuilles constituent une clé. Je n'ai donc pas besoin de findnext car la premiere reponse trouvé par find suffit amplement.
Précédemment, j'avais commencé par du:
Code:
1 2 3 4 5 6 7 8 9
| for i=1 to NbLignesFeuil1
for j=1 to NbLignesFeuil2
if feuil1.cells(i,1) = feuil2.cells(i,2) then
....
end if
next j
next i |
En terme de performance, c'était très mauvais (sur ma bécanne, en 10000 * 5000 lignes, ça prend 50 minutes...oui le PC est mauvais mais je n'y peux rien).
Ensuite je suis passé à du
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| for i=1 to NbLignesFeuil1
j=0
do
j=j+1
loop while j<=NbLignesFeuil2 and feuil1.cells(i,1) <> feuil2.cells(i,2)
if j<=NbLignesFeuil2 then
.......
end if
next i |
c'est mieux, on passe a 30 minutes.
Mais quand je compare a du vlookup, je me dis que ça reste vraiment très mauvais.
Pour des raisons assez ininteressantes, Vlookup ne m'interesse pas.
Je me tourne vers .find. Mais dans mon code, la methode range echoue.
Quelqu'un sait pourquoi?
(ps: les fichiers d'aide vba ont été suprimé)
Question subsidiaire: le .find est-il le plus rapide possible?