Macro Excel pour copyr des cellules de plage d'une feuille à une autre en fonction de la correspondance de cellule et ignorer la cellule si aucune correspondance

Je suis novice dans les macros dans Excel et j'essaie de créer une qui m'aidera à copyr des données de cellules d'une feuille à une autre en fonction de la correspondance. En principe, je souhaite que Excel search la colonne H à partir de Sheet1 et si datatables de n'importe quelle cellule correspondent aux données de n'importe quelle cellule de la colonne E de Sheet2, elles copyront une colonne de Sheet1 à Sheet2 vers la ligne correspondante (où la correspondance a été trouvée) .

Par exemple: si datatables de H5 (feuille 1) correspondent aux données de E1 (feuille2) que les cellules I5 à J5 (feuille1) doivent être copiées dans les cellules F1 à G1.

Actuellement, j'ai cette macro qui fait partie du travail:

Sub asd() For Counter = 1 To 10 If Sheets(1).Range("H" & Counter).Value = Sheets(2).Range("E" & Counter).Value Then Sheets(2).Range("F" & (Counter)).Value = Sheets(1).Range("I" & Counter).Value Sheets(2).Range("G" & (Counter)).Value = Sheets(1).Range("J" & Counter).Value End If Next Counter End Sub 

Le problème est que dès qu'il n'y a pas de correspondance entre la colonne H (feuille1) à la colonne E (Sheet2), la macro s'arrête. Je suis sûr qu'il existe un moyen simple de le faire passer à la ligne suivante s'il n'y a pas de correspondance jusqu'à ce que toutes les lignes soient terminées.

Quelqu'un peut-il modifier ce code pour le faire fonctionner?

En supposant que vous souhaitez que votre code soit exécuté pour plus de 10 premières lignes des deux feuilles, essayez ceci:

 Sub asd() 'this runs through all used rows in sheet 1 For Counter = 1 To Sheets(1).UsedRange.Rows.Count 'this ensures that cell H<row> has a non-blank value 'you can leave this If statement out if you know there will be no blanks in Column H If sheets(1).Range("H" & counter) <> "" then If Sheets(1).Range("H" & Counter).Value = Sheets(2).Range("E" & Counter).Value Then Sheets(2).Range("F" & (Counter)).Value = Sheets(1).Range("I" & Counter).Value Sheets(2).Range("G" & (Counter)).Value = Sheets(1).Range("J" & Counter).Value End If End if Next Counter End Sub 

Vous avez besoin de 2 loops pour comparer la valeur de Sheet1 avec toutes les autres dans Sheet2:

  Sub asd() Dim lngLastRowSht1 As Long Dim lngLastRowSht2 As Long Dim counterSht1 As Long Dim counterSht2 As Long With Worksheets(1) lngLastRowSht1 = .Cells(.Rows.Count, 8).End(xlUp).Row lngLastRowSht2 = Worksheets(2).Cells(Worksheets(2).Rows.Count, 5).End(xlUp).Row For counterSht1 = 1 To lngLastRowSht1 For counterSht2 = 1 To lngLastRowSht2 If .Cells(counterSht1, 8) = Worksheets(2).Cells(counterSht2, 5) Then Worksheets(2).Cells(counterSht2, 6) = .Cells(counterSht1, 9) Worksheets(2).Cells(counterSht2, 7) = .Cells(counterSht1, 10) End If Next counterSht2 Next counterSht1 End With End Sub 

Grands gars! Les deux codes fonctionnent parfaitement.

Il faut append une autre chose à cela. Comment définir une gamme de colonne qui doit être copiée? Par exemple, au lieu d'avoir ces lignes deux fois:

 Sheets(2).Range("F" & (Counter)).Value = Sheets(1).Range("I" & Counter).Value Sheets(2).Range("G" & (Counter)).Value = Sheets(1).Range("J" & Counter).Value 

Ou ceci deux fois

 Worksheets(2).Cells(counterSht2, 6) = .Cells(counterSht1, 9) Worksheets(2).Cells(counterSht2, 7) = .Cells(counterSht1, 10) 

Comment puis-je définir "Je veux que toutes les colonnes entre I et AL (feuille 1) soient copiées sur toutes les colonnes entre F à AI (feuille 2)"? Je dois travailler avec 500 colonnes et prendre beaucoup de time pour faire une ligne pour chacune.

Merci beaucoup!

Mihai

J'ai combiné les deux suggestions offertes par FreeMan et Branislav Kollár et je propose un code qui permet de sélectionner une plus grande gamme à copyr. Si quelqu'un veut cela à l'avenir, voir ci-dessous le code que j'ai obtenu:

 Sub CopyCells() Dim lngLastRowSht1 As Long Dim lngLastRowSht2 As Long Dim counterSht1 As Long Dim counterSht2 As Long With Worksheets(1) lngLastRowSht1 = .Cells(.Rows.Count, 8).End(xlUp).Row lngLastRowSht2 = Worksheets(2).Cells(Worksheets(2).Rows.Count, 5).End(xlUp).Row For counterSht1 = 1 To lngLastRowSht1 For counterSht2 = 1 To lngLastRowSht2 If Sheets(1).Range("H" & (counterSht1)).Value = Sheets(2).Range("E" & counterSht2).Value Then Sheets(2).Range("F" & (counterSht2), "H" & (counterSht2)).Value = Sheets(1).Range("I" & counterSht1, "K" & counterSht1).Value End If Next counterSht2 Next counterSht1 End With End Sub 

Merci!

Mihai