Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

bei dismatch Fehlermeldung abfangen
#1
Hallo,

ich habe eine For-Next-Schleife, welche eine Liste durchsucht und nach den Einträgen "blau" oder "rot" sucht. Wenn es einen Treffer gibt, dann soll sie in der Zelle daneben den Inhalt auslesen, diesen als Grundlage nehmen um über eine Matchsuche einen möglichen Eintrag in einer anderen Spalte zu finden. Wird er gefunden, soll dieser gelöscht werden. So weit so gut. Ist dieser Eintrag aber nicht vorhanden, also ein "Dismatch", dann kommt logischerweise eine Fehlermeldung und das Makro bricht ab. Es ist aber ok kein Match zu haben, denn das kann durchaus vorkommen. In diesem Fall will ich eigentlich nur, dass die Schleife mit der nächsten Überprüfung startet. Also im Prinzip, ignoriere dass du keine Match hast, überspringe alle weiteren Schritte, bis du zu "Next" kommst und geh somit in die nächste Runde der Schleife.

Hab mir verschiedene Ansätze gegoogelt, bekomme sie aber nicht umgesetzt. Ich hänge immer bei einer Fehlermeldung in der Zeile  dblmatch = WorksheetFunction.Match(cellname, Range("H1:H43"), 0). Der letzte Versuch war mit "If IsError(dblmatch) Then dblmatch = 2" auf eine leere Zelle zu leiten. Dahin komme ich aber nicht.

Kann mir jemand helfen den Code so zu ändern, dass der Fehler umgangen wird?



Dim Zelle As Range

ActiveSheet.Unprotect

  For Each Zelle In Range("C5:C43")
    If Zelle.Value = "blau" Or Zelle.Value = "rot" Then
      cellname = Zelle.Offset(0, -1).Value
 
      dblmatch = WorksheetFunction.Match(cellname, Range("H1:H43"), 0)
      
        If IsError(dblmatch) Then dblmatch = 2

      ActiveSheet.Range("H" & dblmatch).ClearContents
       
       
    End If
       
    End If

  Next Zelle

 
  ActiveSheet.Protect

End Sub
Antworten Top
#2
Hi,

ersetze Worksheetfunction durch Application
Antworten Top
#3
Hallo Boris,

wow, tatsächlich das hat funktioniert. Vielen Dank. Wäre ich nie drauf gekommen. Kannst du mir noch erklären warum das so ist? 

Gruß
Antworten Top
#4
Hi,

völlig berechtigte Frage. Lies mal diesen Thread dazu: Gibt es einen Untschied zwischen Application.Sum.. (herber.de)
Tenor: Application gibt einen Fehlerwert zurück, während Worksheetfunction zu einem Programmabbruch führt.
Antworten Top
#5
Hi,

wenn du bei WorksheetFunction bleiben willst, dann musst du den Fehler ignorieren und dblmatch vorher einen "Fehlerwert" zuweisen:
Code:
For Each Zelle In Range("C5:C43")
    If Zelle.Value = "blau" Or Zelle.Value = "rot" Then
        cellname = Zelle.Offset(0, -1).Value
        dblmatch = 0
        On Error Resume Next
            dblmatch = WorksheetFunction.Match(cellname, Range("H1:H43"), 0)
        On Error GoTo 0
        If dblmatch > 0 Then ActiveSheet.Range("H" & dblmatch).ClearContents
    End If
Next Zelle

Noch ein paar Anmerkungen:

Wieso verwendest du bei dir bei fast allen Range-Angaben keine Referenz um dann bei ActiveSheet.Range("H" & dblmatch).ClearContents die denkbar schlechteste Referenzierung, nämlich die über AcriveSheet zu verwenden? Sei doch bitte konsequent und verwende entweder gar keine Referenz oder eine vernünftige. Am besten geeignet ist dabei der Codename eines Tabellenblatts. Wurde die Datei mit einem deutschen Excel erstellt, dann lautet dieser Tabelle1, Tabelle2 etc. Vernünftig referenziert sieht der obige Code so aus:
Code:
With Tabelle1
    For Each Zelle In .Range("C5:C43")
        If Zelle.Value = "blau" Or Zelle.Value = "rot" Then
            cellname = Zelle.Offset(0, -1).Value
            dblmatch = 0
            On Error Resume Next
                dblmatch = WorksheetFunction.Match(cellname, .Range("H1:H43"), 0)
            On Error GoTo 0
            If dblmatch > 0 Then .Range("H" & dblmatch).ClearContents
        End If
    Next Zelle
End With
Beachte hierbei die Punkte vor den Range-Angaben, die dafür sorgen, dass der Ausdruck hinter With an dieser Stelle ergänzt wird.

An meinem Code kannst du auch sehen, wie vernünftigerweise eine Einrückung aussieht. Jeder Start einer Schleife, If oder sonstigen logischen Einheit führt zu einer Erhöhung der Einrückungsstufe. Jedes Ende (Next, End oder sonstiges) kehrt zur vorigen Stufe zurück. Damit erkennt man sehr schnell die Struktur des Programmes und man kommt völlig ohne Leerzeilen aus. Ebenso sieh man auf den ersten Blick ob und wo das Ende eines Blockes vergessen wurde.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste