RECHERCHEV en VBA avec index differé
Bonjour,
je souhaite faire une sorte de recherche verticale avec (comme exemple) ces deux tableaux :
3
4
6
8
9
12et
1 200
2 250
3 546
4 948
5 145
6 784
7 15
8 100
9 741
10 365Donc rechercher où les valeurs du premier tableau se trouvent, et une fois qu'il les a trouvés, me donner le nombre correspondant de la deuxième colonne.
Donc je voudrais avec VBA obtenir une nouvelle colonne (en position D dans le tableur par exemple), ce qui donnerait au final :
3 1 200 546
4 2 250 948
6 3 546 784
8 4 948 100
9 5 145 741
12 6 784 N/A
7 15
8 100
9 741
10 365 Il faut prendre en compte que lorsque j'applique cette méthode, le nombre de lignes peut varier (je voudrais l'automatiser pour le faire tous les mois sur différentes colonnes).
Il faut donc parcourir la colonne en entier et non pas sur une plage précise.
Voici ce que j'ai pu essayer :
Sub recherche()
Dim Plage As Range
Dim PlgValeur As Range
Dim Cel As Range
Dim Valeur As Integer
Dim I As Integer
With Worksheets("Feuil1") '<--adapter le nom de la feuille...
'matrice en colonnes B et C
Set Plage = .Range(.Cells(1, 2), .Cells(.Rows.Count, 3).End(xlUp))
'plage des valeurs à chercher en colonne A
Set PlgValeur = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With
For Each Cel In PlgValeur
'gère l'erreur de la non correspondance pour la fonction "VLookup" qui retourne la valeur de la colonne C
On Error Resume Next
Valeur = Application.WorksheetFunction.VLookup(Cel.Value, Plage, 2, False)
'si pas d'erreur inscrit la valeur correspondante en colonne D
If Err.Number = 0 Then
I = I + 1
Cells(I, 4).Value = Valeur
End If
Next Cel
End SubMais cela ne me renvoie que la première ligne (546 dans l'exemple).
Sinon autre chose :
Sub recherche()
Dim C As Range, I As Long
For Each C In Range([A1], Cells(Rows.Count, 1).End(xlUp))
For I = 1 To Cells(Rows.Count, 2).End(xlUp).Row
If Cells(I, 2) = C.Value Then
Cells(C, 5).Value = Cells(I, 3).Value
End If
Next I
Next C
End SubMais ça me met "incompatibilité de type" et me surligne la ligne avec "Cells(C, 5).Value = Cells(I, 3).Value". Je précise bien que je veux que la colonne D soit en phase avec la colonne A. (Donc remplacer Cells(C,5) par Cells(I,5) ne donne pas ce que je veux).
Je tourne en rond depuis tout à l'heure...
J'ai essayé avec ou sans les value, rien à faire, je ne sais pas d'où ça vient...
Si quelqu'un a une idée, peut-il m'éclairer?
Merci beaucoup pour votre temps!
Après quelques tests, j'ai pu remarquer que lorsque le code (le premier, qui semble plus marcher) ne trouvait pas de valeur avec la recherche, il ne sautait pas la ligne.
Voici le résultat avec des valeurs qui ne sont pas dans le tableau :
3 1 200 546
10 2 250 365
6 3 546 784
8 4 948 100
9 5 145 741
12 6 784 145
14 7 15
5 8 100
9 741
10 365 Alors qu'il faudrait :
3 1 200 546
10 2 250 365
6 3 546 784
8 4 948 100
9 5 145 741
12 6 784
14 7 15
5 8 100 145
9 741
10 365 Une idée? Merci par avance! Je sais qu'il manque pas grand chose pour la victoire!
Bonjour,
et si tu remplaces
Cells(I, 4).Value = Valeurpar
Cel.offset(,3) = Valeurça donne quoi ?
eric
Bonjour,
J'obtiens un résultat correct avec
Sub recherche()
Dim C As Range, I As Long
For Each C In Range([A1], Cells(Rows.Count, 1).End(xlUp))
For I = 1 To Cells(Rows.Count, 2).End(xlUp).Row
If Cells(I, 2) = C.Value Then
Cells(C.Row, 5).Value = Cells(I, 3).Value
End If
Next I
Next C
End SubA+
Bonjour à tous!
Ça marche! Merci beaucoup pour votre aide ça déchire! Je vais pouvoir faire des recherches à foison désormais.
Merci encore, à bientôt.