Je cherche à créer une recherche verticale dans un classeur via VBA.
L'erreur "impossible de lire la propriété Vlookup de la classe wworksheetFunction" s'affiche sur ma dernière ligne.
Je n'arrive pas à voir d'où vient mon erreur. Pourriez-vous m'aider SVP?
VB:
Public Sub Correction_SPL_MOULIN_CC()
Dim LastRowNonVide1 As Integer 'Numero de la dernière ligne "Pour Analyse"
Dim LastRowNonVide2 As Integer 'Numero de la dernière ligne "Moulin CC OUT Nettoyé"
Dim x as integer
LastRowNonVide1 = Sheets("Pour Analyse").Cells(Rows.Count, 1).End(xlUp).Row
LastRowNonVide2 = Sheets("Moulin CC OUT Nettoyé").Cells(Rows.Count, 1).End(xlUp).Row
For x = 2 To LastRowNonVide1
Sheets("Pour Analyse").Cells(x, 18).value = WorksheetFunction.VLookup(Sheets("Pour Analyse").Cells(x, 5).value, Range(Sheets("Moulin CC OUT Nettoyé").Cells(x, 6), Sheets("Moulin CC OUT Nettoyé").Cells(LastRowNonVide2, 6)), 2, False)
Next x
End Sub
Bonjour Tom,
Quelque chose me chiffonne. Votre RechercheV va de
Sheets("Moulin CC OUT Nettoyé").Cells(x, 6)
à
Sheets("Moulin CC OUT Nettoyé").Cells(LastRowNonVide2, 6)
donc uniquement sur la colonne 6. Or vous voulez remonter la colonne 2, ce qui n'est pas dans la zone de recherche.
Peut être, suivant votre fichier :
VB:
WorksheetFunction.VLookup(Sheets("Pour Analyse").Cells(x, 5).Value, Range(Sheets("Moulin CC OUT Nettoyé").Cells(x, 6), Sheets("Moulin CC OUT Nettoyé").Cells(LastRowNonVide2, 7)), 2, False)
Bonjour Tom,
Quelque chose me chiffonne. Votre RechercheV va de
Sheets("Moulin CC OUT Nettoyé").Cells(x, 6)
à
Sheets("Moulin CC OUT Nettoyé").Cells(LastRowNonVide2, 6)
donc uniquement sur la colonne 6. Or vous voulez remonter la colonne 2, ce qui n'est pas dans la zone de recherche.
Peut être, suivant votre fichier :
VB:
WorksheetFunction.VLookup(Sheets("Pour Analyse").Cells(x, 5).Value, Range(Sheets("Moulin CC OUT Nettoyé").Cells(x, 6), Sheets("Moulin CC OUT Nettoyé").Cells(LastRowNonVide2, 7)), 2, False)
Merci pour ce retour rapide!
Oui en effet il y a une erreur de frappe mais qui ne corrige pas l'erreur. Le bon code est :
VB:
Sheets("Pour Analyse").Cells(x, 18).Value = WorksheetFunction.VLookup(Sheets("Pour Analyse").Cells(x, 5).Value, Range(Sheets("Moulin CC OUT Nettoyé").Cells(x, 5), Sheets("Moulin CC OUT Nettoyé").Cells(LastRowNonVide2, 6)), 2, False)
Je crois que mon erreur vient de mon range...
A la place de
Code:
Range(Sheets("Moulin CC OUT Nettoyé").Cells(x, 5), Sheets("Moulin CC OUT Nettoyé").Cells(LastRowNonVide2, 6))
Je devrais avoir quelque chose qui va chercher dans les 2 colonnes 5 et 6 non? Et du coup c'est la variable x qui n'irait pas...
J'ai essayé ça mais non (2 à la place de x)
Code:
Sheets("Pour Analyse").Cells(x, 18).Value = WorksheetFunction.VLookup(Sheets("Pour Analyse").Cells(x, 12).Value, Range(Sheets("Moulin CC OUT Nettoyé").Cells(2, 5), Sheets("Moulin CC OUT Nettoyé").Cells(LastRowNonVide2, 6)), 2, False)
J'ai une solution mais j'aimerai votre avis SVP.
Je demande à VBA d'ignorer l'erreur (quand il ne trouve pas la valeur cherchée) :
VB:
Public Sub Correction_SPL_MOULIN_CC()
Dim LastRowNonVide1 As Integer 'Numero de la dernière ligne
Dim LastRowNonVide2 As Integer 'Numero de la dernière ligne
Dim x As Integer
LastRowNonVide1 = Sheets("Pour Analyse").Cells(Rows.Count, 1).End(xlUp).Row
LastRowNonVide2 = Sheets("Moulin CC OUT Nettoyé").Cells(Rows.Count, 1).End(xlUp).Row
Stop
For x = 2 To LastRowNonVide1
Sheets("Pour Analyse").Cells(x, 18).Value = WorksheetFunction.VLookup(Sheets("Pour Analyse").Cells(x, 12).Value, Range(Sheets("Moulin CC OUT Nettoyé").Cells(2, 5), Sheets("Moulin CC OUT Nettoyé").Cells(LastRowNonVide2, 6).Cells), 2, False)
On Error GoTo INCONNU
Next x
INCONNU:
Sheets("Pour Analyse").Cells(x, 18).Value = "INCONNU"
Resume Next
End Sub
Bonjour.
Conseil: Utilisez des tableaux dynamiques et un Scripting.Dictionary.
Une autre possibilité: une formule sur toute la plage à laquelle on lui réattribue à la fin sa valeur.
Vous avez trouvé une solution au problème, mais il demeure qu'écrit dans ce style ça reste surement long à exécuter.
Si vous aviez joint un modèle de votre classeur, je vous aurais depuis longtemps proposé une solution testée.
Public Sub Correction_SPL_MOULIN_CC()
Dim xlWbk As Workbook
Dim xlWsh As Worksheet, xlWsh1 As Worksheet
Dim rngRef As Range, rngData As Range
Dim LastRowNonVide1 As Long 'Numero de la dernière ligne "Pour Analyse"
Dim LastRowNonVide2 As Long 'Numero de la dernière ligne "Moulin CC OUT Nettoyé"
Dim x As Integer
Dim v As Variant
Set xlWbk = ThisWorkbook
Set xlWsh = xlWbk.Worksheets("Pour Analyse")
Set xlWsh1 = xlWbk.Worksheets("Moulin CC OUT Nettoyé")
LastRowNonVide1 = xlWsh.Cells(xlWsh.Rows.Count, 1).End(xlUp).Row
LastRowNonVide2 = xlWsh1.Cells(xlWsh1.Rows.Count, 1).End(xlUp).Row
For x = 2 To LastRowNonVide1
Set rngRef = xlWsh.Cells(x, 5)
Set rngData = xlWsh1.Range(xlWsh1.Cells(2, 5), xlWsh1.Cells(LastRowNonVide2, 6))
v = WorksheetFunction.VLookup(rngRef.Value, rngData, 2, False)
xlWsh.Cells(x, 18).Value = IIf(IsError(v), 0, v)
Next x
End Sub