2017-10-19 1 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 

im obigen Code habe ich die "On Eror Goto" Fehlerbehandlung verwendet. Zum ersten Mal funktioniert der Fehlerhandler einwandfrei. Der Fehlerhandler funktioniert jedoch nicht zum zweiten Mal.vlookup Laufzeitfehler 1004. Antwort noch nicht gefunden

Tabellen I verwendet:

enter image description here

+0

Ich habe noch nie eine "Laufzeitfehler 1004. Antwort noch nicht gefunden" Nachricht gesehen - sind Sie sicher, dass es das sagt?!?! – YowE3K

Antwort

0

Dies könnte das sein, was Sie suchen.

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 wird der Wert zugewiesen, um ihn im Falle erfolgloser Vlookup haben sollte. Es wird versucht, einen Lookup-Wert zuzuweisen. Wenn das fehlschlägt, behält Rslt den Wert bei, den es vor dem Versuch hatte. Unterdessen ermöglicht On Error Resume Next den Code, um fortzufahren. In der nächsten Zeile wird der aktuelle Wert von Rslt an der Zelle in Spalte F.

  • Vermeiden Sie die Verwendung von GoTo im Code zugewiesen.
  • Geben Sie immer die Value -Eigenschaft eines Bereichs an, wenn dies die Eigenschaft ist, die Sie abrufen oder festlegen möchten.
  • Es ist besser, eine Zelle zu adressieren, wenn Sie eine Zelle und einen Bereich meinen, wenn Sie einen Bereich meinen. Es stimmt, technisch gesehen ist eine Zelle ein Bereich, aber das Lesen Ihres Codes wird einfacher, wenn Sie es explizit schreiben.
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 

würde ich empfehlen Weiter mit On Error Resume.

Nun, wenn Sie bereits Daten in i haben = 2 bis 5, Range ("F" & i), dann würde ich empfehlen,

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 

mit dem wir die Variable vall verwenden, es zu testen VLookup zurück nichts.

0

Während Sie sich noch im Fehlerbehandlungsmodus befinden, können keine weiteren Fehler mehr auftreten. Und Sie fehlten die Resume Anweisung Fehlerbehandlungsmodus verlassen:

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 

Eine bessere Art und Weise zu tun, was Sie würden tun:

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 

Application.VLookup Verwendung anstelle von Application.WorksheetFunction.VLookup, ermöglicht es, die Fehlerbedingung, die von VLookup erzeugt wird, in Ihren Code zurückzuversetzen, anstatt einen Fehler in VBA selbst zu verursachen. Sobald Sie wieder in Ihrem Code sind, können Sie den Fehler kontrolliert testen.

Verwandte Themen