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

Farbcodegenerator

Farbcodegenerator
18.08.2016 16:37:53
Vale4689
Hallo,
ich bin neu hier im Forum und habe leider wenig bis keine Ahnung in VBA. Trotzdem würde ich gerne einen Farbcodegenerator erstellen weil mir dadurch in Zukunft ein Haufen Arbeit erspart bleibt. Folgendes sollte der Farbcodegenerator leisten:
1. Generieren eines 1-6 stelligen, zufälligen Farbcode aus 6 wählbaren Farben
1.1. Start der Generieung am Besten durch einen Button
2. Abgleich des erzeugten Farbcodes mit bestehenden Farbcodes, die in einer Farbcodeliste angelegt sind
2.1. Die Farbcodeliste befindet sich in einem anderen Tabellenblatt wie der Generator
2.2. Doppelbelegung muss vermieden werden
2.3. Farbcodes, die dieselben Farben enthälten aber in unterschiedlicher Reihenfolge müssen ebenfalls vermieden werden
2.4 Falls ein erzeugter Farbcode vergeben sein sollte, sollte solange generiert werden bis ein "neuer", nicht vergebener Farbcode entstanden ist
Das sind die grundlegenden Anforderungen
Zu Teil 1:
Das Generieren eines 5-stelligen Farbcodes auf Knopfdruck bekomm ich bereits hin. Dabei wird der Farbcode im Tabellenblatt erstellt und lediglich die Kalkulation in VBA über einen Button gestartet. Das Problem ist, dass ich momentan einen Button für einen 1-stelligen, einen Button für einen 2-stelligen, einen Button für einen 3-stelligen Farbcode usw. bräuchte. Das ist aber ein zweitrangiges Problem.
Zu Teil 2
Der Abgleich mit bestehenden Farbcodes stellt mich jedoch vor große Probleme. Ich dachte mir man könnte einen Stringfarbcode erstellen z.B: blau,weiß,rot entspricht bwr. Das bekomm ich auch noch hin und wird direkt im Tabellenblatt erstellt und in Zelle H24 ausgegeben. Diesen Code wollte ich mit den bereits bestehen Stringfarbcodes (hinterlegt in Spalte B2 in einem anderen Tabellenblatt) Zelle für Zelle vergleichen. Das würde vermutlich über eine Art Schleife funktionieren, in der man eine Zählvariable einführt und dieser Variablen immer eine neue Zelle zuordnet. Nach langer Google-Rechereche kam ich für den Stringvergleich auf die Funktion StingComp. So wie ich das verstanden wäre das aber keine Lösung für Punkt 2.3, da z.B. ein Farbcode blau, weiß, rot als nicht identisch mit weiß, rot, blau angesehen würde.
Da ich wie bereits erwähnt keine Ahnung von der VBA-Programmierung habe weiß ich nicht ob meine Lösungsansätze sinnvoll sind. Welche Funktion für den Vergleich könnte man benutzen? Braucht man überhaupt eine Schleife oder gibt es vielleicht eine Funktion die automatisch die ganze Spalte mit dem Stringfarbcode vergleicht? Ist es überhaupt notwenig den Vergleich über Strings zu machen?
Vielen Dank im voraus für eure Hilfe

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Farbcodegenerator
18.08.2016 19:33:50
ChrisL
Hi Vale
Vielleicht blamiere ich mich jetzt gleich, aber ich habe krampfhaft versucht die Anzahl möglicher Varianten zu berechnen. Zuletzt habe ich es von Hand durchgezählt und ergibt irgendwie keine Logik (dachte an sowas wie 3^6 ;)
Trotzdem:
6 stellig = 1 Variante
5 stellig = 4 Varianten
4 stellig = 14 Varianten
3 stellig = 20 Varianten
2 stellig = 15 Varianten
1 stellig = 6 Varianten
Total 60 Möglichkeiten
Die Kombinationsmöglichkeiten schreibst du mal alle in eine Tabelle und verwendest eine Hilfsspalte
=Zufallszahl()
Dann sortierst du einmalig nach dieser Hilfsspalte und du hast den Zufall erledigt (Prinzip "Mischen").
Danach wie eine Streichliste verwenden. Kann man mit Makro unterstützen (nächster freier Eintrag in der Streichliste suchen, Ergebnis anzeigen und als "benutzt" kennzeichnen).
Wenn ich mich in der Anzahl Kombinationen verrechnet habe, sieht die Ausgangslage anders aus. Dann müsste man einen Do-Loop (endlos bis zum Treffer) verwenden. Entspricht in etwa deinem Vorgehen, Prinzip "Generator".
In deinem Fall wäre es allerdings kontraproduktiv, weil die Chance gross ist, dass du mal alle Kombinationen aufgebraucht hast und dann generiert es ohne besondere Massnahmen endlos.
Die Wahl zwischen den beiden Prinzipien hängt vom Verhältnis zwischen Anzahl Kombinationen und Anzahl verbrauchter Codes ab. Wenn du von 10'000 Codes bereits 9'999 benutzt hast, dauert es lange bis du den einen verbleibenden Code per Zufall generiert hast.
Zum Vorgehen String vs. Alternativen. Für eine kleine Anzahl finde ich String OK. Bei grossen Berechnungen könnte allenfalls die Umwandlung in ein Zahlensystem (jede Zahl 1-6 steht für eine Farbe) hilfreich sein, aber dann müsste man vermutlich das Vorgehen generell wieder hinterfragen.
cu
Chris
Anzeige
AW: Farbcodegenerator
18.08.2016 19:49:49
ChrisL
OK, sind 63 Kombinationen :)
Formel für 3-stellig:
=(6*5*4)/(3*2*1)
AW: Farbcodegenerator
19.08.2016 08:16:56
Vale4689
Hallo Chris,
danke für deine schnelle Antwort. Ich glaub ich muss die Farbcodes noch etwas genauer erläutern:
Als Beispiel nehm ich mal einen 6-steligen Code der nur aus 2 Farben besteht z.b. rot und blau. Dann gäbe es folgende Varianten:
6x rot; 0x blau
5x rot; 1x blau
4x rot; 2x blau
3x rot; 3x blau
2x rot; 4x blau
1x rot; 5x blau
0x rot; 6x blau
Macht insgesamt 7 Varianten.
Das ganze kann ich jetzt mit folgenden Kombinationen machen:
rot und blau (wie oben dargestellt)
rot und gelb
rot und grün
rot und weiß
rot und orange
Das macht 5x7 also 35 Varianten für einen 6 stelligen code, der aus der Farbe rot und einer weiteren farbe besteht. Man kann das jetzt auch mit den anderen Farben machen dann bekommt man folgende Anzahl:
5x7 Varianten
4x7 varianten
3x7 Varianten
2x7 Varianten
1x7 Varianten
Insgesamt 168 Varianten für einen 6-stelligen code der aus 2 Farben besteht.
Man kann aber auch 3,4,5 oder 6 Farben in einem 6-stelligen Code haben
Zudem kommen 1-5-stellige Codes.
Allgemein gilt, dass die Veränderung der Reihenfolge der Farben im Code keinen NEUEN Coed darstellt, z.B. wenn folgender 6-stelliger bereits vergeben ist:
rot, rot, blau, blau, grün, grün
dann darf ein code der folgendermaßen aussieht NICHT vergeben werden:
rot, blau, rot, grün, blau, grün
weil er genau dieselben Farben in derselben Anzahl enthält.
Es sind aber trotzdem eine ganze Menge möglicher Varianten, deswegen denke ich, dass das Generatorprinzip durchaus angebracht ist. Wie man das in VBA umsetzt habe ich keine Ahnung wobei mein größtes Problem ist, dass ich nicht weiß wie man den Vergleich anstellen soll.
Gruß
Vale
Anzeige
Das sind Kombinationen mit Wiederholung! orT
19.08.2016 11:20:29
Luc:-?
Die mathematische Fml kann man nachschlagen!
Gruß, Luc :-?
Besser informiert mit …
AW: Farbcodegenerator
19.08.2016 15:53:53
ChrisL
Hi Vale
Beispielcode:
https://www.herber.de/bbs/user/107725.xlsm
Ich habe mich nun für die Variante "Zahlen-Code" mit Übersetzungstabelle entschieden. Die Zufallszahlen werden in ein Array/Datenfeld geschrieben und sortiert. Die Sortierung hilft, doppelte zu erkennen. Die Sortierfunktion (SelectionSort) ist aus dem Netz:
https://support.microsoft.com/de-ch/kb/133135
Unberücksichtigt ist ein Notausgang, wenn alle Codes verbraucht sind.
Private Sub CommandButton1_Click()
Dim WS1 As Worksheet, WS2 As Worksheet
Dim iStellen As Integer, AnzahlStellen As Integer
Dim lCode As Long, iZufall As Integer
Const AnzahlFarben As Byte = 6
Set WS1 = Worksheets("gebraucht")
Set WS2 = Worksheets("Farben")
AnzahlStellen = WS1.Range("D1")
ReDim arSort(AnzahlStellen)
Do Until lCode  0 And CheckDoppelt(WS1, lCode) = False
For iStellen = 1 To AnzahlStellen
arSort(iStellen) = Int((AnzahlFarben * Rnd) + 1)
Next iStellen
SelectionSort arSort
For iStellen = 1 To AnzahlStellen
lCode = lCode & arSort(iStellen)
Next iStellen
Loop
WS1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = lCode
MsgBox CodeToString(WS2, lCode, AnzahlStellen)
End Sub

Private Function CheckDoppelt(WS As Worksheet, lCode As Long) As Boolean
If WorksheetFunction.CountIf(WS.Columns(1), lCode) Then CheckDoppelt = True
End Function

Private Function CodeToString(WS As Worksheet, lCode As Long, AnzahlStellen As Integer) As  _
String
Dim i As Integer
For i = 1 To AnzahlStellen
CodeToString = CodeToString & WS.Cells(Mid(lCode, i, 1), 2) & Chr(10)
Next i
End Function
Function SelectionSort(TempArray As Variant)
Dim MaxVal As Variant
Dim MaxIndex As Integer
Dim i, j As Integer
For i = UBound(TempArray) To 1 Step -1
MaxVal = TempArray(i)
MaxIndex = i
For j = 1 To i
If TempArray(j) > MaxVal Then
MaxVal = TempArray(j)
MaxIndex = j
End If
Next j
If MaxIndex TempArray(MaxIndex) = TempArray(i)
TempArray(i) = MaxVal
End If
Next i
End Function
cu
Chris
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige