Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1648to1652
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 For-Schleife mit Rekursion

Verschachtelte For-Schleife mit Rekursion
17.10.2018 12:55:30
Martin
Hallo!
Ich bin neu hier und möchte mich in den ersten Zeilen kurz vorstellen:
Martin, 42, programmiere leidschaftlich gerne, hab mir den Großteil selbst beigebracht und beschäftige mich zur Zeit eben mit VBA Excel.
Wollte nun folgendes realisieren und scheitere daran:
ich habe ein Tabellenblatt mit Daten in den Spalten. Die Anzahl der Daten (Zeilen/Spalte) und die Anzahl der Spalten variiert.
Etwa so:
Spalte 1 - Spalte 2 - Spalte 3
A X 1
B Y 2
C Z
D
Jetzt möchte ich alle möglichen Kombinationen ausgeben.
Grundsätzlich würde ich das mit einer verschachtelten For-Schleife machen, aber nachdem sich die Spaltenanzahl veränderbar sein soll, wollte ich es dynamisch programmieren. Da bin ich auf die Rekursion gekommen.
folgende Zeilen habe ich mal Programmiert:

Sub Rekur(laufvar As Integer)
If laufvar > 0 Then
For i = 1 To Indizes(laufvar - 1)
Rekur (laufvar - 1)
StartArray(laufvar - 1) = i
Next i
End If
End Sub

Sub HP()
Rekur (3)
End Sub

Das StartArray wird initialisiert mit 1,1,1.
im Array Indizes steht die Anzahl der Daten je Spalte.
Alles was ich erreichen wollte um mein Verständis aufzubauen ist, dass ich mal alle Kombinationen der Durchlaufvariable sehe. Leider kriege ich es nicht hin. Die Anzahl der Durchläufe sollte ja (Anzahl Daten Spalte 1)*(Anzahl Daten Spalte 2)*(Anzahl Daten Spalte 3) sein. Ich kriege aber immer noch doppelte Einträge, also ein paar mal die gleiche Kombination raus.
Könnt ihr mir BITTE helfen?
HERZLICHEN DANK!!!
lg
Martin

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Was für Kombinationen?
17.10.2018 14:19:21
EtoPHG
Hallo Martin,
Kannst du mal eine Beispielmappe mit Ausgangsdaten und Zieldaten (manuell erstell) hochladen?
Ich kann mir keinen Reim daraus machen, was du dir bei dieser Datenaufstellung als Kombination vorstellst!
Rekursiv kann in VBA eine Function aufgerufen werden. Eine Sub (Procedure) rekursiv aufrufen ist mehr als unüblich!
Gruess Hansueli
AW: Verschachtelte For-Schleife mit Rekursion
17.10.2018 14:40:08
Martin
Grüß dich!
Danke für dein Interesse!
Also, was ich als ZIEL habe:
Alle mögölichen Kombinationen aus den Elementen der Spalten.
Z.B.:
A, X, 1
A, X, 2
A, Y, 1
A, Y, 2
A, Z, 1
...
da bin ich aber noch zu weit weg.
Jetzt möchte ich mal nur schaffen, dass im Array StartArray folgendens passiert:
StartArray =1,1,1
StartArray =1,1,2
StartArray =1,2,1
StartArray =1,2,1
...
Praktisch ein "hochzählen" der Laufvariablen , die ja in der For-Schleife laufen.
Hab dir ein File angehängt.
Anzeige
...unklar
18.10.2018 09:02:58
EtoPHG
Hallo,
In was für Programmiersprachen hast du denn Erfahrung.
Deine Ausführungen sind mir immer noch ein Rätsel.
Programmieren hat doch auch etwas mit Mathematik zu tun.
Offensichtlich versuchst du dich an einer Permutation.
Was soll dann das zweimalige StartArray =1,2,1 in deiner Antwort?
Wenn Arrays 3-Dimensionen haben, das bedeutet das doch nix anderes, als das 3 (so wie du es nennst) Schleifen nötig sind.
For x1 = 0 to x1Lim
For x2 = 0 to x2Lim
For x3 = 0 to x3Lim
DeinArray(x1,x2,x3) = Was auch immer da rein soll?
next x3
next x2
next x1
Für die Dimensionierung von Arrays, schau mal in die VBA-Hilfe. Zur Redimensionierung gibt es auch die VBA Anweisung ReDim ... und ReDim Preserve ...
Gruess Hansueli
Anzeige
AW: ...unklar
18.10.2018 11:17:08
Martin
Hallo Hansueli!
Das "doppelte" StartArray war ein Fehler von mir im Text! SORRY!
Ja, es soll eine Permutation sein.
Mein Problem ist nicht der Durchlauf pro FOR-Schleife, sondern die ANZAHL der FOR-Schleifen.
Mit den Arrays kenn ich mich eh ein bisser laus (Redim und so).
Was ich einfach nicht kapiere ist, die ich es programmiere in der Rekursion, dass ich unterschiedliche Anzahl der FOR-Schleifen realisiere.
(Hast du das File bekommen...ich kenn mich im Forum leider noch nicht so gut aus. Der Upload hat anscheinend funktioniert)
DANKE(!!!), dass du deine Zeit investierst!!!
Anzeige
AW: ...immer noch unklar....
18.10.2018 14:19:55
EtoPHG
Hallo Martin,
Ich weiss immer noch nicht, was der Sinn einer Permutation deiner Objekte (insgesamt 9) für einen Sinn ergeben soll. Für 9 Objekte ergeben sich 362'880 Permutationen! Erkläre den Sinn!
Formel
=FAKULTÄT(ANZAHL2(Auswahl!A2:C5))
..oder, falls untenstehende rekursive Funktion myFactorial(n) in einem Modul steht:
=myfactorial(ANZAHL2(Auswahl!A2:C5))
Dann wiederum schreibst du in der Zieltabelle Kombinationen:
Das würde auf 420 geordnete Kombinationen hinauslaufen, wie du mit der Prozedur Kombis (ohne Output) testen kannst.
Code in ein Modul:
' Anzahl Kombinationen der Zellen mit Inhalt eines Bereichs
' Errechnet die Anzahl Kombinationen für einen ev. Output
Sub Kombis()
Dim rInp As Range
Dim lCol As Long
Dim nrCombis As Long
Set rInp = Application.InputBox("Wählen Sie den Input-Bereich:", _
"Kombinationen errechnen", , , , , , 8)
If rInp Is Nothing Then Exit Sub
nrCombis = myfactorial(WorksheetFunction.CountA(rInp))
For lCol = 1 To rInp.Columns.Count
nrCombis = nrCombis / myfactorial(WorksheetFunction.CountA(rInp.Columns(lCol)))
Next lCol
nrCombis = nrCombis / rInp.Columns.Count        ' Kombination mit jeweils Anzahl Spalten  _
Elementen
MsgBox nrCombis & " Kombinationen möglich!"
End Sub
' Berechnet rekursiv die Fakultät einer Zahl zwischen 2 und 12
Function myfactorial(lNumber As Long) As Long
If lNumber  12 Then
myfactorial = 1
Exit Function
End If
myfactorial = myfactorial(lNumber - 1) * lNumber
End Function
Ich hab mir mal den Output erspart, denn bevor nicht der Sinn deines Ansatzes klar wird mach mir diese Mühe nicht.
Gruess Hansueli
Anzeige
AW: Verschachtelte For-Schleife mit Rekursion
18.10.2018 17:00:03
Dieter
Hallo Martin,
wenn es dir darum geht, die Dynamik von Schleifen kennenzulernen, dann könntest du das Problem z.B. folgendermaßen lösen
Sub Generierung()
Dim letzteSpalteQ As Long
Dim letzteZeileQ As Long
Dim letzteZeileZ As Long
Dim spalteQ As Long
Dim wb As Workbook
Dim wsQ As Worksheet ' Quelle
Dim wsZ As Worksheet ' Ziel
Dim z As Long
Dim zeileQ As Long
Dim zeileZ As Long
Set wb = ThisWorkbook
Set wsQ = wb.Worksheets("Quelle")
Set wsZ = wb.Worksheets("Ziel")
wsZ.UsedRange.ClearContents
letzteSpalteQ = wsQ.Cells(1, wsQ.Columns.Count).End(xlToLeft).Column
letzteZeileQ = wsQ.Cells(wsQ.Rows.Count, "A").End(xlUp).Row
wsQ.Range("A1").Resize(letzteZeileQ).Copy Destination:=wsZ.Range("A1")
For spalteQ = 2 To letzteSpalteQ
letzteZeileZ = wsZ.Cells(wsZ.Rows.Count, "A").End(xlUp).Row
letzteZeileQ = wsQ.Cells(wsQ.Rows.Count, spalteQ).End(xlUp).Row
For zeileZ = letzteZeileZ To 1 Step -1
' Leerzeilen einfügen
wsZ.Rows(zeileZ).Offset(1).Resize(letzteZeileQ - 1).Insert
' Bisherige Werte in die Leerzeilen übernehmen
wsZ.Rows(zeileZ).Copy Destination:=wsZ.Rows(zeileZ).Offset(1).Resize(letzteZeileQ - 1)
Next zeileZ
letzteZeileZ = wsZ.Cells(wsZ.Rows.Count, "A").End(xlUp).Row
For zeileZ = 1 To letzteZeileZ Step letzteZeileQ
For z = 0 To letzteZeileQ - 1
wsZ.Cells(zeileZ + z, spalteQ) = wsQ.Cells(z + 1, spalteQ)
Next z
Next zeileZ
Next spalteQ
wsZ.Activate
End Sub
https://www.herber.de/bbs/user/124740.xlsm
Viele Grüße
Dieter
Anzeige
AW: Verschachtelte For-Schleife mit Rekursion
19.10.2018 10:50:38
Martin
Hallo Dieter!
Danke für deinen Algo :)
Ich versuche nochmals mein Problem runterzubrechen und zu erklären (ich hab da einige Fehler gemacht).
Mein "erstes" Ziel ist einfach.
Ich möchte eine Verschachtelete For-Schleife mit einer Rekursion lösen.
zb.
For i = 1 to 5
For j = 1 to 5
For k = 1 to 5
MsgBox( i & "," & j & "," & k)
Next k
Next j
Next i
Also "zählt" man praktisch rauf (das meine ich mit Kombination/Permutation...da lag mein Begriffsfehler, denk ich mal, der zur Verwirrung führte)
Ich habe nun im ersten Schritt versucht nur diesen Algo REKURSIV zu lösen...schaffte ich aber nicht :(
und auch bis jetzt noch nicht...
Anzeige

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige