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

Geschachtelte Steuerungsstrukturen

Forumthread: Geschachtelte Steuerungsstrukturen

Geschachtelte Steuerungsstrukturen
02.12.2024 15:04:23
siefenv
Hallo zusammen,

Das ist mein erster Post in diesem Forum - falls ich also falsch bin, bitte ich freundlich darum, in den richtigen Forumsbereich verschoben zu werden :-)

Ich habe schon öfter versucht, Schleifen und Bedingungen zu verschachteln. Bei If-Bedingungen löse ich das als Workaround bisher immer so, dass ich die If-Anweisung in der einzeiligen Version für die geschachtelte Bedingung nutze. Allerdings lese ich immer wieder Codebeispiele, bei denen die Verschachtelung auch so funktioniert und wundere mich. Vor allem auch, weil es in der Microsoft Doku folgende Seite gibt: https://learn.microsoft.com/de-de/dotnet/visual-basic/programming-guide/language-features/control-flow/nested-control-structures

Ich versuche aktuell mal wieder, zwei Schleifen (in dem Fall for-Schleifen) zu verschachteln. Das sieht aktuell dann so aus:

For i = 1 To 6


Select Case i
Case 1
Sheets("90_Intern").Select
Case 2
Sheets("90_Extern").Select
Case 3
Sheets("90_Unbekannt").Select
Case 4
Sheets("180_Intern").Select
Case 5
Sheets("180_Extern").Select
Case 6
Sheets("180_Unbekannt").Select

ActiveSheet.UsedRange.ClearContents

For j = 1 To 12

Select Case j
Case 1
headlineStr = "Login:"
columnWidthDbl = 11
Case 2
headlineStr = "Vorname:"
columnWidthDbl = 11
Case 3
headlineStr = "Nachname:"
columnWidthDbl = 11
Case 4
headlineStr = "Firma:"
columnWidthDbl = 11
Case 5
headlineStr = "Orga:"
columnWidthDbl = 11
Case 6
headlineStr = "Position:"
columnWidthDbl = 11
Case 7
headlineStr = "Büro:"
columnWidthDbl = 11
Case 8
headlineStr = "Bereits deaktiviert:"
columnWidthDbl = 18
Case 9
headlineStr = "Deaktivierung am:"
columnWidthDbl = 18
Case 10
headlineStr = "Grund:"
columnWidthDbl = 45
Case 11
headlineStr = "Beschreibung:"
columnWidthDbl = 55
Case 12
headlineStr = "Letzte Änderung:"
columnWidthDbl = 20

With Cells(1, j)
.Font.Bold = True
.Value = headlineStr
.ColumnWidth = columnWidthDbl
End With

headlineStr = ""
columnWidthDbl = 0

Next j

Next i


Kann sein, dass der Code innerhalb der Schleifen auch so nicht funktioniert, weil man z.B. die Spaltenbreite nicht auf einzelne Zellen beziehen darf (weiß ich nicht), aber darum geht es mir jetzt nicht. Ich bekomme beim kompilieren immer den Fehler, "Next ohne for", obwohl ich das meiner Meinung nach genauso mache wie in der Doku und im Netz habe ich bisher auch nichts dazu passendes gefunden. Was mache ich falsch / wo ist der Denkfehler?

Vielen Dank im Voraus und viele Grüße
Victor Siefen
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Geschachtelte Steuerungsstrukturen
02.12.2024 15:15:05
peter
Hallo

Es fehlen die END SELECT

Peter
AW: Geschachtelte Steuerungsstrukturen
02.12.2024 15:19:18
daniel
Hi
der Fehler ist, dass du bei den beiden "Select Case" vergessen hast, das End Select zu platzieren.
die Fehlermeldung ist hier leider verwirrend, das liegt aber daran, wie der Code abgearbeitet wird und wann der Fehler auftritt.

aber so wie du das bisher programmiert hast, gehört die zweite Schleife NUR zum fall "Case 6" und in allen anderen Fällen passiert nichts.
auch im zweiten Block gehört das With Cells(...) nur zum Fall "Case 12".

du meinst das vermutlich so:

For i = 1 To 6


Select Case i
Case 1
Sheets("90_Intern").Select
Case 2
Sheets("90_Extern").Select
Case 3
Sheets("90_Unbekannt").Select
Case 4
Sheets("180_Intern").Select
Case 5
Sheets("180_Extern").Select
Case 6
Sheets("180_Unbekannt").Select
End Select
ActiveSheet.UsedRange.ClearContents

For j = 1 To 12

Select Case j
Case 1
headlineStr = "Login:"
columnWidthDbl = 11
Case 2
headlineStr = "Vorname:"
columnWidthDbl = 11
Case 3
headlineStr = "Nachname:"
columnWidthDbl = 11
Case 4
headlineStr = "Firma:"
columnWidthDbl = 11
Case 5
headlineStr = "Orga:"
columnWidthDbl = 11
Case 6
headlineStr = "Position:"
columnWidthDbl = 11
Case 7
headlineStr = "Büro:"
columnWidthDbl = 11
Case 8
headlineStr = "Bereits deaktiviert:"
columnWidthDbl = 18
Case 9
headlineStr = "Deaktivierung am:"
columnWidthDbl = 18
Case 10
headlineStr = "Grund:"
columnWidthDbl = 45
Case 11
headlineStr = "Beschreibung:"
columnWidthDbl = 55
Case 12
headlineStr = "Letzte Änderung:"
columnWidthDbl = 20
End Select

With Cells(1, j)
.Font.Bold = True
.Value = headlineStr
.ColumnWidth = columnWidthDbl
End With

headlineStr = ""
columnWidthDbl = 0

Next j

Next i

Gruß Daniel
Anzeige
AW: Geschachtelte Steuerungsstrukturen
02.12.2024 15:36:03
daniel
Hi
mal unabhängig vom Problem, ich würde, wenn die Schleife tatsächlich so läuft, nicht mit Select Case, sondern mit Arrays arbeiten.
das macht den Code kompakter und übersichtlicher, vor allem die Schleife wird dann kürzer.


Sub Makro1()

Dim sh(1 To 6) As String
Dim hl(1 To 12) As String
Dim cw(1 To 12) As Long

Dim i As Long
Dim j As Long

sh(1) = "90_Intern"
sh(2) = "90_Extern"
sh(3) = "90_Unbekannt"
sh(4) = "180_Intern"
sh(5) = "180_Extern"
sh(6) = "180_Unbekannt"

hl(1) = "Login:"
hl(2) = "Vorname:"
hl(3) = "Nachname:"
hl(4) = "Firma:"
hl(5) = "Orga:"
hl(6) = "Position:"
hl(7) = "Büro:"
hl(8) = "Bereits deaktiviert:"
hl(9) = "Deaktivierung am:"
hl(10) = "Grund:"
hl(11) = "Beschreibung:"
hl(12) = "Letzte Änderung:"

cw(1) = 11
cw(2) = 11
cw(3) = 11
cw(4) = 11
cw(5) = 11
cw(6) = 11
cw(7) = 11
cw(8) = 18
cw(9) = 18
cw(10) = 45
cw(11) = 55
cw(12) = 20

For i = 1 To 6
For j = 1 To 12
With Sheets(sh(i)).Cells(1, j)
.Font.Bold = True
.Value = hl(j)
.ColumnWidth = cw(j)
End With
Next j
Next i

End Sub

Anzeige
AW: Geschachtelte Steuerungsstrukturen
02.12.2024 16:54:36
snb
Oder:

Sub M_snb()

sn = Split("Login: Vorname: Nachname: Firma: Orga: Position: Büro: Bereits deaktiviert: Deaktivierung am: Grund: Beschreibung: Letzte Änderung:")

For j = 0 To 5
With Sheets(IIf(j 3, "90_", "180_") & Choose(j Mod 3 + 1, "intern", "extern", "unbekannt")).Cells(1).Resize(, 12)
.Value = sn
.Font.Bold = True
.Parent.Columns.AutoFit
End With
Next
End Sub

Anzeige
AW: Geschachtelte Steuerungsstrukturen
02.12.2024 17:49:22
daniel
Hi
noch ne Variante:

1. lege dir ein Vorlagenblatt an, schriebe in Zeile1 die Texte, formatiere sie und stelle dort die passende Spaltenbreite ein.
2. Kopiere dann einfach diese Zeile und füge sie mit Spaltenbreite ein:
das spart dir dann die komplette innere Schleife, auch musst du im Code nichts ändern, wenn sich mal eine Überschrift ändert oder die Spaltenbreite.
Sheets("Vorlage").Range("A1:L1").Copy

With ActiveSheet.Cells(1, 1)
.PasteSpecial xlpastevalues
.PasteSpecial xlpasteformats
.PasteSpecial xlpastecolumnwidth
end with


Gruß Daniel
Anzeige
AW: Geschachtelte Steuerungsstrukturen
03.12.2024 10:46:02
snb
Es ist nie eine gute Idee gleichartige Daten in Unterschiedliche Arbeistblättern zu speichern.
Sie gehören in nur 1 Arbeitsblatt.
In einer extra Spalte (zB. namens 'Art') kann man 90_intern, 90-extern, usw speichern in einer dynamische Tabelle.
Für Auswertungen stehen dann viele Hilsmittel zur Verfügung : filter(s), pivottable, usw.
Anzeige
AW: Geschachtelte Steuerungsstrukturen
02.12.2024 17:05:38
snb
Oder eben:

Sub M_snb()

With Sheets(1).Cells(1).Resize(, 12)
.Value = Split("Login: Vorname: Nachname: Firma: Orga: Position: Büro: Bereits deaktiviert: Deaktivierung am: Grund: Beschreibung: Letzte Änderung:")
.Font.Bold = True
.Parent.Columns.AutoFit
End With
Sheets.FillAcrossSheets Sheets(1).Cells(1).Resize(, 12), -4104
End Sub

Anzeige
AW: Geschachtelte Steuerungsstrukturen
02.12.2024 17:43:15
daniel
HI snb
das testest du aber bitte nochmal.
Danke.
AW: Geschachtelte Steuerungsstrukturen
02.12.2024 17:09:00
siefenv
Danke, das ist nett von euch. Aber bevor sich hier noch weitere ins Zeug legen und noch kürzere Versionen raushauen: Das Makro an sich ist extra übersichtlich und mit klar verständlichen Variablennamen geschrieben, damit Kolleg*innen in Zukunft auch noch damit arbeiten und vielleicht auch etwas am Code ändern können. Deshalb benenne ich Variablen immer mit verständlichem Namen und Dem Datentyp in kurz dahinter (z.B. headlineStr).
Die Schreibweise mit Select Case hab ich gewählt, weil man dann zu jeder Zelle gut erkennen kann, welche Eigenschaften zugewiesen werden und im Nachhinein auch an derselben Stelle leicht verändern kann.

Autofit ist glaube ich keine gute Option, weil bspw. die Spalte "Grund:" dann doch nur so breit wäre, wie die Überschrift und darunter müssen ja lange Begründungen passen. Selbst wenn die Spaltenbreite dann an die einzelnen Einträge angepasst wird (was ich nicht weiß), ist das auch keine gute Option, weil die Spalte ja dann am Ende ewig lang wird.
Anzeige
AW: Geschachtelte Steuerungsstrukturen
02.12.2024 15:33:02
siefenv
Prima! Danke. Die Fehlermeldung ist dann wirklich irreführend. Hatte sie schon ein paar mal und bin immer davon ausgegangen, dass irgendetwas mit der Verschachtelung nicht stimmt, aber offenbar lag es dann immer an anderen Sachen. Hab gerade mal eine verschachtelte If-Bedingung ausprobiert und die funktioniert auch ohne Probleme. Die "End XXX"-Anweisung bereitet mir immer wieder Probleme, weil ich sie vergesse :/
Anzeige
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18