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

Kombinationen aus Wert einer Variablen

Kombinationen aus Wert einer Variablen
12.02.2009 08:53:00
Franz
Hallo zusammen,
ich beiße mir seit Tagen an einem Problem die Zähne aus.
In einer Zelle habe ich einen Wert, aus dem ich eine Liste der möglichen Zahlen-Kombinationen erstellen möchte.
Zellwert= "2;2;5;2" (es können 1 bis max. 4 Einzelwerte/Argumente sein)
soll ergeben:
1.1.1.1
1.1.1.2
1.1.2.1
1.1.2.2
1.1.3.1
...
2.2.5.1
2.2.5.2
oder Zellwert= "2;2"
soll ergeben:
1.1
1.2
2.1
2.2
als Steigerung würde ich gerne noch zwischen den Semikolons kommaseparierte Zahlen angeben, die die Kombinationen auf die darin enthaltenen Zahlen beschränkt.
oder Zellwert= "1;2,4;2"
soll ergeben:
1.2.1
1.2.2
1.4.1
1.4.2
Über jeden Tip, wie ich die notwendigen Schleifen programmieren kann würde ich mich sehr freuen.
Mit besten Grüßen,
Franz

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

Betreff
Datum
Anwender
Anzeige
AW: Kombinationen aus Wert einer Variablen
12.02.2009 10:14:00
D.Saster
Hallo,
primitiv aber wirksam:

Sub yyy()
Dim oDict As Object, arrValues
Dim i As Long, lngMax As Long, lngMin As Long
Dim strTmp As String, x As Integer
Set oDict = CreateObject("scripting.dictionary")
Const strTest = "2;2;5;2"
'Werte-Array
arrValues = Split(strTest, ";")
'nur Werte 1-9 im array
For i = 0 To UBound(arrValues)
arrValues(i) = Application.Max(1, Application.Min(arrValues(i), 9))
Next
'Minimum lauter 1en (1111)
For i = 0 To UBound(arrValues)
strTmp = strTmp & 1
Next
lngMin = strTmp * 1
'Maximum, z.B. 2252
strTmp = ""
For i = 0 To UBound(arrValues)
strTmp = strTmp & arrValues(i)
Next
lngMax = strTmp * 1
'füllen von Min-Max
For i = lngMin To lngMax
oDict.Add i, i
Next
'alles raus, was nicht passt
For i = lngMin To lngMax
For x = 1 To UBound(arrValues) + 1
If Mid(oDict(i), x, 1) > arrValues(x - 1) Or --Mid(oDict(i), x, 1) = 0 Then
oDict.Remove i
Exit For
End If
Next
Next
'in sheet schreiben
arrValues = oDict.items
Columns(2).ClearContents
Cells(1, 1).Resize(oDict.Count) = WorksheetFunction.Transpose(arrValues)
End Sub


Gruß
Dierk

Anzeige
AW: Kombinationen aus Wert einer Variablen
12.02.2009 12:34:00
Franz
Vielen Dank Dierk und lisa
für eure schnelle Antworten.
Lisa, deine Anregung ist sehr interessant, aber meiner Meinung nach für meine Aufgabe nicht das Richtige.
Dierk, dein Code ist schon eine gute Hilfe, allerdings können die Werte im Array auch mehrstellig sein, sodass ein späterer Vergleich mit "mid(..." schwieriger wird.
Ich hatte bisher, wie du mit Split den Gesamtwert in ein array verwandelt. Kein Problem.
Dann war meine Idee diese nochmals mit Split in weitere Arrays zu splitten (wenn nur 1 Wert vorhanden, dann max = dieser Wert) und wenn es Sinn macht, daraus ein mehrdimensionale Array zu bilden. Sollte ich hinkriegen (biherige Versuche waren noch konfuser)
Mein größtes Problem liegt in dem Zusammenbau (1.2.5.3) aus dem mehrdimensionalen Array durch ineinander verschachtelte Schleifen von "hinten nach vorne" die Codes mit den Punkten dazwischen zu generieren und der Kontrolle der kleinstmöglichen Dimensionierung.
Am Ende in einem eindimensionalen Array ablegen zur Weiterverarbeitung in einer bereits vorhandenen Prozedur stellt kein Problem mehr dar.
Vielen Dank und Gruß,
Franz
Anzeige
AW: Kombinationen aus Wert einer Variablen
12.02.2009 15:13:00
D.Saster
Hallo,
ich glaube, ich hab's.

Sub yyy()
Dim arrValues
Dim i As Long
Dim x As Integer, n As Long, z As Long, y As Long, w As Long, v As Long
Dim arrDaten(), arrTmp()
Dim strTmp As String
z = 1
y = 1
w = 1
'Werte-Array
arrValues = Split(Range("A1"), ";")
'Anzahl der Kombinationen
For i = 0 To UBound(arrValues)
z = z * arrValues(i)
Next
If z > Rows.Count Then
MsgBox "Zu viele Kombinationen", vbOKOnly + vbCritical, "Fehler"
Exit Sub
End If
ReDim arrTmp(1 To z, 1 To UBound(arrValues) + 1)
ReDim arrDaten(1 To z, 1 To 1)
For x = 0 To UBound(arrValues)
n = 0
y = y * arrValues(x)
For v = 1 To w
For z = 1 To arrValues(x)
For i = 1 To (UBound(arrDaten) / y)
n = n + 1
arrTmp(n, x + 1) = z
Next
Next z
Next v
w = w * arrValues(x)
Next x
For i = 1 To UBound(arrTmp)
strTmp = ""
For x = 1 To UBound(arrTmp, 2)
strTmp = strTmp & arrTmp(i, x) & "."
Next x
strTmp = Left(strTmp, Len(strTmp) - 1)
arrDaten(i, 1) = strTmp
Next i
Columns(3).ClearContents
Columns(3).NumberFormat = "Text"
Cells(1, 3).Resize(UBound(arrDaten)) = arrDaten
End Sub


Gruß
Dierk

Anzeige
AW: Kombinationen aus Wert einer Variablen
13.02.2009 08:32:00
Franz
Hallo Dierk,
absolut Klasse! Funktioniert super. Ich werde mich nun noch damit beschäftigen die innerhalb der ";"-separierten Felder möglichweise noch enthaltenen ","-separierten Felder in deinen Code zu integrieren. Ich sehe gute Chancen, das ich das hinkriege. Wenn ich soweit bin, melde ich mich noch mal.
Vorerst vielen herzlichen Dank.
Gruß,
Franz
AW: Kombinationen aus Wert einer Variablen
13.02.2009 15:19:00
Franz
Hallo Dierk,
Stunden später ... und ich kriege es einfach nicht hin.
Ich wollte deinen Code noch um eine weitere Flexibilität erweitern.
Zwischen die ";" sollte noch die Möglichkeit bestehen Werte mit Komma separiert einzugeben.
Dieses sollte dann nicht von 1 bis n durchgezählt werden sondern die einzelnen Elemente z.B. 2 und 5 von 2,5 in "9;2,5;9
Nun läuft mir der "n"-Zähler über, sogar wenn ich mit dem unten angegebenen Code gar keine ","-separierten "arrValues" verarbeite und ich kann nicht erkennen warum.
Die verschachtelte Schleife bleibt mein Problem -- ich denke scheinbar nicht digital genug ;-)
Gruß,
Franz

Sub yyy2()
Dim arrValues
Dim i As Long
Dim x As Integer, n As Long, z As Long, y As Long, w As Long, v As Long
Dim arrDaten(), arrTmp()
Dim strTmp As String
z = 1
y = 1
w = 1
Worksheets("Tabelle4").Cells().ClearContents
'Werte-Array
'  arrValues = Split(Worksheets("Tabelle2").Range("A1"), ";")
arrValues = Split("1;1,3;5", ";")
'Anzahl der Kombinationen
For i = 0 To UBound(arrValues)
'ersetzt    z = z * arrValues(i)    durch:
'Komma-separierte:
arrValuesKomma = Split(arrValues(i), ",")
If UBound(arrValuesKomma) = 0 Then
z = z * arrValues(i)
AnzStufen = arrValues(i)
Else
z = z * (UBound(arrValuesKomma) + 1)
AnzStufen = UBound(arrValuesKomma) + 1
End If
Next
'z = AnzKombinationen
If z > Rows.Count Then
MsgBox "Zu viele Kombinationen", vbOKOnly + vbCritical, "Fehler"
Exit Sub
End If
ReDim arrTmp(1 To z, 1 To UBound(arrValues) + 1)
ReDim arrDaten(1 To z, 1 To 1)
For x = 0 To UBound(arrValues)   '1 bis AnzFaktoren
n = 0
'Komma-separierte:
arrValuesKomma = Split(arrValues(x), ",")
If UBound(arrValuesKomma) = 0 Then
y = y * arrValues(x)
Else
y = y * (UBound(arrValuesKomma) + 1) 'nur bei diff. Faktorstufen
End If
'abgelöst wurde dafür:    y = y * arrValues(x)
'y = Anzahl Faktorstufen des gerade bearbeiteten Faktors
'arrValuesKomma() = Datenfeld mit den Faktorstufen gerade bearbeiteten Faktors
'v = Zähler für 1 bis ?
For v = 1 To w
'z = 1 bis AnzFaktorstufen!
For z = 1 To AnzStufen  ''arrValues(x)  ''
For i = 1 To (UBound(arrDaten) / y)
n = n + 1
arrTmp(n, x + 1) = z
Worksheets("Tabelle4").Cells(n, x + 1) = z
Next
Next z
Next v
If UBound(arrValuesKomma) = 0 Then
w = w * arrValues(x)
Else
w = w * (UBound(arrValuesKomma) + 1) 'nur bei diff. Faktorstufen
End If
Next x
For i = 1 To UBound(arrTmp)
strTmp = ""
For x = 1 To UBound(arrTmp, 2)
strTmp = strTmp & arrTmp(i, x) & "."
Next x
strTmp = Left(strTmp, Len(strTmp) - 1)
arrDaten(i, 1) = strTmp
Next i
Worksheets("Tabelle2").Columns(3).ClearContents
Worksheets("Tabelle2").Columns(3).NumberFormat = "Text"
Worksheets("Tabelle2").Cells(1, 3).Resize(UBound(arrDaten)) = arrDaten
End Sub


Anzeige
AW: Kombinationen aus Wert einer Variablen
13.02.2009 15:40:00
Franz
Hallo Dierk,
habe es herausgefiunden!
Ich habe meiner Variablen "AnzStufen" an der falsche Stelle einen Wert zugewiesen!
Gruß,
Franz
AW: Kombinationen aus Wert einer Variablen
13.02.2009 15:54:00
Franz
Hallo Dierk,
ich glaube nun auch, das ich es geschafft habe. Bisher sind die Tests erfolgreich!
Herzlichen Dank für deine Hilfe und ein Gruß an Dich
und all die anderen unglaublich guten Experten hier im Forum.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige