XL 2016 VLookup dans VBA, incompréhension erreur.

Tom33700

XLDnaute Nouveau
Bonjour à tous,

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

Merci d'avance pour votre aide!
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
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)
si la valeur à remonter était en colonne 7.
 

Tom33700

XLDnaute Nouveau
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)
si la valeur à remonter était en colonne 7.
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 n'arrive pas à comprendre...
 

Tom33700

XLDnaute Nouveau
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)
 

Tom33700

XLDnaute Nouveau
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
 

Dranreb

XLDnaute Barbatruc
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.
 

flc13090

XLDnaute Nouveau
Salut
A tester
VB:
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
 

Discussions similaires

Statistiques des forums

Discussions
311 730
Messages
2 081 978
Membres
101 854
dernier inscrit
micmag26