Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1924to1928
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

VBA: nach End Sub zurück zu End If

VBA: nach End Sub zurück zu End If
11.04.2023 09:51:59
MB

Hallo zusammen,

Ich habe den nachfolgenden VBA Code der soweit funktioniert.
Für die Übersichtlichkeit habe ich diesen auf das Nötigste minimiert.

Nun habe ich an diesem Code das Problem, dass mir die Ausführung nach dem End Sub erst wieder zurück zu End If (als E1 markiert) springt, diese Prozedur dann erneut ausführt und dann zu E2 springt, und auch diese Prozedur bis zum Ende erneut ausführt. Das soll allerdings nicht passieren, sondern der gesamte Prozess ab dem End Sub beendet werden.



Set myTableRange = Worksheets("Aufträge").Range("B3:X999999")
If Intersect(Target, myTableRange) Is Nothing Then GoTo SubSchluss

'Auftragsnummer abfragen und eintragen
If auftragStatus.Value = "abbuchen" Then

'Ausgabenummer sichern, E2
If auftragAusgabenr.HasFormula Then
{...}
End If [E2]

If auftragPreis.Value > "wird nicht angeboten" Then

'Lastschrift
If auftragRechnungsstatus = "Lastschrift" Then
{...}
           
Else
'Rechnung
If auftragRechnungsstatus = "Rechnung" Then
{...}

Else
msg = ...
GoTo SubSchluss

End If
End If

Else
msg = ...
GoTo SubSchluss
End If

{...}
End If [E1]

'Schützen und Sub beenden
SubSchluss:
Worksheets("Aufträge").Protect "a"
Application.StatusBar = False

Exit Sub
End Sub



Kann das einer nachvollziehen, warum er mir zurück zu den End-If springt oder welche Lösung gibt es, die Ausführung des VBA an Position des End-Sub zu beenden?

Danke im Voraus!
MB

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

Betreff
Datum
Anwender
Anzeige
AW: VBA: nach End Sub zurück zu End If
11.04.2023 10:01:47
GerdL
Hallo MB,

du verwechselst etwas. Nach "End Sub" ist innerhalb vom Makro Schluss.
Teste bitte mal mit der F8-Taste im Einzelschrittmodus.

Gruß Gerd


AW: VBA: nach End Sub zurück zu End If
11.04.2023 10:05:55
MB
Ich habe das ganze mit der Einzelprozedur F8 getestet. Daher komme ich auch zum Entschluss, dass er nach dem EndSub zu den Positionen E1 und danach E2 springt.

Am Ende soll die gesamte Ausführung des Codes gestoppt werden.
Der Code steht auf einem Tabellenblatt, also nicht auf einem einzelnen Modul.


AW: VBA: nach End Sub zurück zu End If
11.04.2023 10:03:37
Oberschlumpf
Hmm...Hi

VBA = wirklich gut???

Welches Sub wird denn gestartet, bevor End Sub erreicht - und nicht - beendet wird?
Nach deiner Beschreibung würd ich sagen, der Beginn von Sub... ist ein Ereignis-Event, z Bsp Change oder ähnlich, und dieses Sub wird nun mal bei - jedem - Change gestartet....es sei denn...du verwendest den Befehl

Application.EnableEvents = False 'beendet ab hier Ereignisverfolgung
'oder eben
Application.EnableEvents = True 'startet ab hier wieder die Ereignisverfolgung, was du unbedingt auch verwenden musst, denn wenn False 1x gestartet, dann reagiert dein Code bei z Bsp Sub Change nie wieder
Aber natürlich kann ich mich auch irren - aber wenn, dann nur, weil du uns nich verraten hast, mit welchem Sub genau dein Makro beginnt.

Hilfts?

Ciao
Thorsten


Anzeige
AW: VBA: nach End Sub zurück zu End If
11.04.2023 10:13:31
MB
Hallo Thorsten,

korrekt. Ich starte ganz oben mit
Private Sub Worksheet_Change(ByVal Target As Range).

Das mit der Ereignisverfolgung hatte ich bisher tatsächlich nicht eingebaut, aber daran liegt es auch nicht (ich habe es eben mal eingebaut und getestet).
Denn wäre das so, dass der Sub wieder von vorne aufgrund eines Change Ereignisses beginnt, würde er ja immer wieder von ganz oben beginnen statt an verschiedenen Stellen (E1, E2) mitten im Code. Oder sehe ich das falsch?

Danke euch beiden schonmal, Gerd und Thorsten!


AW: VBA: nach End Sub zurück zu End If
11.04.2023 11:23:37
Oberschlumpf
Hi,

da sich mit den Infos, die wir bis jetzt von dir haben, wohl nix daran ändern wird, dass wir nur "weiter raten könnten", würd ich vorschlagen, zeig uns bitte per Upload eine Bsp-Datei mit Bsp-Daten und deinem Code, so dass wir in der Datei genau den Fehler selbst testen können, den du zu beseitigen versuchst.

Ciao
Thorsten


Anzeige
AW: VBA: nach End Sub zurück zu End If
11.04.2023 10:30:12
Zwenn
Hallo MB,

wie Thorsten schon geschrieben hat, gehe ich auch von einem Event-Makro aus. Leider hast Du ausgerechnet die erste Zeile des Codes weggelassen. Weiterhin wird in dem Code an keiner Stelle zurück nach "weiter oben" gesprungen. Ganz im Gegenteil verwendest Du GoTo, um nach unten zu springen und allein dafür kommst Du in cie Coder-Hölle ;-) GoTo wird NICHT verwendet, das erzeugt Spaghetticode! (Außer zur echten Fehlerbehandlung, wenn mans braucht, weil das Exception Model von VBA das leider so vorsieht.)

Du hast eine If Then Else Struktur aufgebaut, die verschiedene Bedingungen prüft (wofür sie ja auch gedacht ist). Wird eine Bedingung nicht erfüllt, wird auch der Codeblock innerhalb von If - End If nicht ausgeführt. Das bedeutet, die ganzen GoTo kannst Du vermutlich ersatzlos löschen. Inklusive der unseeligen Sprungmarke. Zusätzlich stellt sich mir die Frage, wozu dient das Exit Sub eine Zeile vor dem End Sub? Löschen, dass macht null Sinn.

Wie ebenfalls von Thorsten angedeutet, stellt sich weiterhin die Frage, ob innerhalb Deiner ausgelassenen Code Teile, also den {...} Stellen, weitere Funktionen oder Subs aufgerufen werden, die das gezeigte Makro ihrerseits aufrufen. Wie gesagt, ansonsten springt da gar nix wieder nach oben in bereits abgearbeiteten Code. Oder es ist eben ein Change Ereignis, und wird jedesmal ausgeführt, wenn Du im abgefragten Zellenbereich etwas änderst. Wie Du Damit umgehen kannst, hat Thorsten Dir bereits gezeigt.

Übrigens solltest Du Dir dringend angewöhnen Code einzurücken. Dann brauchst Du auch keine Markierungen wie E1 oder E2. Man sieht dann nämlich automatisch, was wo stattfindet.

Sub test()

  Set myTableRange = Worksheets("Aufträge").Range("B3:X999999")
  If Intersect(Target, myTableRange) Is Nothing Then GoTo SubSchluss
    'Auftragsnummer abfragen und eintragen
    If auftragStatus.Value = "abbuchen" Then
      'Ausgabenummer sichern, E2
      If auftragAusgabenr.HasFormula Then
        '{...}
      End If '[E2]
      
      If auftragPreis.Value > "wird nicht angeboten" Then
        'Lastschrift
        If auftragRechnungsstatus = "Lastschrift" Then
          '{...}
        Else
          'Rechnung
          If auftragRechnungsstatus = "Rechnung" Then
          '{...}
          Else
            'msg = ...
            GoTo SubSchluss
          End If
        End If
      Else
      'msg = ...
      GoTo SubSchluss
    End If
    '{...}
  End If '[E1]
  
  'Schützen und Sub beenden
SubSchluss:
  Worksheets("Aufträge").Protect "a"
  Application.StatusBar = False
  
  Exit Sub
End Sub
Würde ich erstmal so abändern:

Sub test1()

  Set myTableRange = Worksheets("Aufträge").Range("B3:X999999")
  If Not Intersect(Target, myTableRange) Is Nothing Then
    'Auftragsnummer abfragen und eintragen
    If auftragStatus.Value = "abbuchen" Then
      'Ausgabenummer sichern, E2
      If auftragAusgabenr.HasFormula Then
        '{...}
      End If '[E2]
      
      If auftragPreis.Value > "wird nicht angeboten" Then
        'Lastschrift
        If auftragRechnungsstatus = "Lastschrift" Then
          '{...}
        Else
          'Rechnung
          If auftragRechnungsstatus = "Rechnung" Then
          '{...}
          Else
            'msg = ...
          End If
        End If
      Else
      'msg = ...
    End If
    '{...}
  End If '[E1]
  
  'Schützen und Sub beenden
  Worksheets("Aufträge").Protect "a"
  Application.StatusBar = False
End Sub
Viele Grüße,

Zwenn


Anzeige
AW: VBA: nach End Sub zurück zu End If
11.04.2023 11:41:51
snb
Verzichte auf überflüssige Object Variablen..
Verzichte auf 'Protection'
Ignoriere den StatusBar.

306 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige