Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Fehler durch MsgBox in VBA abfangen

Fehler durch MsgBox in VBA abfangen
06.03.2006 17:46:53
Markus
Hallo,
ich habe folgenden Code:
If intEmpfänger Then
intSpalteLAYOUT = 2
intSpalteVARCOL = 4
Do
intSpalteVAR = 4
Do
If shVar.Cells(7, intSpalteVAR) = shLayout _
.Cells(intEmpfänger + 1, intSpalteLAYOUT) Then
Sheets("VARCOL").Activate
For i = 7 To 78
shVar.Cells(i, intSpalteVAR).Copy
With shVarcol
.Cells(i, intSpalteVARCOL).Select
.Paste
.Paste Link:=True
End With
Next i
intSpalteVARCOL = intSpalteVARCOL + 1
Exit Do
End If
intSpalteVAR = intSpalteVAR + 1
Loop
Selection.Find What:=intSpalteVAR
intSpalteLAYOUT = intSpalteLAYOUT + 1
Loop Until _
shLayout.Cells(intEmpfänger + 1, intSpalteLAYOUT) = ""
End If
Nun möchte ich einen Fehler abfangen, wenn die Abfrage aus:
If shVar.Cells(7, intSpalteVAR) = shLayout.Cells(intEmpfänger + 1, intSpalteLAYOUT) Then
Sheets("VARCOL").Activate
negativ verläuft. Ich dachte an eine MsgBox die mir die Meldung gibt"falsche Spalte" wenn
shVar.Cells(7, intSpalteVAR) shLayout.Cells(intEmpfänger + 1, intSpalteLAYOUT)oder so.
Wo muss ich den Fehler im eingangs abgebildeten Code wie abfangen, damit das Programm keinen Laufzeitfehler meldet, falls die Spalte von shVar in shLayout nicht gefunden wird und stattdessen eine Fehlermeldung ausgibt die darauf hinweist, dass die Spalte nicht gefunden werden konnte?
gruss Markus
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Fehler durch MsgBox in VBA abfangen
07.03.2006 00:31:24
MichaV
Hallo Markus,
ich hab das mal in ein lesbares Bild gebracht und gleich Dein Anliegen eingebaut.
Das Ganze ist ungetestet. Die innere Do- Loop- Schleife ist aber nun, da die If- Then- Bdingung immer in einem Schleifenabbruch landet, nicht mehr notwendig. Aber da ich nicht weiß, was Du anstelle des Exit Sub einbauen willst, lass ich das mal so drin stehen.


If intEmpfänger Then
    intSpalteLAYOUT = 2
    intSpalteVARCOL = 4
    Do
        intSpalteVAR = 4
        Do '(nicht notwendig)
            If shVar.Cells(7, intSpalteVAR) = shLayout _
                                            .Cells(intEmpfänger + 1, intSpalteLAYOUT) Then
                Sheets("VARCOL").Activate
                For i = 7 To 78
                    shVar.Cells(i, intSpalteVAR).Copy
                    With shVarcol
                        .Cells(i, intSpalteVARCOL).Select
                        .Paste
                        .Paste Link:=True
                    End With
                Next i
                intSpalteVARCOL = intSpalteVARCOL + 1
                Exit Do
            Else '<----------------
                MsgBox "eine Fehlermeldung die darauf hinweist, dass die Spalte nicht gefunden werden konnte", vbCritical, "Fehler"
                Exit Sub 'oder was auch immer
            End If '<---------------
            intSpalteVAR = intSpalteVAR + 1 '(nicht notwendig)
        Loop '(nicht notwendig)
        Selection.Find What:=intSpalteVAR
        intSpalteLAYOUT = intSpalteLAYOUT + 1
    Loop Until shLayout.Cells(intEmpfänger + 1, intSpalteLAYOUT) = ""
End If



Gruß- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: Fehler durch MsgBox in VBA abfangen
07.03.2006 12:18:07
Markus
Hi Micha,
das funktioniert leider nicht. wenn ich die do-loop schleife entferne, wird das ganze dokument nicht mehr nach allen gewünschten spalten durchsucht, sondern bricht nach dem ersten positiven fund ab. lasse ich sie allerdings drin, ehalte ich jedes mal eine fehlermeldung, obwohl die spalten im dokument enthalten sind. daher erhöhe ich intSpalteVar auch immer um 1, damit das gesamte dokument durchlaufen wird. das gleiche problem hatte ich davor schon. gibt es keine andere möglichkeit den schleifendurchlauf abzubrechen und eine meldung auszugeben, sobald eine spalte nicht gefunden wurde?
mfg Markus
Anzeige
AW: Fehler durch MsgBox in VBA abfangen
07.03.2006 21:47:54
MichaV
Hallo,
tut mir leid, ich habs mir 5 mal durchgelesen aber ich kapier es nicht. Du fängst bei Spalte 4 an zu suchen und vergleichst in Zeile 7 irgendwelche Werte. Wenn ein Wert gefunden wurde, brichst Du die Schleife ab. Nun könnte das Makro bis zur 256. Spalte suchen aber Du schreibst, daß die Werte immer zu finden sind. Wozu dann ein Abbruch? Möchtest Du nur bis Spalte 256 suchen und dann auswerten, ob was gefunden wurde?
Gruß- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: Fehler durch MsgBox in VBA abfangen
07.03.2006 22:10:51
Markus
Hi Micha,
ich prüfe in der ersten Bedingung, ob sich die Zelle auf dem Blatt Var (shVAR) auch im Blatt Layout befindet (shLayout). Dazu starte ich im Blatt Var in Zelle D7 (also 7,4 bzw. 7, intSpalteVar) und gleiche das mit der Zelle in Layout ab (intEmpfänger weise ich dabei über ein DialogSheet zu). Dabei suche ich in Var nach den selben Zellinhalten, die ich in Layout aufführe.
Die Schleife wird bislang so lange durchlaufen, bis in Var alle Spalten gefunden wurden, die ich in Layout definiert habe und fügt diese dann in einem 3. Tabellenblatt ein (shVarcol).
Definiere ich allerdings auf Layout einen Zellinhalt, der in Var nicht gefunden werden kann, erhalte ich jedesmal einen Programmabbruch. Allerdings ist es mir bislang nicht gelungen, diesen irgendwie abzufangen. Wird in Layout eine Zelle festgelegt, die in Var nicht gefunden werden kann, möchte ich darüber hinaus eine MessageBox ausgeben, die darauf hinweist, das in Layout eine falsche Spalte definiert wurde und zu diesem Blatt zurückspringen.
Konnte ich nun mein Problem verständlich schildern? Über Hilfe würde ich mich sehr freuen, da ich wirklich kurz vorm Verzweifeln bin. Falls dem immer noch nicht so sein sollte, melde dich bitte nochmal.
Herzliche Grüße
Markus
Anzeige
AW: Fehler durch MsgBox in VBA abfangen
07.03.2006 23:42:50
MichaV
Hallo Markus,
Du bist ja "online". Was hältst Du von einer Beispielmappe? Das erspart viele Worte.
Gruß- Micha
PS: Rückmeldung wäre nett.
AW: Fehler durch MsgBox in VBA abfangen
07.03.2006 23:48:15
Markus
Hi Micha,
ich stelle im laufe des morgigen Vormittags eine Beispielmappe online. Wäre super, wenn du dann mal nen blick darauf werfen könntest.
Ginge das in Ordnung?
gruß markus
Anzeige
AW: Fehler durch MsgBox in VBA abfangen
07.03.2006 23:52:35
MichaV
Hallo,
ja deswegen hab ich den Vorschlag doch gemacht ;o)
Gruß- Micha
AW: Fehler durch MsgBox in VBA abfangen
08.03.2006 00:31:04
Markus
Hi,
anbei die Beispielmappe: https://www.herber.de/bbs/user/31697.xls
Bei Benutzer Z würde ich nun eine Fehlermeldung erhalten, da das Jahr 2007 in VAR nicht existiert. Wie kann ich diesen Fehler abfangen!
Gruß Markus
Anzeige
AW: Fehler durch MsgBox in VBA abfangen
08.03.2006 21:37:52
MichaV
Hallo,
nun hab ich es kapiert. ALso doch so, daß der Fehler "rechtes Tabellenende erreicht" abgefangen werden soll. Aufbauend auf Deinem Code wäre das hier mein Vorschlag:


                End If
            intSpalteVAR = intSpalteVAR + 1
            '-----------------------
            If intSpalteVAR > 256 Then 'Ende des Tabellenblattes erreicht!
                Application.ScreenUpdating = True
                Sheets("Layout").Activate
                Cells(intEmpfänger + 1, intSpalteLAYOUT).Select
                MsgBox shLayout _
                .Cells(intEmpfänger + 1, intSpalteLAYOUT) & " existiert nicht in Vorlage- Tabelle"
                Exit Sub
            End If
            '------------------------
        Loop


Welche Bedeutung hat eigentlich die Zeile Selection.Find What:=intSpalteVAR ?
Gruß- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: Fehler durch MsgBox in VBA abfangen
08.03.2006 23:50:34
Markus
Hi Micha,
super. Das funktioniert jetzt genau so, wie ich es mir vorgestellt habe und woran tagelang erfolglos herumgedoktert habe.
Die Befehlszeile Selection.Find What:=intSpalteVAR stammte noch aus einem Versuch die Spalten zu suchen. Allerdings hatte ich vergessen, diesen aus dem Code zu löschen. Von daher war diese ohne Bedeutung und ich habe ihn nun aus dem Programmtext entfernt.
Jetzt habe ich aber noch eine weitere Frage, bei der du mir hoffentlich auch helfen kannst.
Und zwar würde ich gerne noch Abweichungen zwischen den einzelnen Jahren errechnen können. Dabei möchte ich jedoch nicht die Abweichungen fest in der Tabelle VAR berechnen, sondern diese zur Laufzeit erzeugen und auch diese in VARCOL einfügen. Dazu würde ich gerne ebenfalls im LAYOUT-Blatt einen Befehl definieren können, der diese Berechnung veranlasst.
Hast du eine Idee wie ich das anstellen könnte, dass wenn ich im Layout-Blatt in eine Zelle schreibe >, das Programm mir daraufhin eine Abweichung der beiden Jahre berechnet? dies soll erfolgen, indem 2005 durch 2002 geteilt und dann 1 abgezogen wird. also: (2005/2002)-1
Dabei soll das mittlerweile gelöste Problem in dem Maße gelöst werden, wie es nun geschafft ist (das geht doch hoffentlich, oder?
ich habe die Datei hier reingestellt.
https://www.herber.de/bbs/user/31734.xls
Dabei habe ich bei Benutzer Z beispielhaft schon so eine Berechnung formuliert. Nur wie ichs in VBA umsetzen soll, ist mir momentan noch schleierhaft.
Wäre echt super Micha, wenn du mir auch da nochmal aus der Patsche helfen könntest.
Im Voraus schonmal vielen lieben Dank.
Herzliche Grüße
Markus
Anzeige
Danke für die Rückmeldung mT
09.03.2006 00:06:38
MichaV
Hallo,
neee, da machst Du es Dir zu einfach.
1.) Das ist eine völlig neue Frage, also mach bitte einen neuen Threat auf
2.) Bei VBA Level gut wird (von mir) schon ein bischen mehr Eigeninitiative erwartet, also Du hast es sicher schon versucht, kommst aber mit der einen oder anderen Funktion nicht so richtig klar oder Du hast einen Code, der aber irgendwo nicht funzt....
3.) Falls Du Dich bei Deinem Level überschätzt haben soltest (was ja öfter vorkommt, als man erwartet), dann hier noch der Hinweis: die Mid- Funktion ist alles, was Du brauchst. Mid eingeben, F1 drücken, Beispiel gucken.
Wie gesagt, notfalls mach einen neuen Threat auf.
Gruß- Micha
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Fehler durch MsgBox in VBA abfangen


Schritt-für-Schritt-Anleitung

Um Fehler in VBA abzufangen und eine MsgBox anzuzeigen, kannst Du die folgenden Schritte befolgen:

  1. Fehlerprüfung einfügen: Füge eine If-Abfrage direkt nach der Zeile ein, die den Fehler verursachen könnte. Zum Beispiel:

    If shVar.Cells(7, intSpalteVAR) <> shLayout.Cells(intEmpfänger + 1, intSpalteLAYOUT) Then
        MsgBox "Falsche Spalte", vbCritical, "Fehler"
        Exit Sub
    End If
  2. Schleife anpassen: Stelle sicher, dass die Schleife so eingestellt ist, dass sie weiterhin alle Spalten durchsucht. Du kannst die Schleifenbedingungen anpassen, um sicherzustellen, dass der gesamte Bereich geprüft wird.

  3. Fehler abfangen: Verwende On Error-Anweisungen, um Laufzeitfehler abzufangen. Hier ein Beispiel:

    On Error GoTo Fehlerbehandlung
    ' Dein bisheriger Code hier
    Exit Sub
    
    Fehlerbehandlung:
        MsgBox "Ein Fehler ist aufgetreten: " & Err.Description, vbCritical, "Fehler"

Häufige Fehler und Lösungen

  • Fehler: "Objekt nicht gefunden"
    Lösung: Überprüfe, ob die Zelle, die Du abfragen möchtest, tatsächlich existiert. Füge eine Überprüfung ein, bevor Du die Zelle ansprichst.

  • Fehler: Laufzeitfehler 9 (Index außerhalb des gültigen Bereichs)
    Lösung: Stelle sicher, dass die Indizes für Zeilen und Spalten innerhalb der Grenzen des Arbeitsblattes liegen. Verwende If-Bedingungen, um dies zu überprüfen.


Alternative Methoden

  1. Fehlerbehandlung mit On Error Resume Next: Diese Methode ignoriert Laufzeitfehler und fährt mit dem nächsten Befehl fort. Diese Methode kann jedoch riskant sein, da sie auch legitime Fehler ignoriert.

  2. Benutzerdefinierte Fehlerbehandlung: Du kannst eigene Funktionen erstellen, die spezifische Fehler abfangen und behandeln. Diese Funktion kann dann in verschiedenen Teilen Deines Codes aufgerufen werden.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du eine MsgBox verwenden kannst, um Fehler abzufangen:

Sub BeispielFehlerAbfangen()
    Dim intSpalteVAR As Integer
    Dim intEmpfänger As Integer
    intSpalteVAR = 4
    intEmpfänger = 1 ' Beispielwert

    On Error GoTo Fehlerbehandlung

    If shVar.Cells(7, intSpalteVAR) <> shLayout.Cells(intEmpfänger + 1, intSpalteLAYOUT) Then
        MsgBox "Falsche Spalte", vbCritical, "Fehler"
        Exit Sub
    End If

    ' Weitere Code-Logik hier

    Exit Sub

Fehlerbehandlung:
    MsgBox "Ein Fehler ist aufgetreten: " & Err.Description, vbCritical, "Fehler"
End Sub

Tipps für Profis

  • Verwende Debug.Print: Nutze diese Anweisung, um den Wert von Variablen zur Laufzeit in das Direktfenster auszugeben. So kannst Du Fehlerquellen leichter identifizieren.

  • Modularisiere Deinen Code: Teile komplexe Funktionen in kleinere, überschaubare Subroutinen auf. Dies erleichtert das Testen und die Fehlerbehandlung.

  • Dokumentiere Deinen Code: Füge Kommentare hinzu, um die Logik hinter bestimmten Entscheidungen zu erklären. Dies hilft nicht nur Dir, sondern auch anderen, die Deinen Code lesen.


FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass die MsgBox nur bei bestimmten Fehlern angezeigt wird?
Du kannst spezifische Fehlercodes abfragen und nur für diese eine MsgBox anzeigen.

2. Was mache ich, wenn ich nicht sicher bin, ob eine Zelle existiert?
Verwende die WorksheetFunction.CountA()-Funktion, um zu prüfen, ob die Zelle Daten enthält, bevor Du darauf zugreifst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige