Kombinationsgenerator mit Excel

Moin Moin,

man stelle sich vor es gibt A, B und C! Hierfür gibt es acht
verschieden Kombinationsmöglichkeiten:

  • keine
  • A
  • B
  • C
  • AB
  • AC
  • BC
  • ABC

Man könnte es auch so aussehen lassen:

  • 000
  • 100
  • 010
  • 001
  • 110
  • 101
  • 011
  • 111

Kennt jemand dafür eine lustige Formel, die mir nach Vorgabe
von A, B, und C sowas ausspuckt, und als Schmankerl die
Liste ergänzt, sobald man ein D usw. dazuschmeißt?

Danke und seid gegrüßt
F.

man stelle sich vor es gibt A, B und C! Hierfür gibt es acht
verschieden Kombinationsmöglichkeiten:

  • keine:- A:- B:- C:- AB:- AC:- BC:- ABC
    Man könnte es auch so aussehen lassen:
  • 000:- 100:- 010:- 001:- 110:- 101:- 011:- 111:
    Kennt jemand dafür eine lustige Formel, die mir nach Vorgabe
    von A, B, und C sowas ausspuckt, und als Schmankerl die
    Liste ergänzt, sobald man ein D usw. dazuschmeißt?

Hi Frank,
klar könnt ich dir ein Makro dazuschmeiß() stricken aber warum das Rad neu erfinden.
Schreib in A1:A8 die Zahlen 0 bis 7.
Dann in B1 die Formel
=dec2bin(a1;3)
Die kopierst du dann in den Bereich B2:B8
Gruß
Reinhard

Hallo Reinhard,
ja, an den Binärcode habe ich auch schon gedacht, aber schon
beim C würde das nicht mehr funktionieren. Wenn ich meine
Tabelle richtig lese, und auch nur auf die letzten drei
betrachte, dann C = 011, dies enspricht aber in meinem
Kombinationsgenerator BA. C soll 100 sein, oder besser nach
meinem Beispiel 001. Es soll ja keine Codeliste entstehen,
sondern nur eine Übersicht über die möglichen Kombinationen.
AB = 011 = BA obwohl BA ungleich AB!
Wenn man also ABC hat gibt es nur 2^3 mögliche Kombinationen,
die ja noch recht einfach sind. Etwas länger muß man dann
schon bei 2^4 (ABCD) nachdenken, soweit bis man dann Übersicht
verloren hat. ABCDEFGHIJ sind zwar auch nur 1024 (2^10),
aber die muß man erstmal schreiben.

Gruß Frank

PS.: Während ich dies schrieb kam die andere Antwort, die
muß ich jetzt erstmal lesen.

Makro-Lösung
Hallo Frank,

die Lösung von Reinhard ist super, wenn Du auf die Buchstaben verzichten kannst. Allerdings muß unter Extras/Add-Ins… noch das „Analysis ToolPak“ eingebunden werden, sonst funktioniert´s nicht. Da sind noch viele andere Funktionen drin, die dann auch in der Formelauswahl (Gleichheitszeichen oben links über den Tabellen) zu sehen sind.

Hier nun noch ein Makro, das die Funktionalität auf die Buchstaben ausdehnt. Der ganze Block unten muß nur in ein frisches VBA-Modul innerhalb des Dokuments eingefügt werden ([Alt]+[F11], dann im Projekt-Explorer mit der rechten Maustaste ein Modul hinzufügen).

Um eine Beispieltabelle zu erhalten, das erste Makro ausführen (entweder mit dem Cursor in den Code gehen und [F5] drücken oder von Excel aus über Extras/Makro/Makros…

Vielleicht ist der Aufwand für das Problem etwas zu hoch, aber ich weiß ja nicht, wie wichtig die Aufgabe ist. Außerdem sehe ich immer auch die Möglichkeit, die Lösung als Tip für andere Geschichten zu verwenden. In diesem Sinne hier der Code:

Option Explicit
 
 
Sub Beispieltabelle\_bauen()
'Kristian Zarse für Wer-Weiss-Was.de, 03.12.02
'Artikel: http://www.wer-weiss-was.de/cgi-bin/forum/showarticle.fpl?ArtikelID=1368526
'zugehörige Funktionen: KombiVari(), Bitbreite(), Auffuellen()
 ActiveWindow.DisplayGridlines = False
 
 Range("B2").FormulaR1C1 = "strBuchstabenfolge"
 Range("B3").FormulaR1C1 = "booMSB"
 Range("B4").FormulaR1C1 = "strNullzeichen"
 Range("B5").FormulaR1C1 = "booBinaer"
 Range("B7").FormulaR1C1 = "intZahl"
 Range("C2").FormulaR1C1 = "ABC"
 Range("C3").FormulaR1C1 = "TRUE"
 Range("C4").FormulaR1C1 = "."
 Range("C5").FormulaR1C1 = "FALSE"
 Range("D2").FormulaR1C1 = "=RC[-1]"
 Range("D3").FormulaR1C1 = "FALSE"
 Range("D4").FormulaR1C1 = "."
 Range("D5").FormulaR1C1 = "FALSE"
 Range("E2").FormulaR1C1 = "=RC[-2]"
 Range("E3").FormulaR1C1 = "FALSE"
 Range("E4").FormulaR1C1 = ""
 Range("E5").FormulaR1C1 = "TRUE"
 Range("B8").FormulaR1C1 = "0"
 Range("C8").FormulaR1C1 = "=kombivari(R2C,RC2,R3C,R4C,R5C)"
 Range("D8").FormulaR1C1 = "=kombivari(R2C,RC2,R3C,R4C,R5C)"
 Range("E8").FormulaR1C1 = "=kombivari(R2C,RC2,R3C,R4C,R5C)"
 
 Range("G2").FormulaR1C1 = "Notwendig. Eine beliebige Zeichenkette."
 Range("G3").FormulaR1C1 = "Optional. Leer bedeutet ""FALSE""."
 Range("G4").FormulaR1C1 = "Optional. Leer ist leer."
 Range("G5").FormulaR1C1 = "Optional. Leer bedeutet ""FALSE""."
 Range("G7").FormulaR1C1 = "Notwendig. Eine ganze Zahl zwischen -32768 und 32767."
 Range("G8").FormulaR1C1 = "Es können also Zeichenketten bis 16 Zeichen Länge verarbeitet werden."
 
 Columns("B:B").EntireColumn.AutoFit
 
 Range("C8:E9").FillDown
 Range("B9").FormulaR1C1 = "=R[-1]C+1"
 Range("B9:E40").FillDown
 
 With Range("B8:E40")
 .Font.Name = "Courier New"
 .Font.Size = 10
 End With
 
 With Range("B2:E5,B7,B8:E40")
 .Borders(xlEdgeLeft).LineStyle = xlContinuous
 .Borders(xlEdgeLeft).Weight = xlThin
 .Borders(xlEdgeRight).LineStyle = xlContinuous
 .Borders(xlEdgeRight).Weight = xlThin
 .Borders(xlEdgeTop).LineStyle = xlContinuous
 .Borders(xlEdgeTop).Weight = xlThin
 .Borders(xlEdgeBottom).LineStyle = xlContinuous
 .Borders(xlEdgeBottom).Weight = xlThin
 .Borders(xlInsideVertical).LineStyle = xlContinuous
 .Borders(xlInsideVertical).Weight = xlThin
 .Borders(xlInsideHorizontal).LineStyle = xlContinuous
 .Borders(xlInsideHorizontal).Weight = xlThin
 End With
 
 Range("C2:E5").HorizontalAlignment = xlCenter
 
 Range("B2,B7").Interior.ColorIndex = 36
 Range("B3:B5").Interior.ColorIndex = 34
End Sub 'Beispieltabelle\_bauen
 
 
Function KombiVari(ByVal strBuchstabenfolge As String, \_
 intZahl As Integer, \_
 Optional booMSB As Boolean, \_
 Optional strNullzeichen As String, \_
 Optional booBinaer As Boolean) \_
 As String
'Kristian Zarse für Wer-Weiss-Was.de, 03.12.02
'Artikel: http://www.wer-weiss-was.de/cgi-bin/forum/showarticle.fpl?ArtikelID=1368526
'zugehörige Funktionen: KombiVari(), Bitbreite(), Auffuellen()
Dim n As Integer
Dim l As Integer
Dim i As Integer
Dim k As String
 
 l = Len(strBuchstabenfolge)
 n = Bitbreite(intZahl, l)
 
 'Wenn die gelieferte Zeichenkette kürzer ist als die Bitbreite der gelieferten
 'Zahl, wird die Zeichenkette vorn bzw. hinten mit der Tilde aufgefüllt.
 If l intZahl
 If intMinimum \> i Then Bitbreite = intMinimum Else Bitbreite = i
End Function 'Bitbreite
 
 
Function Auffuellen(strZeichenkette As String, \_
 intLaenge As Integer, \_
 strFuellzeichen As String, \_
 Optional booVoranstellen As Boolean) \_
 As String
'Kristian Zarse für Wer-Weiss-Was.de, 03.12.02
'Artikel: http://www.wer-weiss-was.de/cgi-bin/forum/showarticle.fpl?ArtikelID=1368526
'zugehörige Funktionen: KombiVari(), Bitbreite(), Auffuellen()
Dim add As String
Dim i As Integer
 add = ""
 For i = Len(strZeichenkette) + 1 To intLaenge
 add = add & strFuellzeichen
 Next i
 If booVoranstellen Then
 Auffuellen = add & strZeichenkette
 Else
 Auffuellen = strZeichenkette & add
 End If 'booVoranstellen
End Function 'Auffuellen

Kristian

Hallo Kristian,

prima, sieht so aus als ob das Ding genau das macht was ich
möchte. Excel rechnet gerade, da ich bis zum Maximum
aufgepumpt habe.

So das waren ein paar Minuten, jetzt kann ich mit Gewißheit
sagen, das macht genau das was ich suche. Die Tilde hat mich
zwar erst ein wenig verwirrt, aber darüber kann ich mal
hinwegsehen, da der Teil nicht zu den zu berücksichtigenden
Kombinationen gehört.

Vielen Dank
Gruß
Frank

Danke an Euch, das hat geholfen!

-)

Tilde kommt nur bei l

…, jetzt kann ich mit Gewißheit sagen, das macht genau das was ich suche.

Das freut mich!

Die Tilde hat mich zwar erst ein wenig verwirrt, aber darüber
kann ich mal hinwegsehen, da der Teil nicht zu den zu
berücksichtigenden Kombinationen gehört.

Die Tilde kommt nur dann, wenn die Bitbreite der übergebenen Zahl größer als die Länge des Strings ist. Wenn Du z.B. den String „ABC“ hast, lohnt es sich nicht, eine Zahl größer 7 zu übergeben, weil die 7 binär 111 ist. Die 8 wäre ja 1000, und damit käme bei booMSB=FALSE eine Tilde, gefolgt von drei Nullzeichen:

 ABC (_booMSB=FALSE_)
1000
~... Die Tilde zeigt an, daß da noch eine "1" in der Binärzahl
 übrig war, aber kein Buchstabe mehr im String.
 
ABC (_booMSB=TRUE_)
1000
A... Im Falle einer Null an der überschüssigen Stelle
 erscheint keine Tilde, sondern ein Nullzeichen.

Welche Bitbreite Du für den String benötigst, siehst Du ja an dessen Länge. Die daraus resultierende größte sinnvolle Zahl bekommst Du dann z.B. mit =2^LEN(G20)-1, wobei das LEN() die englische Variante ist. Die Deutsche heißt dann vielleicht LAENGE() oderso.
Wenn Du diese Zahl nicht überschreitest, kriegst Du auch keine Tilde. Und wenn Du die Funktion KombiVari() dann noch nur mit den ersten beiden Parametern aufrufst (also ohne Nullzeichen), bekommst Du nur die Variationen der Buchstaben.
Einzig die Reihenfolge der Buchstaben wird hier als fix angesehen, Die Varianten „BA“ oder „CBA“ oderso bekommt man so natürlich nicht.
Solltest Du auch für große Zahlen die Tilde unterdrücken wollen, kannst Du sie auch im VBA-CODE durch ein Leerzeichen ersetzen und die Zeile KombiVari = k in KombiVari = Trim(k) ändern.

Kristian