Erreur de return Vlookup lorsque l'élément est dans la list

Problème: l'élément est dans la table VLOOKUP, mais renvoie la valeur de "Manquant" dans la cellule appropriée. Lorsque conUD imprime si je copy le coller dans la window Déboguer et Ctrl + F – le find sur la colonne J, il le trouve sans problème. Pourquoi serait-il trouvé par Ctrl + F et pas VLookup?

Remarques:

  • Ce n'est que le code pertinent, pas le morceau entier.
  • lrVelocity est en train de calculer correctement. La valeur est de 1 951.
  • Les valeurs sont de la forme 0001HCM8889W01 et ne violent donc pas la ressortingction des caractères max de VLOOKUP.
  • Comme vous pouvez le voir, j'ai essayé de couper tous les espaces invisibles et je m'étais assuré qu'il s'agissait des deux cordes.
  • Je suis raisonnablement nouveau pour VBA et j'apprécie toute l'aide avec ce problème. J'ai lu plusieurs articles Google, mais aucune de ces solutions n'a résolu mon problème.
Option Explicit Dim wsMain As Worksheet Dim wsQuantity As Worksheet Dim wsVelocity As Worksheet Dim wsParameters As Worksheet Dim wsData As Worksheet Dim lrMain As Long 'lr = last row Dim lrQuantity As Long Dim lrVelocity As Long Dim lrParameters As Long Dim lrData As Long Dim conUD As Ssortingng 'con=concatenate Dim conECD As Ssortingng Dim calcWeek As Long Dim RC As Long 'Row Counter Dim vl As Variant 'Vlookup, Variant to allow for errors without breaking the code calcWeek = wsParameters.Range("B3").Value lrVelocity = wsVelocity.Cells.Find(What:="*", SearchOrder:=xlByRows, Searchdirection:=xlPrevious).Row Set wsMain = Worksheets("Main Tab") Set wsVelocity = Worksheets("Velocity") For RC = 2 To 10 'lrVelocity With wsVelocity .Cells(RC, 10) = .Cells(RC, 1) & .Cells(RC, 1) & .Cells(RC, 4) & .Cells(RC, 5) & .Cells(RC, 9) .Cells(RC, 10).Value = CStr(Trim(.Cells(RC, 10).Value)) .Cells(RC, 11) = .Cells(RC, 6) .Cells(RC, 12) = .Cells(RC, 7) .Cells(RC, 13) = .Cells(RC, 8) .Cells(RC, 14) = .Cells(RC, 3) .Cells(RC, 22) = .Cells(RC, 1) & .Cells(RC, 9) End With Next RC For RC=2 To 10 conUD = wsMain.Cells(RC, 21) & wsMain.Cells(RC, 4) & calcWeek conUD = CStr(Trim(conUD)) Debug.Print conUD wsVelocity.Activate vl = Application.VLookup(conUD, wsVelocity.Range(wsVelocity.Cells(2, 10), wsVelocity.Cells(lrVelocity, 11)), 2, False) If IsError(vl) Then wsMain.Cells(RC, 10).Value = "Missing" Else wsMain.Cells(RC, 10).Value = vl End If Next RC 

Je pense que @ user1274820 est sur quelque chose. Normalement, nous utilisons Application.Vlookup comme vous l'utilisez, avec l'anticipation que peut-être la valeur ne sera pas trouvée dans la première colonne de table_array , et vous souhaitez gérer cela avec la valeur "Missing" dans la sortie.

TOUTEFOIS , si la valeur est trouvée, mais la valeur dans la colonne de return (k, dans votre cas) est une erreur, la fonction renverra l'erreur également. Dans votre cas, alors que la valeur se trouve dans la colonne J, il semblerait que la colonne K contienne un #N/A (Faites-moi savoir si ce n'est pas le cas!)

Application.Vlookup renvoie une Error 2042 dans ces deux cas:

  1. lookup_value n'est pas trouvé dans la première colonne de table_array (utilisation et attente les plus courantes, IMO)
  2. lookup_value IS found, mais la valeur résultante de col_index_num est elle-même une erreur.

Donc, si la valeur de return peut contenir une erreur même si la valeur de search existe, nous ne pouvons pas utiliser Application.Vlookup pour tester la présence de la valeur, mais vous pouvez utiliser une autre méthode comme WorksheetFunction.CountIf ou Application.Match .

Ici, nous demandons simplement d'interroger la colonne J et d'utiliser CountIf pour s'assurer qu'il y ait au less 1 valeur correspondante. Cela validera notre Vlookup à l'avance, mais nous devons toujours gérer l'erreur possible dans la valeur de return.

 For RC = 2 to 10 conUD = wsMain.Cells(RC, 21) & wsMain.Cells(RC, 4) & calcWeek conUD = CStr(Trim(conUD)) Debug.Print conUD With wsVelocity Dim lookupRange as Range Set lookupRange = .Range(.Cells(2, 10), .Cells(lrVelocity, 11)) End With If Application.WorksheetFunction.CountIf(lookupRange.Columns(1), conUD) <> 0 Then 'The value is found, it should be safe to use VLOOKUP vl = Application.VLookup(conUD, lookupRange, 2, False) '## Handles an error in the return value from the return column If IsError(vl) Then '## Copies the error from return column, or modify as needed wsMain.Cells(RC, 10).Value = CVerr(vl) Else '## Value found in Col J and return Vlookup from Col K wsMain.Cells(RC, 10).Value = vl End If Else '## Value NOT FOUND in column J wsMain.Cells(RC, 10).Value = "Missing" End If Next 

Mettre à jour

Du chat, je peux voir que le formatting de vos valeurs de tables principales et de search est différent. Dans votre table de search, vous doublez un préfixe, par exemple "0001HCM8889" et vous finissez par "0001HCM8890001HCM889W01".

C'est pourquoi Find ou Ctrl + F finda la cellule, mais VLOOKUP ne le sera pas, car il nécessite une correspondance exacte.

Comme il semble que vous construisez / désinitialisez la table de search dans votre première boucle, vous devriez pouvoir la réparer en procédant comme suit:

 For RC = 2 To 10 'lrVelocity With wsVelocity '## Removed the duplicate .Cells(RC, 1) from the next line ## .Cells(RC, 10) = .Cells(RC, 1) & .Cells(RC, 4) & .Cells(RC, 5) & .Cells(RC, 9) .Cells(RC, 10).Value = CStr(Trim(.Cells(RC, 10).Value)) .Cells(RC, 11) = .Cells(RC, 6) .Cells(RC, 12) = .Cells(RC, 7) .Cells(RC, 13) = .Cells(RC, 8) .Cells(RC, 14) = .Cells(RC, 3) .Cells(RC, 22) = .Cells(RC, 1) & .Cells(RC, 9) End With Next RC