2017-10-19 6 views
0
Private Sub CommandButton1_Click() 
For i = 2 To 5 
On Error GoTo X1: 
Range("F" & i) = Application.WorksheetFunction.VLookup(Range("E" & i), Range("A2:B5"), 2, 0) 
GoTo X2: 

X1: 
Range("F" & i) = "No Value found" 

X2: 
Next 
End Sub 

Dans le code ci-dessus, j'ai utilisé le gestionnaire d'erreur "On Eror goto". pour la première fois, le gestionnaire d'erreurs fonctionne correctement. Cependant, le gestionnaire d'erreurs ne fonctionne pas pour la deuxième fois.Erreur d'exécution de vlookup 1004. réponse non encore trouvée

tableaux I utilisés:

enter image description here

+0

Je n'ai jamais vu un message "Erreur d'exécution 1004. Réponse non encore trouvée" avant - êtes-vous sûr que c'est ce qu'il dit?!?! – YowE3K

Répondre

0

Cela pourrait être ce que vous recherchez.

Private Sub CommandButton1_Click() 

    Dim Rslt As Variant 
    Dim Rng As Range 
    Dim R As Long 

    Set Rng = Range("A2:B5") 
    For R = 2 To 5 
     Rslt = "No value found" 
     On Error Resume Next 
     Rslt = Application.WorksheetFunction.VLookup(Cells(R, "E").Value, Rng, 2, 0) 
     Cells(R, "F").Value = Rslt 
    Next R 
End Sub 

Rslt est attribué la valeur qu'il devrait avoir en cas d'échec Vlookup. La tentative est faite pour lui assigner une valeur de recherche. Si cela échoue Rslt conserve la valeur qu'il avait avant la tentative. Pendant ce temps, On Error Resume Next permet au code de continuer. Dans la ligne suivante la valeur actuelle de Rslt est affecté à la cellule dans la colonne F.

  • Évitez l'utilisation de GoTo dans votre code.
  • Spécifiez toujours la propriété Value d'une plage lorsque c'est la propriété que vous souhaitez obtenir ou définir.
  • Il est préférable d'adresser une cellule quand vous voulez dire une cellule et une plage lorsque vous voulez dire une plage. Certes, techniquement, une cellule est une plage, mais lire votre code sera plus facile si vous l'écrivez explicitement.
0
Sub CommandButton1_Click() 
For i = 2 To 5 
On Error Resume Next: 
Range("F" & i) = Application.WorksheetFunction.VLookup(Range("E" & i), Range("A2:B5"), 2, 0) 
If Range("F" & i) = "" Then: Range("F" & i) = "No Value Found" 
Next 
End Sub 

Je vous recommande d'utiliser On Error Resume Next.

Maintenant, si vous avez déjà des données i = 2 à 5, Range ("F" & i), je vous recommande d'utiliser

Sub CommandButton1_Click() 
For i = 2 To 5 
On Error Resume Next: 
vall = "" 
vall = Application.WorksheetFunction.VLookup(Range("E" & i), Range("A2:B5"), 2, 0) 
If vall = "" Then 
Range("F" & i) = "No Value Found" 
Else: Range("F" & i) = vall 
End If 
Next 
End Sub 

Si nous utilisons la vall variable pour tester VLookup retourné rien.

0

Tant que vous êtes en mode de gestion des erreurs, aucune erreur supplémentaire ne peut être détectée. Et vous manquez la déclaration Resume pour quitter le mode de gestion des erreurs:

Private Sub CommandButton1_Click() 
For i = 2 To 5 
On Error GoTo X1: 
Range("F" & i) = Application.WorksheetFunction.VLookup(Range("E" & i), Range("A2:B5"), 2, 0) 
GoTo X2: 

X1: 
Range("F" & i) = "No Value found" 
Resume X2 'Finished error-handling, resume normal processing 
X2: 
Next 
End Sub 

Une meilleure façon de faire ce que vous faites serait:

Private Sub CommandButton1_Click() 
    Dim i As Long 
    Dim result As Variant 
    For i = 2 To 5 
     result = Application.VLookup(Range("E" & i), Range("A2:B5"), 2, 0) 
     If IsError(result) Then 
      result = "No Value found" 
     End If 
     Range("F" & i) = result 
    Next 
End Sub 

En utilisant Application.VLookup, au lieu de Application.WorksheetFunction.VLookup, permet à la condition d'erreur produite par le VLookup d'être renvoyée à votre code, plutôt que de provoquer une erreur dans VBA elle-même, et une fois de retour dans votre code, vous pouvez tester l'erreur de manière contrôlée.