Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: mittels GoTo mitten in ein anderes Makro springen

mittels GoTo mitten in ein anderes Makro springen
08.07.2014 12:33:50
Georg
Hallo Excel Welt,
ich hänge an einem einfachen GoTo Fehler, den ich aber auch in der Recherche nicht gelöst bekommen habe... :-(
Könnt ihr mir sagen, warum das nicht klappt, bzw. wie es klappen würde?
Ich will von "test1" in die Mitte (!) von "test2" springen. Das stelle ich mir so vor:
Sub test1()
GoTo SPRUNG_MARKE
End Sub

_____________________
Sub test2()
SPRUNG_MARKE:
End Sub
Es kommt dann die Fehlermeldung: "Sprungmarke nicht definiert". Wenn ich sie aber in "test1" definiere, springt er aber natürlich nicht in "Test2"!
?
Ist doch sicher wieder eine banale Sache, aber ich krieg es nicht gebacken...!
Danke und Gruß Georg

Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: mittels GoTo mitten in ein anderes Makro springen
08.07.2014 12:49:50
Daniel
Hi
eigentlich sollte man dir da gar nicht helfen, denn das was du da produzierst ist unübersichlicher, fehleranfälliger Spaghetti-Code im Quadrad.
sowas macht man eigentlich schon seit ende er 70er nicht mehr.
aber wenn du es brauchst:
Sub test1()
Call test2(1)
End Sub
Sub test2(Optional Sprungmarke as long = 0)
If Sprungmarke = 1 then Goto SPRUNG_MARKE
SPRUNG_MARKE:
End Sub
Gruß Daniel

Anzeige
AW: mittels GoTo mitten in ein anderes Makro springen
08.07.2014 14:07:30
Georg
Hallo Daniel,
danke für die Hilfe und Hinweise!! Ich hab noch Fragen:
- was ist denn "Spagetti Code"? Das hatte ich auch woanders schon gelesen und nicht verstanden.
- Und was bedeuted die 1 in Klammern beim Makroaufruf?
- Wie sollte ich sowas besser machen?
Danke für die Nachhilfe!
Gruß Georg

Anzeige
AW: mittels GoTo mitten in ein anderes Makro springen
08.07.2014 14:17:06
Daniel
Spagetthicode ist Code, der viele Gotos enthält und bei dem zwischen den Sprungmarken hin und her gesprungen wird, so dass man schnell die Übersicht verliert wo man sich gerade befindet. Wenn man versucht dem Pogrammlauf zu folgen, dann ist das keine lineare Abfolge des Codes, sondern wildes durcheinander wie auf einem Teller Spaghetti.
ich brauche die 1, weil ich nicht direkt zu einer Sprungmarke in einem anderen Makro springen kann.
ich kann nur das Makro nurmal aufrufen.
Damit der erste Teil übersprungen werden kann, mache ich eine Parameterübergabe.
Wenn der übergebene Parameter den Wert 1 hat, wird zur Sprungmarke gesprungen, falls nicht, wird das Makro normal abgearbeitet.
ohne jetzt deine Aufgabenstellung zu kennen, ist es natürlich schwer zu sagen, was konkret besser ist.
wenn du schon modular programmierst (dh auf mehrere Makros verteilt), dann könnte das auch so aussehen:
Sub Makro1()
Call Makro2b
End sub
Sub Makro2a()
'hier wäre die Sprungmarke
Call Makro2b
End Sub
Sub Makro2B()
'hier der Code ab der Sprungmarke
End Sub
Gruß Daniel

Anzeige
klasse
08.07.2014 14:40:11
Georg
Hi Daniel,
danke für die gute Erklärung. Hab wieder was gelernt!
Gruß Georg

doch noch was...
08.07.2014 14:48:34
Georg
Hallo Daniel,
jetzt hab ich doch noch ein Problem.
Das Makro "test2" läuft nicht mehr allein! Ich kann "test1" starten und dann auf "test2" springen, aber "test2" kann ich nicht allein starten!! ?

Anzeige
AW: doch noch was...
08.07.2014 15:28:38
Daniel
dann noch dieses Makro einfügen:
Sub Test2start
Call Text2(0)
End Sub
zum Direktstart dann Test2start verwenden
alternativ kannst du auch statt der Parameterübergabe eine Projektweit gültige Variable verwenden, welche in allen Makros verwendet werden kann und ihren Wert behält:
Option Explicit
Public SprungMarke as long
Sub test1()
SprungMarke = 1
Call test2
End Sub
Sub test2()
If Sprungmarke = 1 then
Sprungmarke = 0
Goto SPRUNG_MARKE
end if
SPRUNG_MARKE:
End Sub

hier kannst du Test2 dann weiterhin normal starten, solltest dir aber immer im klaren darüber sein, welchen Wert deine Variable "Sprungmarke" aktuell hat, denn die behält ihren zuletzt vergebenen Wert auch nach Ablauf der Makros.
Gruß Daniel

Anzeige
jetzt funzts...Danke!! - owt
08.07.2014 15:41:17
Georg
:-)
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Mit GoTo mitten in ein anderes Makro springen


Schritt-für-Schritt-Anleitung

Um mit VBA von einem Makro in ein anderes zu springen, kannst Du die GoTo-Anweisung verwenden. Hier ist, wie Du es umsetzen kannst:

  1. Erstelle die Hauptmakros: Definiere die Makros, zwischen denen Du springen möchtest. Das Beispiel zeigt, wie Du von test1 zu test2 springst:

    Sub test1()
        GoTo SPRUNG_MARKE
    End Sub
    
    Sub test2()
        SPRUNG_MARKE:
        ' Dein Code hier
    End Sub
  2. Fehlermeldung beachten: Wenn Du die Fehlermeldung "Sprungmarke nicht definiert" erhältst, liegt das daran, dass die Sprungmarke nur innerhalb des gleichen Makros definiert werden kann.

  3. Verwende Parameter: Eine bessere Methode ist es, die Makros so zu gestalten, dass sie Parameter akzeptieren. Dies ermöglicht das gezielte Springen zu bestimmten Stellen im Code:

    Sub test1()
        Call test2(1)
    End Sub
    
    Sub test2(Optional Sprungmarke As Long = 0)
        If Sprungmarke = 1 Then GoTo SPRUNG_MARKE
        ' Normaler Code hier
        SPRUNG_MARKE:
        ' Code ab der Sprungmarke
    End Sub

Häufige Fehler und Lösungen

  • Fehlermeldung "Sprungmarke nicht definiert": Das tritt auf, wenn Du versuchst, zu einer Sprungmarke zu springen, die nicht im aktuellen Makro definiert ist. Stelle sicher, dass die Sprungmarke im richtigen Makro definiert ist.

  • Makro läuft nicht allein: Wenn ein Makro nur im Kontext eines anderen läuft, musst Du sicherstellen, dass es auch eigenständig aufgerufen werden kann, z.B. durch das Hinzufügen eines Startmakros:

    Sub Test2start()
        Call test2(0)
    End Sub

Alternative Methoden

Statt GoTo zu verwenden, gibt es andere Möglichkeiten, um den Code klarer und wartbarer zu gestalten:

  • Modularer Programmieransatz: Teile Deinen Code in kleinere, wiederverwendbare Subroutinen auf. Hier ein Beispiel:

    Sub Makro1()
        Call Makro2a
    End Sub
    
    Sub Makro2a()
        ' Hier wäre die Sprungmarke
        Call Makro2b
    End Sub
    
    Sub Makro2b()
        ' Hier der Code ab der Sprungmarke
    End Sub
  • Verwendung von globalen Variablen: Du kannst globale Variablen definieren, um den Status zwischen den Makros zu speichern:

    Option Explicit
    Public SprungMarke As Long
    
    Sub test1()
        SprungMarke = 1
        Call test2
    End Sub
    
    Sub test2()
        If SprungMarke = 1 Then
            SprungMarke = 0
            GoTo SPRUNG_MARKE
        End If
        SPRUNG_MARKE:
        ' Code hier
    End Sub

Praktische Beispiele

Hier sind einige Beispiele, wie Du die GoTo-Anweisung effektiv nutzen kannst:

  1. Einfaches Sprungmakro:

    Sub test1()
        GoTo SPRUNG_MARKE
    End Sub
    
    Sub test2()
        SPRUNG_MARKE:
        MsgBox "Du bist an der Sprungmarke"
    End Sub
  2. Verwendung von Parameterübergabe:

    Sub test1()
        Call test2(1)
    End Sub
    
    Sub test2(Optional Sprungmarke As Long = 0)
        If Sprungmarke = 1 Then GoTo SPRUNG_MARKE
        MsgBox "Normaler Ablauf"
        SPRUNG_MARKE:
        MsgBox "Sprungmarke erreicht"
    End Sub

Tipps für Profis

  • Spaghetti-Code vermeiden: Vermeide exzessive Verwendung von GoTo, um den Code übersichtlich zu halten. Modularisiere Deinen Code und nutze Subroutinen.

  • Dokumentation: Kommentiere Deinen Code gut, besonders wenn Du mit Sprungmarken arbeitest, damit Du die Logik später leicht nachvollziehen kannst.

  • Debugging: Nutze die Debugging-Tools von Excel VBA, um den Code Schritt für Schritt zu durchlaufen und Probleme zu identifizieren.


FAQ: Häufige Fragen

1. Was ist "Spaghetti-Code"? Spaghetti-Code ist ein Begriff für unübersichtlichen Code, der viele GoTo-Anweisungen enthält und dadurch schwer zu verfolgen ist.

2. Warum kann ich nicht direkt zu einer Sprungmarke in einem anderen Makro springen? In VBA kannst Du nur ein Makro aufrufen, aber nicht direkt zu einer Sprungmarke in einem anderen Makro springen. Du musst Parameter verwenden, um anzugeben, ob zur Sprungmarke gesprungen werden soll oder nicht.

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