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

Makro Kombinationen

Makro Kombinationen
alifa
Hallo Forum,
irgendwie komme ich nicht zu Rande mit diesem Problem. Das Makro macht alle Kombinationen je 6 aus den 36 Zahlen im Array a. Das sind 1947792 Zeilen. Ich brauche aber nur einige wenige. Bedingung. Die 6 sechsstellige Zahlen werden untereinender geschrieben. Die 24 Zahlen, die entstehen wenn dieses Zahlenquadrat gelesen wird, vorwärts(normal), rückwärts, rauf, runter sollen verschieden sein. Wie greift man auf die einzelnen Glieder der Kombinationen zu, bevor sie in die Zellen geschrieben werden?
Option Explicit

Sub WieGehtsWeiter()
Dim i As Long, u As Double, lngR As Long
Dim n As Byte, k As Byte, j As Byte
Dim a, t!, q, z%
t = Timer
'Einträge:
a = Array(125643, 134652, 145236, 153426, 162435, 163254, 213465, 236145, _
243516, 254163, 256431, 261534, 312564, 325416, 342615, 346521, 351624, 361452, 416325, _
426153, 431256, 435162, 452361, 465213, 516243, 521346, 523614, 534261, 541632, _
564312, 614523, 615342, 624351, 632541, 643125, 652134)
k = 6
n = UBound(a) + 1
'If k > n Then MsgBox "k > n", 16: Exit Sub
With Application
u = .Fact(n) / (.Fact(k) * .Fact(n - k))
End With
'If u > Rows.Count Then MsgBox u & " > " & Rows.Count, 16: Exit Sub
ReDim vRes(k - 1)
ReDim bPos(k - 1) As Byte
For i = 1 To k
bPos(i - 1) = i
Next
Application.ScreenUpdating = False
With ActiveSheet
.Cells.Delete
For i = 1 To u
lngR = lngR + 1
For j = 0 To UBound(bPos)
vRes(j) = a(bPos(j) - 1)
Next
.Range(.Cells(lngR, 1), .Cells(lngR, k)).Value = vRes
Call GetComb(n, k, bPos)
Next
End With
Application.ScreenUpdating = True
MsgBox "fertig in " & Round(Timer - t, 2) & " Sek "
End Sub


Sub GetComb(ByVal n As Byte, ByVal k As Byte, bPos() As Byte)
Dim i As Byte, j As Byte
i = k - 1
Do While bPos(i) >= n - k + i + 1
If i = 0 Then Exit Do
i = i - 1
Loop
bPos(i) = bPos(i) + 1
For j = i To k - 1
bPos(j) = bPos(i) + j - i
Next
End Sub

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Makro Kombinationen
17.03.2010 13:59:09
fcs
Hallo alifa,
dazu muss man die einzelnen Kombinationen mit der Funktion Mid zerlegen.
Mit den nachfolgenden Ergänzungen in deinem Makro hab ich die folgenden 6 Kombinationen als Ergebnis erhalten:
125643	256431	312564	431256	564312	643125
134652	213465	346521	465213	521346	652134
145236	236145	361452	452361	523614	614523
153426	261534	342615	426153	534261	615342
162435	243516	351624	435162	516243	624351
163254	254163	325416	416325	541632	632541

Gruß
Franz
Option Explicit
Sub WieGehtsWeiter()
Dim i As Long, u As Double, lngR As Long
Dim n As Byte, k As Byte, j As Integer
Dim arrZahlen() As Long, sZahl As String, lZahl As Long
Dim arrQuadrat() As Integer, Quersumme As Long
Dim spQuad As Long, zeiQuad As Long, vres
Dim a, t!, q, z%
t = Timer
'Einträge:
a = Array(125643, 134652, 145236, 153426, 162435, 163254, 213465, 236145, _
243516, 254163, 256431, 261534, 312564, 325416, 342615, 346521, 351624, 361452, 416325, _
426153, 431256, 435162, 452361, 465213, 516243, 521346, 523614, 534261, 541632, _
564312, 614523, 615342, 624351, 632541, 643125, 652134)
k = 6
n = UBound(a) + 1
'If k > n Then MsgBox "k > n", 16: Exit Sub
With Application
u = .Fact(n) / (.Fact(k) * .Fact(n - k))
End With
'If u > Rows.Count Then MsgBox u & " > " & Rows.Count, 16: Exit Sub
ReDim arrZahlen(4 * k)
ReDim arrQuadrat(1 To k, 1 To k)
ReDim vres(k - 1)
ReDim bPos(k - 1) As Byte
For i = 1 To k
bPos(i - 1) = i
Quersumme = Quersumme + i
Next
Application.ScreenUpdating = False
With ActiveSheet
.Cells.Delete
For i = 1 To u
For j = 0 To UBound(bPos)
vres(j) = a(bPos(j) - 1)
Next
'Zahlen links nach rechts
zeiQuad = 0
For j = 1 To k
zeiQuad = zeiQuad + 1
arrZahlen(zeiQuad) = vres(j - 1)
'Ziffern in der Zeile im Quadrat
For spQuad = 1 To k
arrQuadrat(zeiQuad, spQuad) = CInt(Mid(CStr(vres(j - 1)), spQuad, 1))
Next
Next
'Zahlen rechts nach links
For j = 1 To k
sZahl = ""
For spQuad = k To 1 Step -1
sZahl = sZahl & CStr(arrQuadrat(j, spQuad))
Next
zeiQuad = zeiQuad + 1
arrZahlen(zeiQuad) = CLng(sZahl)
Next
'Zahlen von oben nach unten
For spQuad = 1 To k
sZahl = ""
lZahl = 0
For j = 1 To k
sZahl = sZahl & CStr(arrQuadrat(j, spQuad))
lZahl = lZahl + arrQuadrat(j, spQuad) 'Quersumme summieren
Next
'Quersumme prüfen
If lZahl  Quersumme Then
GoTo Weiter01
End If
zeiQuad = zeiQuad + 1
arrZahlen(zeiQuad) = CLng(sZahl)
Next
'Zahlen von unten nach oben
For spQuad = 1 To k
sZahl = ""
For j = k To 1 Step -1
sZahl = sZahl & CStr(arrQuadrat(j, spQuad))
Next
zeiQuad = zeiQuad + 1
arrZahlen(zeiQuad) = CLng(sZahl)
Next
'auf gleiche Zahlen prüfen
For zeiQuad = 1 To 24
For j = zeiQuad + 1 To 24
If arrZahlen(zeiQuad) = arrZahlen(j) Then
GoTo Weiter01:
End If
Next
Next
'auf doppelte Ziffern in Zeilen prüfen
For zeiQuad = 1 To k
For spQuad = 1 To k
For j = spQuad + 1 To k
If arrQuadrat(zeiQuad, spQuad) = arrQuadrat(zeiQuad, j) Then
GoTo Weiter01
End If
Next
Next
Next
'auf doppelte Ziffern in Spalten prüfen
For spQuad = 1 To k
For zeiQuad = 1 To k
For j = zeiQuad + 1 To k
If arrQuadrat(zeiQuad, spQuad) = arrQuadrat(j, spQuad) Then
GoTo Weiter01
End If
Next
Next
Next
lngR = lngR + 1
.Range(.Cells(lngR, 1), .Cells(lngR, k)).Value = vres
'Quadrat mit Ziffern erstellen
For zeiQuad = 1 To k
For spQuad = 1 To k
.Cells(lngR, k + 1 + spQuad) = arrQuadrat(zeiQuad, spQuad)
Next
lngR = lngR + 1
Next
Weiter01:
Call GetComb(n, k, bPos)
Next
End With
Application.ScreenUpdating = True
MsgBox "fertig in " & Round(Timer - t, 2) & " Sek "
End Sub
Sub GetComb(ByVal n As Byte, ByVal k As Byte, bPos() As Byte)
Dim i As Byte, j As Byte
i = k - 1
Do While bPos(i) >= n - k + i + 1
If i = 0 Then Exit Do
i = i - 1
Loop
bPos(i) = bPos(i) + 1
For j = i To k - 1
bPos(j) = bPos(i) + j - i
Next
End Sub

Anzeige
AW: Makro Kombinationen
17.03.2010 15:13:50
alifa
Hallo Franz,
ich habe mich sehr gefreut über Deinen Beitrag. Schon seit einigen Tagen habe ich mir gewünscht, dass Du das Problem anpackst, mit Deiner oft erwiesenen Kompetenz. Ich bemerke jetzt, dass noch eine Ergänzung meinerseits notwendig war. Alle Zahlen sollen verschieden sein. Sie sollen sich jedoch alle in dem Array von 36 Zahlen wiederfinden. Alle 24 Zahlen, die man in dem 6x6 Datenfeld vorwärts, rückwärts, rauf, runter lesen kann sollen in dem Array() zu finden sein.
Viele Grüße aus dem Oberbergischen nach dem Salzkammergut.
Erhard
AW: Makro Kombinationen
18.03.2010 01:17:16
alifa
Ich wollte noch ergänzen: Alle 36 sechsstellige Zahlen im Array a, sind vorwärts und rückwärts gelesen, teilbar durch 7! Könnte leichter werden....
Gruß, Alifa
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige