Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1488to1492
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Meldung Typen unverträglich bei Application.Match

Meldung Typen unverträglich bei Application.Match
27.04.2016 15:26:47
Gregor
Hallo zusammen
Bei folgendem Code erhalte ich die Fehlermeldung Typen unverträglich:
With Worksheets("Muster 1")
Zeile = .Application.Match(Nummer, .Columns(3), 0)
If Not IsError(Zeile) 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
End With
Nummer habe ich mit der Variable Double deklariert. Es fällt auf, dass die Fehlermeldung dann kommt, wenn der Wert "Nummer" in Spalte 3 nicht vorhanden ist. Eigentlich will ich das aber mit "If not is Error" auffangen.
Was muss ich ändern?
Danke und Gruss
Gregor

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Typen unverträglich
27.04.2016 15:45:18
Rudi
Hallo,
als Typ für Zeile musst du Variant nehmen.
Gruß
Rudi

AW: Typen unverträglich
27.04.2016 16:06:19
Herbert
Hallo Rudi,
Du hast Post!
Servus

Besser .Find statt Application.Match
27.04.2016 17:26:28
Daniel
Hi
VLookUp oder Match mit letztem Parameter = 0 lässt sich in VBA oft besser mit der .FIND-Funktion darstellen:
dim Zelle as Range
set Zelle = Worksheets("Muster 1").Columns(3).Find(what:=Nummer, lookat:=xlwhole, lookin:= _
xlvalues)
if Zelle is nothing then
Worksheets("Muster 2").Cells(Start, 10) = "ohne"
Else
w1 = zelle.offset(0, 13).value
w2 = Zelle.offset(0, 14).value
w3 = Zelle.offset(0, 15).value
Worksheets("Muster 2").Cells(Start, 10).value = join(Array(w1, w2, w3), Chr(10))
End if
Gruß Daniel

Anzeige
Hier unterliegst du noch einem anderen Irrtum, ...
27.04.2016 18:58:04
Luc:-?
…Gregor;
mit Rudis Vorschlag kann bei deiner Verwendung von nur Application vor .Match erst gar kein Ablauf­Fehler entstehen. Aber auch, wenn du deine Zeile-Deklaration so lässt, dann kannst du aber auch WorksheetFunction.Match verwenden, geht das, nur nicht so falsch, wie du das konstruiert hast.
Merke: Ein Fehler sollte im Moment seiner Entstehung abgefangen wdn, nicht erst irgendwann danach!
    On Error GoTo fb
'    …
With Worksheets("Muster 1")
On Error Resume Next
If IsError(.Application.Match(Nummer, .Columns(3), 0)) Then
Worksheets("Muster 2").Cells(Start, 10) = "ohne"
Else: Zeile = .Application.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
End If
On Error GoTo fb
End With
'    …
fb: If CBool(Err.Number) Then
'    …
Außerdem löst auch eine Negation in der Abfrage das Problem nicht, denn dabei entsteht ja auch der Fehler und dann wird ggf ein FehlerSprung wirksam oder der nächste Befehl abgearbeitet, also der unmittelbar danach. Eine Umkehrung der Reihenfolge mit Not kann hier niemals wirken → If Not IsError(…) Then ist also absoluter Quatsch!
Mit WorksheetFunction würde ich das so machen:
        Zeile = 0: On Error Resume Next
Zeile = WorksheetFunction.Match(Nummer, .Columns(3), 0)
On Error GoTo fb
If CBool(Zeile) 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
Gruß, Luc :-?
Besser informiert mit …

Anzeige
AW: Hier unterliegst du noch einem anderen Irrtum, ...
28.04.2016 08:40:33
Gregor
Hallo zusammen
Danke allen für die Unterstützung.
Vor allem für die professionellen Erläuterungen und für den Code von Luc, der wunschgemäss funktioniert. Ist es richtig, dass ich beim WorksheetFunction Code "On Error GoTo fb" weglassen kann? Wird auch nicht abgefangen.
Was bewirkt eigentlich WorksheetFunction.Matsch anstelle von Application.Match?
Vielen Dank und Gruss
Gregor

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

Anzeige
AW: Application.Match und Fehler
28.04.2016 15:58:47
Gregor
Hallo Daniel und Luc
Beiden nochmals herzlichen Dank, ich habe wieder etwas gelernt.
Gruss Gregor

Nee, kannste nich, ...
28.04.2016 11:33:57
Luc:-?
…Gregor,
da ja oben On Error GoTo fb steht, ich habe das bloß nicht noch mal notiert. Du kannst oben stattdessen natürlich auch On Error GoTo 0 schreiben und dann die FehlerBehandlung (deshalb fb) weglassen. Das ist aber nicht zu empfehlen, weil der NormalNutzer sonst uU im VBE landet oder, wenn das VBA-Projekt gesperrt/geschützt ist, ihm unverständliche FehlerMeldungen bekommt. Eine Fehlerbehandlung ist also (fast) immer notwendig und sinnvoll.
Die beiden Notationsweisen stellen quasi 2 Eingänge für dieselbe Prozedur da. WorksheetFunction. wird vom VBE-Intellisense unterstützt, d.h. nach . wird dir eine AuswahlListe der möglichen Fktt angeboten, Application. zwar auch, aber ohne die FktsAnzeige! WorksheetFunction.Matsch dürfte allerdings weniger Freude bereiten… ;-]
Der FktsContainer gibt idR keine Fehlerwerte zurück, die Anwendung schon. Man muss also bei WorksheetFunction-Verwendung anderweitig dafür Sorge tragen, von der eigentlich angewendeten Fkt verursachte Fehler zu erkennen. Mitunter kann dann Application günstiger sein (dann Rudis Hinweis beachten!).
Luc :-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige