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

Zwei Do..Loop Schleifen in 1 Prozedur

Zwei Do..Loop Schleifen in 1 Prozedur
10.09.2021 14:59:06
reiner
Hallo Leute,
in einer Prozedur wird eine Do until....Loop-Schleife fehlerfrei durchlaufen. Nun soll in der gleichen Prozedur eine zweite Do until....Loop-Schleife in Abhängigkeit einer IF-Bedingung durchlaufen werden:
Beispielcode:
If Bedingung1 =true then
Do until ....
If Bedingung2 =true then
Do until ....
zu durchlaufender Programmcode
zu durchlaufender Programmcode
zu durchlaufender Programmcode
zu durchlaufender Programmcode
zu durchlaufender Programmcode
Loop (Bedingung1)
Loop (Bedingung2)
Es erscheint die Fehlermeldung: Loop ohne Do
Ist es überhaupt möglich 2 Do..Loop Schleifen in 1 Prozedur in Abhängigkeit von 2 IF-Bedingungen funktionsfähig zu programmieren?
mfg
reiner

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zwei Do..Loop Schleifen in 1 Prozedur
10.09.2021 15:12:08
Daniel
Hi
meines Wissens nach kannst du beliebig viele DOs und IFs in einer Prozedur verwenden.
vielleicht gibts irgendwo technische Limits, aber auf jeden fall mehr als 2, auch ineinaner geschachtelt.
hier fehlen die End IFs.
wies aussehen muss, hängt davon ab ob die Loops nacheinaner laufen oder ob sie ineinander geschachtelt werden sollen.
was du willst, weiß ich nicht, dazu sind deine Angaben zu spärlich:
Nacheinander:

If Bedingung1 =true then
Do until ....
Loop (Bedingung1)
End If (Bedingung 1)
If Bedingung2 =true then
Do until ....
Loop (Bedingung2)
end if (Bedingung2)
Geschachtelt:

If Bedingung1 =true then
Do until ....
If Bedingung2 = True Then
Do Until ...
Loop (Bedingung 2)
end If (Bedingung2)
End If (Bedingung1)
Gruß Daniel
Anzeige
AW: Zwei Do..Loop Schleifen in 1 Prozedur
10.09.2021 16:16:10
reiner
Hallo,
die Loops sind nacheinander angeordnet, wie in der Fragestellung aufgeführt
Loop (Bedingung1)
Loop (Bedingung2)
End If (Bedingung1)
End If (Bedingung2)
stehen jeweils am Ende der Prozedur und führen zu der genannten Fehlermeldung
mit nur einem "Loop" und einem "End If" und einer jeweils auskommentierten (nicht-aktiven) Loop-Bedingung funktioniert dei Schleife, aber eben nicht wenn beide Loop-Bedingungen aktiv sind.
Die Datei überschreitet die hochladbare Dateigröße, sonst würde ich sie hochladen.
Sollte es tatsächlich keine Lösung geben werde ich den Programmcode auf 2 unterschiedliche Prozeduren aufteilen, das habe ich ich bereits andererseits erfolgreich praktiziert.
Anzeige
AW: Zwei Do..Loop Schleifen in 1 Prozedur
10.09.2021 17:19:36
Daniel
Beschreibt mal was du machen willst und zeig mal den konkreten Code dazu.
Was du bisher beschreibt, ist aus meiner Sicht komplett sinnlos.
Und wie gesagt, das ganze funktioniert wie Schachteln
Man kann zwei Schachteln nebeneinander stellen, oder ineinander.
Aber das was du beschreibt, ist verschränken, also zwei Schachteln halb ineinander stellen und das geht nicht.
Gruß Daniel
AW: Zwei Do..Loop Schleifen in 1 Prozedur
10.09.2021 17:57:01
reiner
Es geht um die Auswertung von aufgezeichneten 'ankommenden' und 'abgehenden Telefongesprächen einer privaten Telfonanlage. 9999396 ist eine der Telefonnummern. Die anderen Telefonnummern habe ich hier weggelassen, der jeweilige Programmcode ist entsprechend dem nachfolgenden aufgebaut.
Im dargestellten Programmcode werden die Gespräche nach ankommend und abgehend sortiert. Die Gespräche können monatsweise, per Kalenderauswahl oder per CB-Auswahl ausgewertet werden. Die CB-Auswahl bedingt eine andere Vorgehensweise als die Monats-bzw. Kalenderauswahl. Darum geht es.
Bei Anwahl der CB wird die Variable Gesprächsauswertung_CB ="1" gesetzt; bei der Monats-bzw. Kalenderauswahl wird dei Variable Gesprächsauswertung_Monat_Kalender ="1" gesetzt; die jeweils andere Variable ist dann natürlich "0". Über diese beiden Variablen soll die zugehörige Do until...Bedingung gesetzt werden bzw. NICHT gesetzt werden. Wenn beiden Do until.. Bedingungen in "Wartestellung" sind und die z.B. Monatsauswahl wird betätigt, dann erscheint die am Beginn genannte Fehlermeldung. Es geht also darum beide Do until.. Bedingungen in "Wartestellung" zu versetzen, eine Auswahl zu treffen UND KEINE Fehlermeldung zu erhalten.

  • 
    Public Function Markieren_und_auswerten_CB_Monat_Kalender()
    If Gesprächsauswertung_Monat_Kalender = 1 Then
    Do Until (BereichEnde - BereichAnfang) + 1 = Umlauf
    'If Gesprächsauswertung_CB = 1 Then
    '   Do Until cboDatumIndex + 1 = Umlauf
    '9999396################################################################################
    Umlauf = Umlauf + 1
    If frmGesprächszeit.optAbgehend_Page1.Value = False And frmGesprächszeit.optAnkommend_Page1.Value = False Then frmGesprächszeit.lblZeile.Caption = Umlauf & " Zeilen"
    If ActiveCell.Value = 9999396 Then GoTo 9999396
    9999396:
    ActiveCell.Offset(0, 23).Select 'Spalte "Y"
    'ohne Auswahl
    If frmGesprächszeit.optAbgehend_Page1.Value = False And frmGesprächszeit.optAnkommend_Page1.Value = False And ActiveCell.Value = "ankommendes Gespräch" Then
    If Gesprächsauswertung_CB = 1 Then Gesprächszeit_Umlauf = Gesprächszeit_Umlauf + 1
    ActiveCell.Offset(0, -17).Select 'Spalte "H" VorVorWahl-Nummer
    Spaltenüberprüfung
    ElseIf frmGesprächszeit.optAbgehend_Page1.Value = False And frmGesprächszeit.optAnkommend_Page1.Value = False And ActiveCell.Value = "abgehendes Gespräch" Then
    If Gesprächsauswertung_CB = 1 Then Gesprächszeit_Umlauf = Gesprächszeit_Umlauf + 1
    ActiveCell.Offset(0, -17).Select 'Spalte "H" VorVorWahl-Nummer
    Spaltenüberprüfung
    'optAbgehend gewählt
    ElseIf frmGesprächszeit.optAbgehend_Page1.Value = True And ActiveCell.Value = "abgehendes Gespräch" And optAbgehendGesprächszeit = 1 Then
    If Gesprächsauswertung_Monat_Kalender = 1 And ErsteZeileAuswertbereich = 0 Then ErsteZeileAuswertbereich = ActiveCell.EntireRow.Row - 1
    If Gesprächsauswertung_CB = 1 Then Gesprächszeit_Umlauf = 1
    ActiveCell.Offset(0, -17).Select 'Spalte "H" VorVorWahl-Nummer
    Umlauf_Abg = Umlauf_Abg + 1
    frmGesprächszeit.lblZeile.Caption = Umlauf_Abg & " Zeilen"
    Spaltenüberprüfung
    'optAnkommend gewählt
    ElseIf frmGesprächszeit.optAnkommend_Page1.Value = True And ActiveCell.Value = "ankommendes Gespräch" And optAnkommendGesprächszeit = 1 Then
    If Gesprächsauswertung_Monat_Kalender = 1 And ErsteZeileAuswertbereich = 0 Then ErsteZeileAuswertbereich = ActiveCell.EntireRow.Row - 1
    If Gesprächsauswertung_CB = 1 Then Gesprächszeit_Umlauf = Gesprächszeit_Umlauf + 1
    ActiveCell.Offset(0, -17).Select 'Spalte "H" VorVorWahl-Nummer
    Umlauf_Ank = Umlauf_Ank + 1
    frmGesprächszeit.lblZeile.Caption = Umlauf_Ank & " Zeilen"
    Spaltenüberprüfung
    Else
    Selection.EntireRow.Hidden = True
    If Gesprächsauswertung_Monat_Kalender = 1 Then Umlauf = Umlauf + 1
    ActiveCell.Offset(1, -23).Select
    GoTo NeuerUmlauf
    End If
    Berechnung9999396
    Weiter:
    LetzteZeileAuswertbereich = ActiveCell.EntireRow.Row - 1
    Loop
    End If ' Do until....
    Auswertung
    End Function
    

  • Anzeige
    AW: Zwei Do..Loop Schleifen in 1 Prozedur
    10.09.2021 18:09:37
    onur
    Sorry, habe deinen Code mir mal angeschaut und ich bin raus.
    Was soll denn das z.B.: "ActiveCell.EntireRow.Row" sein ?
    Oder das: "GoTo NeuerUmlauf" ?
    Abgesehen davon - mit GOTO arbeitet man seit den Neunzigern nicht mehr.
    Das ist nur eine pseudomoderne Marotte, ...
    10.09.2021 23:51:19
    Luc:-?
    …Onur,
    Zitat: Abgesehen davon - mit GOTO arbeitet man seit den Neunzigern nicht mehr.
    Das ist nur bei Pgmmiersprachen erforderlich, die den Befehl gar nicht mehr anbieten, wie bspw KI-Sprachen. Davon ist VB(A) aber 2 Entwicklungsstufen entfernt. Und was das meistgebrauchte Argument in diesem Zusammenhang betrifft, das wurde schon in den 60ern und 70ern verwendet, um Anfänger zu diszipliniert-folgerichtigem AblaufDenken hinzuführen. Hat nur bei Autodidakten mitunter nicht viel genutzt.
    Eines gilt aber auf jeden Fall - sparsamer Einsatz aller SprungBefehle und idR von oben nach unten (abgesehen mal von Rücksprüngen per Return).
    Wer ein Pgm nur nach dem Einsatz von SprungBefehlen beurteilt, hat meist nicht genug Ahnung und geht deshalb rein formal vor. Ein KI-Pgm würde so einer ohnehin kaum verstehen. Und nicht immer ist es sinnvoll oder gar möglich, PgmAbläufe so zu gliedern, dass auf alle Arten von Sprungbefehlen verzichtet wdn kann. Ein GoTo ist da ja nur der einfachste Fall.
    Gruß, Luc :-?
    Anzeige
    AW: Das ist nur eine pseudomoderne Marotte, ...
    11.09.2021 00:18:44
    Daniel
    Naja Luc, das Sprungziel sollte zumindest vorhanden sein.
    Findest du nicht?
    Auch die beste und modernste KI-Sprache braucht diesbezüglich klare Anweisungen und kann nicht den Wunsch des Progrmierers erraten.
    Ich bezog mich 1deutig auf Onurs LETZTEN Satz! owT
    11.09.2021 17:39:36
    Luc:-?
    :-?
    AW: Zwei Do..Loop Schleifen in 1 Prozedur
    10.09.2021 18:54:56
    Daniel
    HI
    ok, ich vermute ich hab das Problem verstanden.
    Du hast eigentlich eine einzige DO-Loop-Schleife, aber du willst unterschiedliche Abbruch-Bedingungen verwenden, je nach dem ob
    Gesprächsauswertung_Monat_Kalender oder ob Gesprächsauswertung_CB gewählt wurde.
    wenn jetzt die Werte "(BereichEnde - BereichAnfang) + 1" und " cboDatumIndex + 1" über den Schleifenverlauf nicht verändert werden,
    könnte man einfach programmieren:
    
    Public Function Markieren_und_auswerten_CB_Monat_Kalender()
    Dim Ende As long
    If Gesprächsauswertung_Monat_Kalender = 1 Then Ende = BereichEnde - BereichAnfang) + 1
    If Gesprächsauswertung_CB = 1 Then Ende = cboDatumIndex + 1
    If Ende = 0 then Exit Sub 'nicht ausgewählt
    Do Until Umlauf = Ende
    Umlauf = Umlauf + 1
    
    wobei man dann hier auch anstelle von Do_Loop auch ein For-Next einsetzen könnte, was folgende Vorteile hat:
    - keine Endlosschleifen möglich
    - etwas schneller als Do-Loop
    - Schleifenzähler wird automatisch mit hochgezählt
    also
    
    for Umlauf = Umlauf to Ende
    Next
    
    etwas anders sieht es aus, wenn sich die Abbruchbedingungen über den Schleifenverlauf ändern können.
    Dann braucht man zwingend das Do-Loop und die Grenzwerte für den Abbruch müssen auch immer aktuell berechnet werden und können nicht vorab bestimmt werden.
    Dann muss man das so machen, wenn man unterschiedliche Abbruchbedingungen hat:
    man startet die Schleife erstmal mit DO ohne irgendwas und programmiert die Abbruchbedingung mit EXIT DO innerhalb der schleife
    Da hat man dann noch mehr Möglcihkeiten, das flexibel zu gestalten und kann dann auch mehrere Progammzeilen dafür verwenden:
    
    Public Function Markieren_und_auswerten_CB_Monat_Kalender()
    DO
    If Gesprächsauswertung_Monat_Kalender = 1 Then
    IF (BereichEnde - BereichAnfang) + 1 = Umlauf Then Exit Do
    ElseIf Gesprächsauswertung_CB = 1 Then
    IF cboDatumIndex + 1 = Umlauf Then Exit Do
    Else
    Exit Do '--- ´Sofortabbruch, wenn keine der beiden Optionen gewählt wurde
    end If
    Umlauf = Umlauf + 1
    .... hier dann der weitere Code
    Loop
    
    Gruß Daniel
    Anzeige
    AW: Zwei Do..Loop Schleifen in 1 Prozedur
    11.09.2021 01:41:47
    reiner
    hallo,
    es ist schon spät, leider konnte ich deinen Vorschlag nicht früher austesten sodass ich erst jetzt Gelegenheit dazu hatte.
    Ich hatte mir nach dem Absenden meines Programmcodes überlegt ob mein Vorhaben nicht mit nur einer Do .. Loop - Bedingung realisiert werden kann.
    Im Prinzip so wie du es mir beschrieben hast; es läuft noch nicht so richtig rund aber ich bin guter Hoffnung dass das Problem mit deinem Ansatz zum gewünschrten Ergebnis führt, vielen Dank dafür
    reiner
    AW: Zwei Do..Loop Schleifen in 1 Prozedur
    10.09.2021 17:07:58
    onur
    Gib doch mal ein KONKRETES Code-Beispiel, statt irgend welcher Allgemeinplätze wie "Bedingung1 " und "Do until....", wenn du hier eine konkrete Antwort willst.
    Ich weiss ja nicht mal, was du mit "Loop (Bedingung1)" genau meinst.
    Anzeige
    AW: Zwei Do..Loop Schleifen in 1 Prozedur
    10.09.2021 17:11:18
    Dieter
    If Bedingung1 =true then
    Do until ....
    If Bedingung2 =true then
    Do until ....
    zu durchlaufender Programmcode
    zu durchlaufender Programmcode
    zu durchlaufender Programmcode
    zu durchlaufender Programmcode
    zu durchlaufender Programmcode
    Loop (Bedingung2)
    End if
    Loop (Bedingung1)
    end if

    218 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige