Textfelder über VBA färben, anhand von RGB Wert aus Zelle

  • Excel

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von INOPIAE.

    Textfelder über VBA färben, anhand von RGB Wert aus Zelle

    Hallo Zusammen,

    ich bin neu hier und hoffe ich habe nicht irgendwo bereits einen Eintrag übersehen und poste unnötig. :/

    Und zwar habe ich folgendes Problem:
    Ich habe eine Excel Mappe (mit Makros). Worauf sich auf Tabelle1 eine Landkarte aus mehreren Textfeldern befindet.
    Auf Tabelle2 befindet sich eine Liste mit RGB Werten (In einer Spalte von einer Tabelle).
    MA1255, 0, 0
    MA20, 255, 0
    MA1255, 0, 0
    MA1255, 0, 0
    MA20, 255, 0

    Also jedem Mitarbeiter ist eine Farbe zugeordnet. Und in diesem Fall werden den Mitarbeitern verschiedene Postleitzahlgebiete zugeordnet und um dies darzustellen, soll ich entsprechendes Textfeld in die entsprechende Farbe färben. Indem man in die Tabelle einen Mitarbeiter einträgt, füllt sich das Feld mit dem RGB Wert automatisch.

    Ich habe bereits rausgefunden, dass ich die Textfelder färben kann indem ich wie folgt die Farbe in den Code eingebe:
    Sub ZuordnungFarbe()

    Tabelle1.Shapes("S_01").Select
    Selection.Interior.Color = RGB(255, 228, 79)

    End Sub
    Jetzt ist allerdings das Problem, dass die Farbe variieren kann (Wenn z.B. das Gebiet auf einmal von MA1 zu MA2 wechselt).

    Weiß jemand zufällig wie und ob ich den Wert der Farbe auch durch eine ".Range" irgendwie aus der Zelle entnehmen kann? (Dann würde dieser sich auch automatisch ändern, wenn sich der Wert der Zelle ändert). Falls jemand eine andere Idee hat, bin ich auch offen dafür. Und wenn es eine Möglichkeit gibt, ist es vllt. auch möglich den Code kürzer zu halten ohne jedes Textfeld einzeln anzusprechen ohne dass er die Textfelder anhand der Position sucht (Das funktioniert nicht, weil er sie dann nicht mehr findet, wenn Textfelder sich überschneiden)? (Sind ja immerhin 95 Stück)

    Ich hoffe ihr versteht was ich möchte ?(

    Liebe Grüße
    Karma :saint:
    Dateien
    • Testmappe.xlsm

      (935,55 kB, 158 mal heruntergeladen, zuletzt: )
    Du kannst die Farben mit den Split-Befehl aufteilen:

    Visual Basic-Quellcode

    1. Dim Farbe() As String
    2. Dim Zeile As Long
    3. Dim wks1 As Worksheet
    4. Dim wks2 As Worksheet
    5. Set wks1 = Worksheets("Tabelle1")
    6. Set wks2 = Worksheets("Tabelle2")
    7. For Zeile = 7 To 100 ' oder was immer Deinen Zeilen sind
    8. Farbe = Split(wks2.Cells(Zeile, 1).Value, ",")
    9. wks1.Shapes("S_" & Format(Zeile - 6, "00")).Fill.ForeColor.RGB = RGB(Farbe(0), Farbe(1), Farbe(2))
    10. Next
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    @INOPIAE
    Erstmal vielen Dank für die Antwort INOPIAE,

    ich versuche noch diesen Split Befehl zu verstehen. Aber irgendwie ist es auch egal wie ich es drehe und wende, er schickt mich immer wieder zum Debuggen zurück.
    Ich habe den Code so übernommen wie von dir geschrieben und eben nur grade Zeile, Spalte usw. angepasst.Vielleicht ist es sinnvoll mal die Datei so anzuhängen wie sie ist. Vllt. mach ich auch irgendwo einen groben Fehler.


    Den Code habe ich wie folgt in ein Modul gesetzt, damit dieser sich automatisch aktiviert, wenn ich bei einer ComboBox einen bestimmten Wert eingebe (das ist schon alles eingerichtet):

    Sub PositionenFarbe()
    Dim Farbe() As String
    Dim Zeile As Long
    Dim wks1 As Worksheet
    Dim wks4 As Worksheet

    Set wks1 = Worksheets("Vertriebsgebiete")
    Set wks4 = Worksheets("Einstellungen")

    For Zeile = 6 To 100
    Farbe = Split(wks4.Cells(Zeile, 6).Value, ",")
    wks1.Shapes("S_" & Format(Zeile, 5, "")).Fill.BackColor.RGB = RGB(Farbe(0), Farbe(1), Farbe(2))

    Next
    End Sub

    Habe lediglich noch wks4 aus wks2 gemacht, aber das macht ja keinen Unterschied. Er liest den Code bis zur der Zeile die ich Fett gemacht habe. Diese zeigt er mir dann gelb an.
    Ich bin was VBA angeht noch kein Profi und bringe mir alles selber bei.. vllt scheitert es auch nur an der Formatierung der Zellen? Kann das sein?
    Also im Moment sind die RGB Werte z.B. nicht reingeschrieben, sondern per WENN-Formel eingetragen, damit sie variable bleiben.

    Die Textfelder sind alle Bezeichnet mit S_ und der jeweiligen zweistelligen PLZ also "S_01" oder "S_99".
    Die Zahlen stehen nochmal auf der zweiten Tabelle, ich kann diese auch ersetzen durch "S_01" usw. damit er sich anhand der Zellen direkt den Namen (also die Textfelder) suchen kann.

    ?( Vllt. könntest du ja mal drüber schauen.. vllt mache ich es auch komplett falsch :/

    Liebe Grüße und echt vielen vielen Dank für die Hilfe!!

    Karma :saint:
    Dateien
    Kannst Du bitte auch eine XLSM-Datei anhängen, damit ich dein Makro sehen kann.

    Prüfe mal, wenn der Fehler auftaucht, welcher Wert in der Variablen Zeile steht. Du solltest sehen, dass dort der Wert 11 drin steht. Es gibt aber kein Shape mit S_11.
    wenn Du aus:

    Visual Basic-Quellcode

    1. wks1.Shapes("S_" & Format(Zeile, 5, "")).Fill.BackColor.RGB = RGB(Farbe(0), Farbe(1), Farbe(2))


    dies machst:

    Visual Basic-Quellcode

    1. wks1.Shapes("S_" & wks4.Cells(Zeile, 5).Value).Fill.BackColor.RGB = RGB(Farbe(0), Farbe(1), Farbe(2))


    sollte es gehen.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    @INOPIAE
    Jetzt markiert er mir hier:

    wks1.Shapes ("S_" & wks4.Cells(Zeile, 5).Value.Fill.BackColor.RGB = RGB(Farbe(0), Farbe(1), Farbe(2)))
    .Shapes
    und sagt mir Unzulässige Verwendung einer Eigenschaft

    Und ja, 11 gibt es tatsächlich nicht.. hilft es was, wenn ich eine 11 einbaue?
    Eigentlich ja nicht, weil dann müsste ich ja auch andere PLZ Gebiete einbauen die es gar nicht gibt, weil es fehlen ja noch mehr Zahlen (für die es dann auch kein Textfeld gibt)
    Oder ist das zwingend notwendig?

    Ich bin dir echt dankbar für deine Mühen.. ich verzweifle schon seit Tagen daran.. aber es muss doch eine Lösung geben.. :/

    Ergänzung: Den Fehler im Code habe ich bereits korrigiert.. es klappt trotzem nicht
    wks1.Shapes("S_" & wks4.Cells(Zeile, 5)).Value.Fill.BackColor.RGB = RGB(Farbe(0), Farbe(1), Farbe(2))

    Er Zeigt mir bei "01" an wenn der Fehler kommt und bei den Farben hat er sogar die richtigen werte also Farbe 0 ist 241, Farbe 1 ist 182 und Farbe 2 ist 218

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Karma“ ()

    @INOPIAE
    Hier mal die Datei als xlsm
    Die Codes sind im Modul "Farbzuordnung" bei Vertriebler() und bei Positionen()

    Sub VertrieblerFarbe()
    Dim Farbe() As String
    Dim Zeile As Long
    Dim wks1 As Worksheet
    Dim wks4 As Worksheet

    Set wks1 = Worksheets("Vertriebsgebiete")
    Set wks4 = Worksheets("Einstellungen")

    For Zeile = 6 To 100
    Farbe = Split(wks4.Cells(Zeile, 6).Value, ",")
    wks1.Shapes("S_" & Format(Zeile, 6, "00")).Fill.ForeColor.RGB = RGB(Farbe(0), Farbe(1), Farbe(2))
    Next
    End Sub

    Das ist die Funktion die die RGB schreibt:
    Function RGB_Hintergrundfarbe(Farbe As Range)

    Dim Rot As Long
    Dim Grün As Long
    Dim Blau As Long
    Dim Wert As Long

    Wert = Farbe.Interior.Color

    On Error Resume Next

    Rot = Wert Mod 256
    Wert = (Wert - Rot) / 256
    Grün = Wert Mod 256
    Wert = (Wert - Grün) / 256
    Blau = Wert Mod 256
    RGB_Hintergrundfarbe = Rot & ", " & Grün & ", " & Blau

    End Function

    und in die Spalte in die Zellen eingefügt werden die Werte über :
    =WENN([@[Vertriebler.]]="WI";$J$7;WENN([@[Vertriebler.]]="DP";$J$6;$J$8))

    So dass man hinterher nur das Kürzel des Vertrieblers ändern muss und sich der RGB Wert automatisch anpasst.
    Vorne auf Tabelle 1 wählt man dann bei der Auswahl aus was man angezeigt haben möchte.. und dann soll sich die Karte dementsprechend ändern. Also entweder den die Bereiche die den Vertrieblern zugeordnet sind. Vllt möchte man aber auch angezeigt bekommen, wieviele Positionen sich in den Bereich befinden etc. (Hierfür würde ich deine Split Variante, einfach auf 3 Makros unterteilen und dann der ComboBox sagen, welches Makro wann ausgewählt werden soll (Das habe ich auch schon gemacht).

    Ich hoffe es hilft dir beim schauen. :saint:
    Dateien
    Hi,

    hier ein Vorschlag:
    Baue die Prozedur so um: (Dein Fehler lag in Zeile 12)

    Visual Basic-Quellcode

    1. Sub FarbeZuordnen(ByVal Farbspalte As Integer)
    2. Dim Farbe() As String
    3. Dim Zeile As Long
    4. Dim wks1 As Worksheet
    5. Dim wks4 As Worksheet
    6. Set wks1 = Worksheets("Vertriebsgebiete")
    7. Set wks4 = Worksheets("Einstellungen")
    8. For Zeile = 6 To 100
    9. Farbe = Split(wks4.Cells(Zeile, FarbSpalte).Value, ",")
    10. wks1.Shapes("S_" & Format(wks4.Cells(Zeile, 5).Value, "00")).Fill.ForeColor.RGB = RGB(Farbe(0), Farbe(1), Farbe(2))
    11. Next
    12. End Sub



    In der Prozedur der ComboBox machst Du dann dies:

    Visual Basic-Quellcode

    1. Private Sub ComboBox1_Change()
    2. Select Case ComboBox1.Value
    3. Case "Vertriebler"
    4. FarbeZuordnen 6
    5. Case "Zuordnung"
    6. ZuordnungFarbe
    7. Case "Positionen"
    8. FarbeZuordnen 7
    9. End Select
    10. End Sub



    PS
    Gewöhne Dir an, den Code mit Einrückungen zu strukturieren, dann ist er leichter lesbar.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Vielen Dank erstmal @INOPIAE , es macht grundsätzlich erstmal was es soll!

    ABER.. auch irgendwie wieder nicht so ganz. Weil, egal was ich auswähle werden: S_10, S_12, S_13 und S_20 nicht mit gefärbt und haben somit die falsche Farbe.

    Excel sucht doch aber nach den Namen, ist das korrekt?
    Das tut er ja hiermit: wks1.Shapes("S_" & Format(wks4.Cells(Zeile, 5).Value, "00")) und füllt dann hiermit .Fill.ForeColor.RGB = RGB(Farbe(0), Farbe(1), Farbe(2)) auf.

    Findet Excel diese Felder aus irgendeinem Grund nicht?
    Ich habe nun die Formeln genau so angepasst, wie du es gesagt hast (alle anderen Textfelder werden auch wunderbar eingefärbt. Diese allerdings überspringt er einfach)

    Ich hatte bereits überlegt, ob es daran liegen könnte, dass sich ein separates Textfeld über ihnen befindet. (Da hier die Textfelder der Karte zu klein waren, hatte ich ein zweites Textfeld drüber gelegt, um diese entsprechend zu beschriften). Es wird aber auch nicht mit gefärbt, wenn ich diese wieder wegnehme.

    Aber ansonsten hast du mir bisher schonmal super geholfen und ich danke dir vielmals! :thumbsup: Vor allem lerne ich immer mehr.. habe mir eben die Zeit genommen alle Codes einzurücken. :D

    Ich korrigiere - Bei Vertriebler färbt er es sogar immer richtig. Bei den anderen beiden nicht!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Karma“ ()

    Karma schrieb:

    Bei Vertriebler färbt er es sogar immer richtig. Bei den anderen beiden nicht!


    Dann sollte die Positionen auch funktionieren. Prüfe mal Deine Farbinformationen in der Spalte F.


    Liste Dir doch mal alle Shapes ( nicht Textfelder) auf Tabelle1 auf. Dann siehst Du die Namen.

    Visual Basic-Quellcode

    1. Sub ShapesAuflisten()
    2. Dim shp As Shape
    3. Dim Zeile As Long
    4. Dim wks as Worksheet
    5. Set wks=Worksheets("Tabelle1")
    6. Zeile = 1
    7. For each shp in wks.Shapes
    8. wks.Cells(Zeile, 20).value = shp.Name
    9. Zeile = Zeile + 1
    10. Next
    11. End Sub
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    @INOPIAE
    Äh... also du kannst es vergessen.. ich habe grade gesehen, er macht es auf einmal. Ich hatte eben alle Werte aus dem Ding genommen, und neu eingefügt, weil ich vorher was getestet habe was nicht funktioniert hat. Jetzt geht's auf einmal (sieht aber alles aus wie vorher auch)

    Also du kannst es vergessen. Ich danke dir echt vielmals. Damit ist das Thema beendet und es hat genau so funktioniert :thumbsup: Kann es noch gar nicht fassen, dass es endlich geht.

    Danke danke danke ! :D



    Okay also ich habe mir die jetzt auflisten lassen.

    Es sind alle vorhanden. Alle genauso bezeichnet wie sie sein sollen.
    ABER sie wurden mir in einer anderen Reihenfolge aufgelistet (durcheinander) es fing mit S_22 an und ging dann irgendwann mit S_01 usw.
    Ich würde ja sagen, vllt liegt es daran, aber bei Vertriebler schafft er es und bei Positionen auch.

    Es scheitert an dem "Zugeordnet" wo er die Farben nicht hinbekommt.
    Also denen in Spalte G Aber auch nur an denen für die Felder S_10, S_12, S_13 und S_20

    Keine Ahnung was das Problem an den Feldern ist. bei den anderen beiden findet er sie ja auch. An der Größe kann es auch nicht liegen, sonst würde es auch mit Feldern wie S_80 Probleme geben.
    @INOPIAE
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Karma“ ()

    Karma schrieb:

    Bei Vertriebler färbt er es sogar immer richtig. Bei den anderen beiden nicht!


    Das liegt an der For - Each-Schleife. Die nimmt die Shapes nicht alphabetisch sondern in einer anderen Reihenfolge. (Ich meine in der Reihenfolge, wie die Shapes angelegt wurden.)
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).