AW: Application.Match und Fehler
28.04.2016 11:30:57
Daniel
Hi
VBA ist ein Konglomerat aus verschiedenen Bereichen, z.B. "klassische" Basic-Funktionen und speziellen Funktionen der Anwendung (hier Excel)
da kann es schon mal du Dopplungen kommen.
der für den Anwender wichtige Unterschied zwischen Application.Match und Worksheetfunction.Match ist, dass:
- Worksheetfunction.Match(Suchbegriff, Vektor, 0) bei nicht vorhandenem Suchbegriff direkt einen Fehlerabbruch erzeugt
- Application.Match(Suchbegriff, Vektor, 0) bei nicht vorhandenem Suchbegriff normal weiter arbeitet und einen Fehlerwert als Ergebnis ausgibt
jetzt sind Fehlerwerte in VBA sehr kapriziös und erfordern eine spezielle Behandlung.
So können Beispielsweise nur Variant-Variablen Fehlerwerte aufnehmen und du kannst Fehlerwerte nicht mit "normalen" Werten in Beziehung setzen (vergleichen usw) oder verarbeiten.
dh. wenn bei Application.Match ein Fehlerabbruch erfolgt, liegt es an der unsachgemäßen Weiterverarbeitung des Funktionsergebnisses.
sauber programmiert (ohne On Error) könnte dein Code so aussehen:
Dim Zeile as Variant
Zeile = Application.Match(Nummer, Columns(3), 0)
if Vartype(Zeile) = vbDouble Then
w1 = .Cells(Zeile, 16).Value
w2 = .Cells(Zeile, 17).Value
w3 = .Cells(Zeile, 18).Value
Worksheets("Muster 2").Cells(Start, 10) = w1 & Chr(47) & w2 & Chr(47) & w3
else
Worksheets("Muster 2").Cells(Start, 10) = "ohne"
end If
eine andere Möglichkeit das sauber zu lösen wäre:
dim Zeile as Long
if Worksheetfunction.CountIf(.Columns(3), Nummer) > 0 Then
Zeile = Worksheetfunction.Match(Nummer, .columns(3), 0)
w1 = .Cells(Zeile, 16).Value
w2 = .Cells(Zeile, 17).Value
w3 = .Cells(Zeile, 18).Value
Worksheets("Muster 2").Cells(Start, 10) = w1 & Chr(47) & w2 & Chr(47) & w3
Else
Worksheets("Muster 2").Cells(Start, 10) = "ohne"
End If
was programmiertechnisch auch sauber ist, weil eine bekannte Fehlermöglichkeit vorausschauend verhindert wird so dass es erst gar nicht zu Fehler kommt, dafür aber etwas langsamer ist, weil der Zellbereich zweimal durchsucht wird und nicht nur einmal.
Gruß Daniel