Live-Forum - Die aktuellen Beiträge
Datum
Titel
19.04.2024 12:23:24
19.04.2024 11:45:34
Anzeige
Archiv - Navigation
1360to1364
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

Kombination aus End und Stop

Kombination aus End und Stop
07.05.2014 10:15:03
Heinz
Hallo Zusammen!
ich habe am Anfang ein UserForm mit dem ich ein Ordnerverzeichnis erstelle und einen Pfad definiere. Hier ist der Pfad wie folgt definiert:
'--------------------
Option Explicit
Public pfad As String
Sub ordnererstellen() ' dieses habe ich vereinfacht
pfad = "U:\Beispiele\"
End Sub

'--------------------
in einem weiteren Marko führe ich eine Prüfung aus, ob die Zelle leer ist:
'--------------------
Sub pruefung()
Dim Zelle As Range
Dim a As String
a = "='Eingabe'!$F$9,'Eingabe'!$F$12, 'Eingabe'!$F$16, 'Eingabe'!$F$17"
For Each Zelle In Range(a)
If Zelle = "" Then
Zelle.Interior.ColorIndex = 9 ' wird rot markiert
? ' 

'--------------------
Und genau an der markierten Stelle liegt das Problem. Sobald die Zelle leer ist soll alles gestoppt werden, aber die Public-Variable Pfad nicht gelöscht werden!
  • Die End-Fkt stoppt alles, aber löscht die Variablen, springt nicht in den VBA-Code

  • Die Stop-Fkt stoppt alles, löscht KEINE Variablen, aber springt in den VBA-Code

  • Ich brauche eine Funktion, die alles stoppt, aber keine Variable löscht und NICHT in den VBA-Code springt. Gibt es sowas?
    Vielen Dank für Eure Hilfe!

    18
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: Kombination aus End und Stop
    07.05.2014 10:26:46
    Daniel
    Hi
    dann gäbe es noch EXIT SUB.
    das beendet das laufende Makro und Variablen bleiben erhalten (zumindest die projekt- oder modulweit gültigen)
    sollte das Makro, welches du mit Exit <pre>Sub beendest, von einem anderen Makro aus aufgerufen worden sein, so wird dieses weiter ausgeführt.
    EXIT <pre>Sub entspricht im Prinzip einem Sprung zur letzen Zeile (End Sub</pre>)
    Gruß Daniel

    AW: Kombination aus End und Stop
    07.05.2014 10:37:32
    Heinz
    Hallo Daniel,
    danke für die schnelle Rückmeldung. Exit Sub habe ich auch schon ausprobiert, aber wie du schon gesagt hast, werden nach diesem Makro noch weitere Makros aufgerufen, die nach der Fehlermeldung auch nicht mehr ausgeführt werden sollen. Es werden in den weiteren Makros auch unterschiedliche externe Programme aufgerufen. Von daher soll, alles gestoppt werden sobald die Zelle leer ist. Da es ansonsten zu weiteren Fehlern kommt.
    Und der User den VBA-Code später nicht sehen darf.

    Anzeige
    AW: Kombination aus End und Stop
    07.05.2014 11:05:20
    Daniel
    HI
    schreibe das aufgerufene Makro als Function.
    Dann kannst du über den Rückgabewert dem aufrufenden Makro mitteilen, ob die aufgerufene Funktion normal ausgeführt oder vorzeitig abgebrochen wurde und dieses bei Bedarf ebenfalls abbrechen.
    Sub Makro1()
    If Makro2() Then Exit Sub
    end Sub
    Function Makro2() as boolean
    If Abbruchbedingung = True Then
    Makro2 = True
    exit Function
    End If
    End Function
    
    Gruß Daniel

    nicht zu empfehlen, Daniel
    07.05.2014 11:24:06
    Rudi
    Hallo,
    Functions dienen dazu, Werte zurückzugeben, nicht irgendwelche Aktionen durchzuführen.
    Man kann aber den Abbruch per Argument an Subs übergeben.
    Sub Start()
    Dim blnEXIT As Boolean
    'Code
    Makro1 blnEXIT
    If blnEXIT Then
    MsgBox "Abbruch Start"
    Exit Sub
    Else
    MsgBox "Restcode Start"
    End If
    'weiterer Code
    End Sub
    Sub Makro1(blnEXIT As Boolean)
    'Code
    Makro2 blnEXIT
    If blnEXIT Then
    MsgBox "Abbruch Makro1"
    Exit Sub
    Else
    MsgBox "Restcode Makro1"
    End If
    'weiterer Code
    End Sub
    Sub Makro2(blnEXIT As Boolean)
    'Code
    If Range("A1") = "" Then
    MsgBox "A1 ist leer, Abbruch"
    blnEXIT = True
    Exit Sub
    End If
    MsgBox "In A1 steht " & Range("A1")
    End Sub
    

    Gruß
    Rudi

    Anzeige
    AW: Warum nicht?
    07.05.2014 11:29:45
    Daniel
    ich nutze doch die Function, um einen Wert zurückzugeben.
    sorry, aber deinen Einwand verstehe ich nicht.
    erkläre mir das bitte genauer.
    Gruß Daniel

    AW: Warum nicht?
    07.05.2014 11:36:00
    Rudi
    Hallo,
    wenn du aus seiner Sub Pruefung eine Function Pruefung machst, werden Zellen rot gefärbt und was weiß ich noch alles.
    Gruß
    Rudi

    AW: Warum nicht?
    07.05.2014 12:12:36
    Daniel
    ok, nur weil du zu blöd bist, eine vernünftige Function zu erstellen, ist es schlecht, verstehe ich deinen Einwand da richtig?
    Gruß Daniel

    AW: Darum nicht!
    07.05.2014 12:43:06
    EtoPHG
    Hallo Daniel,
    Zitat: ...nur weil du zu blöd bist, eine vernünftige Function zu erstellen...
    Definiere: vernünftig!
    Der Anfrager hat eine Sub gepostet, in der Zellfarben verändert werden. Wenn du ihm nun den Vorschlag machst, daraus eine Function zu machen, dann zeige ihm bitte auch, wie er in dieser Zellfarben ändern kann!
    Was er braucht, ist eine zusätzliche globale (boolean) Variable, die festhält ob 'sein' Abbruchkriterium vorliegt. Alle zutreffenenden Sub (und ggf. Function) testen mit Hilfe dieser als Erstes, ob der restliche Code ausgeführt werden soll, oder mit Exit abgebrochen wird. Wann/wie, bzw. durch welche Prozedur, die Variable wieder auf ihren Ursprungszustand zurückgesetzt wird muss der Anfrager entscheiden.
    Aber wie bereits erwähnt, die Selbsteinschätzung des VBA-Levels ist hier zu hoch.
    Gruess Hansueli

    Anzeige
    AW: Darum nicht!
    07.05.2014 12:57:06
    Daniel
    genauso, wie er in der Sub Zellfarben ändert.
    ist kein Unterschied.
    solage die Function nur innerhalb von Makros verwendet wird, kann sie alles genauso wie eine Sub, mit dem kleinen Zusatznutzen, dass sie einen Wert an die aufrufende Funktion zurückgeben kann (beispielsweise, ob sie erfolgreich ausgeführt werden konnte oder nicht).
    Gruß Daniel

    AW: Darum nicht!
    07.05.2014 13:05:51
    Heinz
    Hallo!
    ich habe hier wohl eine heiße Diskussion ausgelöst. Die Selbsteinschätzung ist natürlich immer Ansichtssache, aber das soll jetzt hier nicht zur Debatte stehen.
    Ich habe mein Problem jetzt wie folgt gelöst:
    Mein Problem war es, dass ich durch verschiedenste Abfragen festgestellt habe, ob in bestimmten Zellen sinnvolle Werte stehen, wenn dies nicht der Fall, dann soll alles beendet werden und der Benutzer darauf aufmerksam gemacht werden. Dies habe ich mit einer End-Funktion realisiert. Bei der Endfunktion ist allerdings, dass Problem, dass sie die derzeit gesetzten Variablen "leert". Da ich aber den Speicherpfad in einer Variablen gespeichert habe, ist dieser Pfad bei erneutem Aufrufen leer. Ich habe jetzt an die Stellen eine Prüfung gesetzt, ob der Pfad leer ist:
    If pfad = "" Then
    Verzeichnis.ordner_erstellen
    End If
    Wenn der Pfad leer ist, wird dieser neu erstellt ansonsten und alles läuft durch.
    Grüße

    Anzeige
    AW: Darum nicht!
    07.05.2014 13:12:09
    Daniel
    Hi
    in solchen Fällen lege ich ich mir immer ein weiters (verstecktes) Tabellenblatt an, auf dem ich solche Informationen, die nicht verloren gehen sollen, in Zellen ablege und bei Bedarf wieder auslese.
    Wenns sein muss, überleben die dort abgelegten Informationen auch ein Schließen der Datei und stehen bei einem erneuten Öffnen wieder zur verfügung (wenn gespeichert wurde).
    Gruß Daniel

    AW: Darum nicht!
    07.05.2014 13:22:42
    Heinz
    Hallo Daniel,
    das ist eine sehr gute Idee. Sozusagen als "Zwischenspeicher".
    Vielen Dank für das Feedback.
    Grüße

    nur weil du zu blöd bist
    07.05.2014 13:21:18
    Rudi
    ich werde mich nicht auf dein Niveau zu begeben.
    Das ist mir zu heiß, da es irgendwo in der Gegend des Erdkerns liegen muss.

    Anzeige
    AW: nur weil du zu blöd bist
    07.05.2014 13:30:09
    Daniel
    vielleicht könntest du das Niveau deiner Kritiken ein bisschen anheben und besser begründen, warum du einen anderen Beitrag schlecht findest?
    Gruß Daniel

    slowboarding to MVP or what? (owT)
    07.05.2014 13:36:28
    EtoPHG

    AW: slowboarding to MVP or what? (owT)
    07.05.2014 14:29:56
    Daniel
    ja schon klar.
    meine Lösung ist schlecht weil dann Zellen rot gefärbt werden.
    genauso hattest du es geschrieben.
    ist ne tolle begründung.
    Danke.
    Gruß Daniel

    Hierin kann man durchaus beipflichten, obwohl ...
    07.05.2014 15:28:04
    Luc:-?
    …euer Streit eigentlich nur VBA-typisch und im Grunde genommen gegenstandslos ist, Rudi & Daniel,
    wenn man mal über den „VBA-Tellerrand“ hinausschaut. In bspw J[ava]Script ist alles Function und man kann festlegen, ob die Function einen Wert (und welchen) zurückgibt oder das keinesfalls tun soll.
    Aber auch in VBA ist das ein „Streit um Kaisers Bart“, denn es können einerseits Werte von SubProz zu SubProz per Parametrierung durchgereicht wdn (wie Rudi ja schon anmerkte) und andererseits können Fktt einen zurückgeben. In beiden Fällen kann ein (meinethalben) Boolescher Wert den Erfüllungsstand melden, wie es auch einige Standard-VBA-Methoden vorexzerzieren.
    Dabei muss nur beachtet wdn, dass …
    1. …eine SubProz, die nicht-optionale oder nicht Variant-Parameter verlangt, nicht im MakroAssi angezeigt wird, weil sie nicht direkt, sondern nur aus einer VBA-Proz aufgerufen wdn kann;
    2. …eine FktProz entweder Private sein oder in einem Option Private Module stehen sollte, wenn sie nicht für den Einsatz in ZellFmln bestimmt u/o geeignet ist.
    Ansonsten will ich mal vermuten, dass sich Rudi in seiner AW auch auf die Null(-Gravity) im Erdmittelpkt bezieht… ;-)
    Gruß Luc :-?
    Besser informiert mit …

    Anzeige
    Exit Sub. VBA gut? owT
    07.05.2014 10:28:54
    Rudi

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige