Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1816to1820
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

Verschachtelte Schleifen

Verschachtelte Schleifen
11.03.2021 09:41:56
Steff
Hallo zusammen,
ich habe eine Frage bezüglich verschachtelten Schleifen. Ich habe eine Range in der X-Werte stehen. Außerdem habe ich ein Dropdown mit Mehrfachselektion, welches prüft, welcher Wert selektiert wurde. Ziel:
Durchlaufe jeden Wert des Arrays und vergleiche, ob der Wert dem selektierten Wert der Dropdownfelder entspricht. If Wert Array = selektierter Wert, dann... else, was anderes.... Das soll er für jeden Wert des Arrays machen, wobei die Werte der Selektion natürlich weniger sein könnten. Nachstehend habe ich bereits den Code zu großen Teilen (auch mit eurer Hilfe entwickelt). Leider hänge ich an der Reihenfolge der next Platzierung und er nimmt sich nicht immer den nächsten Array Wert, sondern durchläuft erst die Selektion.
Sub Schleifen ()
VarDatInd = Array("1", "2", "3")
VarDat = Tabelle11.Range("rng1")
If Range("X").Value = True And Range("Y").Value = True Then
For Each VarFeld In VarDat
With Tabelle1.x
For ii = 0 To .ListCount - 1
If .Selected(ii) = True Then
'X steht für Auswahl
X = .List(ii, 0)
If X = VarFeld Then
wdDoc.Bookmarks("..." & X).Range.InsertAfter Range("...").Value
wdDoc.Bookmarks("..." & X).Range.InsertAfter Range("...").Value
Else
wdDoc.Bookmarks("..." & VarFeld).Range.InsertAfter Range("...").Value
wdDoc.Bookmarks("..." & VarFeld).Range.InsertAfter Range("...").Value
End If
Next VarFeld
Next
End With
End Sub
Vorstellung: Erste Schleife Wert aus dem Array ziehen. Mit der Selektion vergleichen und dann die If-Bedingung abfragen. Dann nächster Wert aus dem Array mit dem nächsten Wert der Selektion. P.s. Die Reihenfolge des Arrays und der Selektion sind 1 zu 1 in der gleichen Reihenfolge implementiert.
Danke für eure Hilfe!

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

Betreff
Datum
Anwender
Anzeige
AW: Verschachtelte Schleifen
11.03.2021 09:51:01
Rudi
Hallo,
natürlich erst Next ii und dann Next VarFeld.
Gruß
Rudi

AW: Verschachtelte Schleifen
11.03.2021 09:56:14
Steff
Hallo Rudi,
danke für deine schnelle Antwort.
Leider ergibt sich dann das Problem, dass er erst die gesamte Selektion durchgeht:
Beispiel: Im Array erkennt er als erstes den Wert 1. Dann wandert er in die Selektion und erkennt ebenfalls den Wert 1. Soweit so gut, aber dann geht er zum next der Selektion und erkennt bspw. 2. Im Array steht aber immer noch 1, weil er nicht den nächsten Array-Wert zieht. Er muss aber in der nächsten Runde erst im Array weiterspringen. Ich hoffe das war verständlich.
Hier mit deinen Anmerkungen.
Sub Schleifen ()
VarDatInd = Array("1", "2", "3")
VarDat = Tabelle11.Range("rng1")
If Range("X").Value = True And Range("Y").Value = True Then
For Each VarFeld In VarDat
With Tabelle1.x
For ii = 0 To .ListCount - 1
If .Selected(ii) = True Then
'X steht für Auswahl
X = .List(ii, 0)
If X = VarFeld Then
wdDoc.Bookmarks("..." & X).Range.InsertAfter Range("...").Value
wdDoc.Bookmarks("..." & X).Range.InsertAfter Range("...").Value
Else
wdDoc.Bookmarks("..." & VarFeld).Range.InsertAfter Range("...").Value
wdDoc.Bookmarks("..." & VarFeld).Range.InsertAfter Range("...").Value
End If
Next
Next VarFeld
End With
End Sub


Anzeige
AW: Verschachtelte Schleifen
11.03.2021 10:24:26
Rudi
Hallo,
Ich hoffe das war verständlich.
nicht wirklich.
Hilft es, erst die A uswahl auszulesen?
Sub Schleifen()
Dim strSel As String, varSel
Dim varFeld
VarDatInd = Array("1", "2", "3")
VarDat = Tabelle11.Range("rng1")
With Tabelle1.X
For ii = 0 To .ListCount - 1
If .Selected(ii) Then
strSel = strSel & "|" & .List(ii)
End If
Next ii
End With
varSel = Split(Mid(strSel, 2), "|") 'Array mit Auswahl
If Range("X").Value = True And Range("Y").Value = True Then
For Each varFeld In VarDat
If Not IsError(Application.Match(varFeld, varSel, 0)) Then
wdDoc.Bookmarks("..." & X).Range.InsertAfter Range("...").Value
wdDoc.Bookmarks("..." & X).Range.InsertAfter Range("...").Value
Else
wdDoc.Bookmarks("..." & varFeld).Range.InsertAfter Range("...").Value
wdDoc.Bookmarks("..." & varFeld).Range.InsertAfter Range("...").Value
End If
Next varFeld
End If
End Sub

Gruß
Rudi

Anzeige
AW: Verschachtelte Schleifen
11.03.2021 10:54:22
Steff
Hallo Rudi,
herausragend! Somit erstelle ich erst ein Array der Selektion und Vergleiche dann nach und nach varSel gegen varFeld.
Ich versuche es deutlicher zu erklären: Ich habe eine Liste als Array in einer bestimmten Reihenfolge, dieses soll nacheinander durchlaufen werden. Mein Dropdown-Menü verfügt, über die gleiche Reihenfolge und Werte. In jedem Lauf soll geprüft werden, ob der aktuelle Wert des ersten Arrays mit dem aktuellen Wert der Selektion übereinstimmt. Deswegen X = varFeld.
Im nächsten Lauf muss das erste Array und der Wert der Selektion springen, ansonsten bleibt der Wert des ersten Arrays die ganze Zeit gleich.
Viele Grüße

Anzeige
AW: Verschachtelte Schleifen
11.03.2021 13:06:00
Steff
Hi, ich hoffe es kann mir jemand helfen. Ich habe nochmal den Code bearbeitet, komme aber noch nicht zum gewünschten Ergebnis.
1. Ganzer Lauf: Er erkennt in der ersten Runde "112" aus der Selektion und er erkennt "112" in der Selektion. Somit erhalte ich dann den richtigen Vergleich. Dann soll der zweite Lauf folgen:
2. Ganzer Lauf (Wunsch): Die Prüfung der Selektion springt auf den nächsten Wert und das zweite Array soll ebenfalls einen Wert weiterspringen.
Aktuell: strSel behält solange "112" bis die innere Schleife durch ist. Das führt aber dazu, dass die Textmarken doppelt und dreifach befüllt werden. Eigentlich hätte ich gern einen Sprung beider Schleifen bevor es wieder los geht.
Sub x()
Dim strSel As String, varSel
Dim varFeld
With Tabelle1.lbzusSB
For ii = 0 To .ListCount - 1
If .Selected(ii) Then
strSel = .List(ii)
For Each varFeld In VarDat
If strSel = varFeld Then
wdDoc.Bookmarks("TM_VKSB" & strSel).Range.InsertAfter Range("UE_VK_SB2").Value
wdDoc.Bookmarks("TM_TKSB" & strSel).Range.InsertAfter Range("UE_TK_SB2").Value
Else
wdDoc.Bookmarks("TM_VKSB" & strSel).Range.InsertAfter Range("UE_VK_SB1").Value
wdDoc.Bookmarks("TM_TKSB" & strSel).Range.InsertAfter Range("UE_TK_SB1").Value
End If
Next varFeld
End If
Next ii
End With
End Sub


Anzeige
AW: Verschachtelte Schleifen
11.03.2021 13:06:01
Steff
Hi, ich hoffe es kann mir jemand helfen. Ich habe nochmal den Code bearbeitet, komme aber noch nicht zum gewünschten Ergebnis.
1. Ganzer Lauf: Er erkennt in der ersten Runde "112" aus der Selektion und er erkennt "112" in der Selektion. Somit erhalte ich dann den richtigen Vergleich. Dann soll der zweite Lauf folgen:
2. Ganzer Lauf (Wunsch): Die Prüfung der Selektion springt auf den nächsten Wert und das zweite Array soll ebenfalls einen Wert weiterspringen.
Aktuell: strSel behält solange "112" bis die innere Schleife durch ist. Das führt aber dazu, dass die Textmarken doppelt und dreifach befüllt werden. Eigentlich hätte ich gern einen Sprung beider Schleifen bevor es wieder los geht.
Sub x()
Dim strSel As String, varSel
Dim varFeld
With Tabelle1.lbzusSB
For ii = 0 To .ListCount - 1
If .Selected(ii) Then
strSel = .List(ii)
For Each varFeld In VarDat
If strSel = varFeld Then
wdDoc.Bookmarks("TM_VKSB" & strSel).Range.InsertAfter Range("UE_VK_SB2").Value
wdDoc.Bookmarks("TM_TKSB" & strSel).Range.InsertAfter Range("UE_TK_SB2").Value
Else
wdDoc.Bookmarks("TM_VKSB" & strSel).Range.InsertAfter Range("UE_VK_SB1").Value
wdDoc.Bookmarks("TM_TKSB" & strSel).Range.InsertAfter Range("UE_TK_SB1").Value
End If
Next varFeld
End If
Next ii
End With
End Sub


Anzeige
AW: Verschachtelte Schleifen | Idee?
12.03.2021 07:21:13
Steff
Guten Morgen,
hat jemand eine Idee? :)
Danke für die ganze Mühe bisher.

Verschachtelte Schleifen | Eigene Ansätze
12.03.2021 08:32:32
Steff
Hallo alle,
hallo Rudi,
ich habe mir den Code nochmal in Ruhe angeschaut und auf meine Bedürfnisse zugeschnitten. Mit eurer Hilfe erstelle ich ein Array der Selektion. Im nächsten Schritt gehe ich in die "For each" - Schleife und wenn ich es richtig verstanden habe, sollte das Makro prüfen, ob der aktuelle Wert des ersten Arrays mit einem der Werte im selbst erstellten Array übereinstimmt, richtig?
Nachstehend findet ihr den Code. Beispielhaft: Wenn der Wert von VarFeld = 112 und das Selektionsarray auch = 112 ausgibt, möchte ich die "dann" Bedingung ziehen. Macht er aber nicht, weil er anscheinend nicht richtig matched, oder?
Sub ...()
Dim VarDat As Variant
Dim VarFeld As Variant
'On Error Resume Next
VarDatInd = Array("1", "2", "3")
VarDat = Tabelle11.Range("rngWKZ")
Dim strSel As String, varSel
With Tabelle1.X
For ii = 0 To .ListCount - 1
If .Selected(ii) Then
strSel = strSel & "|" & .List(ii)
End If
Next ii
End With
varSel = Split(Mid(strSel, 2), "|") 'Array mit Auswahl
If Range("x").Value = True And Range("y").Value = True Then
For Each VarFeld In VarDat
If Not IsError(Application.Match(VarFeld , varSel, False)) Then
wdDoc.Bookmarks("TM_VKSB" & VarFeld ).Range.InsertAfter Range("...").Value
wdDoc.Bookmarks("TM_TKSB" & VarFeld ).Range.InsertAfter Range("...").Value
Else
wdDoc.Bookmarks("TM_VKSB" & VarFeld ).Range.InsertAfter Range("....").Value
wdDoc.Bookmarks("TM_TKSB" & VarFeld ).Range.InsertAfter Range(".....").Value
End If
Next VarFeldWKZ
End 

Sub


Anzeige
AW: Verschachtelte Schleifen | Eigene Ansätze
12.03.2021 21:13:48
Yal
Hallo Steff,
eigentlich sollte alles passen, ausser
wenn am Anfang "For Each xyz in..." steht,
dann steht am Ende "Next xyz" und nicht "Next xyzWKZ". Man kann auch "Next" allein schreiben. Aber wenn mehrere Schleife ineinander laufen, ist es leichter zu lesen:
For i = 1 to 10
For j = 1 to 10
Debug.print 10 * i + j
Next j
Next i

(dass ein Anfang-Ende nur innerhalb der anderen Anfang-Ende sein darf, ist auch klar oder? Heisst in dem Fall nur Next i und Next j zu tauschen geht nicht. For i und For j müssten dann auch getauscht werden)
Folgenden zwei Versionen sind genauso gleichwertig. Eine ist "leichter" oder "logischer":
If Not dies Then
a
Else
b
End If
ggü.:
If dies Then
b
Else
a
End If
Aber wenn a und b genau das gleich ist, brauchst Du keinen If.
Du möchtest den Inhalt des Arrays durchgehen. Dein Array heisst varSel und ist durch den Split erzeugt worden. Dann sollte die dafür gedachte For-Schleife
For Each Element in varSel

heissen.
varDat ist ein Range. Cells mag der Default-Eigenschaft von Range sein (also, das was kommt, wenn man sonst nichts spezifiziert), aber sauberer wäre
For Each Varfeld in VarDat.Cells
Idealerweise würde man nach einem gegebenen Wert in einer Gruppen von Zellen (=Range) suchen und nicht umgekehrt. Dafür ist nicht Match sondern Find zu verwenden. Es wird einen einzelligen Range zurückgegeben oder "Nothing"
For Each Eintrag in varSel
rngGefunden = MeinDefinierteRange.Find(Eintrag)
If rngGefunden is Nothing then
'Was passiert, wenn nichts gefunden? Wenn nichts, siehe beide If-Versionen
Else
'Es wurde in der Zelle rngGefunden den Eintrag gefunden. rngGefunden wird jetzt  _
verwendet.
End If
Next Eintrag
Ich hoffe, es kann Dir helfen auf dem Weg zum erwünschten "VBA gut".
Viel Erfolg
Yal

Anzeige
AW: Verschachtelte Schleifen
14.03.2021 23:55:15
Piet
Hallo
dein Thread, das es dafür keine Lösung gibt, hat mich nicht in Ruhe gelassen. Mir ist es gelungen das Listenfeld auszulesen und seitlich aufzulisten, mit einem "ok" ob der Wert in Spalte A vorkommt. Was ich nicht verstanden habe ist die Auswertung mit deinem Array, wozu du noch "1,2,3" benötigst?
Wenn du aber schon mal klare Verhaeltnisse hast welche Werte Okay sind kannst du deine "1,2,3" Auswertung mit einbauen, oder wertest danach mit einer zweiten Scheife dein Array aus. Ich nehme an es handelt sich um weitere Datern in der Tabelle? Da habe ich aber in deinem Code nicht durchgeblickt.
Würde mich freuen wenn dir meine kleine Lösung weiterhilft. Die braucht nur Millisekunden zum auflisten.
https://www.herber.de/bbs/user/144793.xlsm
mfg Piet

Anzeige
AW: Verschachtelte Schleifen
15.03.2021 12:47:17
Steff
Hallo Piet,
hallo Yal,
wahrscheinlich hat mich dieses ganze "Schleifen ineinander" laufen lassen, etwas aus der Spur geworfen, aber! ich habe dank eurer Ansätze eine Lösung gefunden und diese funktioniert sehr erfolgreich. Leider konnte ich euch nicht alle Inhalte der zu lösenden Aufgabe geben (Firma) und meine Abstraktion war nicht immer präzise genug. Dennoch gilt: Lösung ist da. Da ich diese Schleifen mehrfach mit mehreren Selektionen prüfen muss, habe ich nun von Außen nach Innen gearbeitet. Erst die 3te Selektion in ein Array schreiben, dann die 2te Selektion und im letzten Schritt sage ich "für die restlichen Werte, die nicht in der Selektion vorkommen, nimm bitte eine bestimmte Range für das Worddokument". Außerdem bilde ich noch ein Gesamtarray, um hier Überschneidungen zu vermeiden.
Zur Beantwortung der Frage Array = 1,2,3 - das benötige ich für frei wählbare Variablen, die im Worddokument mit 1 2 und 3 hinter einem Namen laufen. Hier erstmal nachrangig.
Sub ...()
Dim VarDat As Variant
Dim varFeld As Variant
Dim VarDatWKZ As Variant
Dim VarFeldWKZ As Variant
Dim VarDatWKZAlle As Variant
Dim VarFeldWKZAlle As Variant
Dim Test As String, strSelAll, varSel, strSel2, varSel2, varSelAll, strSel
Dim intSel As Integer
VarDatWKZ = Tabelle11.Range("rngWKZ")
'Wenn 3te Selektion Wahr, dann
If Range("UE_weitSB").Value = True Then
With Tabelle1.lbweitSB
For ii = 0 To .ListCount - 1
If .Selected(ii) Then
strSel = strSel & "|" & .List(ii)
strSelAll = strSelAll & "|" & .List(ii)
End If
Next ii
End With
varSel = Split(Mid(strSel, 2), "|") 'Array mit Auswahl
For Each strSel In varSel
wdDoc.Bookmarks("TM_VKSB" & strSel).Range.InsertAfter Range("UE_VK_SB3").Value
wdDoc.Bookmarks("TM_TKSB" & strSel).Range.InsertAfter Range("UE_TK_SB3").Value
If Range("UE_ALTNDECKUNG3_JN").Value = True Then
wdDoc.Bookmarks("TM_TKSB" & strSel & "Einzel").Range.InsertAfter Range(" _
UE_TK_SB3_ALTERNATIV").Value
Else
wdDoc.Bookmarks("TM_TKSB" & strSel & "Einzel").Range.InsertAfter Range("UE_TK_SB3"). _
Value
End If
Next strSel
End If
'Wenn 2te Wahr, dann
If Range("UE_zusSB").Value = True Then
With Tabelle1.lbzusSB
For ii = 0 To .ListCount - 1
If .Selected(ii) Then
strSel2 = strSel2 & "|" & .List(ii)
strSelAll = strSelAll & "|" & .List(ii)
End If
Next ii
End With
varSel2 = Split(Mid(strSel2, 2), "|") 'Array mit Auswahl
For Each strSel2 In varSel2
wdDoc.Bookmarks("TM_VKSB" & strSel2).Range.InsertAfter Range("UE_VK_SB2").Value
wdDoc.Bookmarks("TM_TKSB" & strSel2).Range.InsertAfter Range("UE_TK_SB2").Value
If Range("UE_ALTNDECKUNG3_JN").Value = True Then
wdDoc.Bookmarks("TM_TKSB" & strSel2 & "Einzel").Range.InsertAfter Range(" _
UE_TK_SB2_ALTERNATIV").Value
Else
wdDoc.Bookmarks("TM_TKSB" & strSel2 & "Einzel").Range.InsertAfter Range("UE_TK_SB2"). _
Value
End If
Next strSel2
End If
'Gesamtes Array bilden für Schnittmenge
varSelAll = Split(Mid(strSelAll, 2), "|")
'Restliche Werte verarbeiten
If Range("UE_alleRisiken").Value = True Then
VarDatWKZAlle = Tabelle11.Range("rngWKZ")
For Each VarFeldWKZAlle In VarDatWKZAlle
wdDoc.Bookmarks("TM_VKSB" & VarFeldWKZAlle).Range.InsertAfter Range("UE_VK_SB1"). _
Value
wdDoc.Bookmarks("TM_TKSB" & VarFeldWKZAlle).Range.InsertAfter Range("UE_TK_SB1"). _
Value
If Range("UE_ALTNDECKUNG1_JN").Value = True Then
wdDoc.Bookmarks("TM_TKSB" & VarFeldWKZAlle & "Einzel").Range. _
InsertAfter Range("UE_TK_SB1_ALTERNATIV").Value
Else
wdDoc.Bookmarks("TM_TKSB" & VarFeldWKZAlle & "Einzel").Range. _
InsertAfter Range("UE_TK_SB1").Value
End If
Next VarFeldWKZAlle
Else
For Each VarFeldWKZ In VarDatWKZ
For intSel = 0 To UBound(varSelAll)
If IsError(Application.Match(CStr(VarFeldWKZ), varSelAll, 0)) Then
wdDoc.Bookmarks("TM_VKSB" & VarFeldWKZ).Range.InsertAfter Range("UE_VK_SB1"). _
Value
wdDoc.Bookmarks("TM_TKSB" & VarFeldWKZ).Range.InsertAfter Range("UE_TK_SB1"). _
Value
If Range("UE_ALTNDECKUNG1_JN").Value = True Then
wdDoc.Bookmarks("TM_TKSB" & VarFeldWKZ & "Einzel").Range.InsertAfter  _
Range("UE_TK_SB1_ALTERNATIV").Value
Else
wdDoc.Bookmarks("TM_TKSB" & VarFeldWKZ & "Einzel").Range.InsertAfter  _
Range("UE_TK_SB1").Value
End If
Exit For
Else: End If
Next intSel
Next VarFeldWKZ
End If
End Sub

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige