Eigene Funktion zum Farbe umstellen

Hallo liebe Excel Freunde,

Ich möchte in A1,B1,C1 Farbwerte eingeben. In B2 sollte dann sofort nach Änderung eines Wertes die Celle gefärbt werden (ohne noch einen Button zu drücken)

Mein Ansatz:

Function MeinFarbe(R, G, B) As String
‚‘’'Beipiel Celle B1: =MeinFarbe(A1;B1;C1)

ActiveSheet.Range(„B2“).Interior.Color = RGB(R, G, B) 'Das geht nicht
MeinFarbe = R & " " & G & " " & B ’ Nur das man was sieht

End Function

Wer hat einen Tipp - Danke

bedingte Formatierung in deinem Fall nicht möglich?

Hallo

Mit einer Function schaffe ich es nicht. Aber mit einer Ereignisprozedur:

Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Intersect(Target, Range("A1:C1"))
    If Target Is Nothing Then Exit Sub
ColA = Range("A1").Value
ColB = Range("B1").Value
ColC = Range("C1").Value
Range("B2").Interior.Color = RGB(ColA, ColB, ColC)
If IsEmpty(ColA) And IsEmpty(ColB) And IsEmpty(ColC) Then
    Range("B2").Interior.ColorIndex = xlNone
End If
End Sub

Dieses Makro wird im VBA-Explorer nicht im Modul-Bereich eingegeben sondern unter Microsoft Excel Objekte in der Tabelle, in der es ausgeführt werden soll.

Ich hoffe, das hilft Dir. Grüsse Niclaus

Hallo Niclaus,
Sehr gut Funktion super

Durch das Erste „If“ wird das System auch nicht langsamer.
klasse Lösung

Danke

Oh my god! Was für einen Rechner hast du bitte?

Und warum VBA, wo doch bedingte Formatierungen genauso gehen.

Und isEmpty eines Values? Was soll das nutzen?

https://msdn.microsoft.com/de-de/vba/language-reference-vba/articles/isempty-function

IsEmpty gibt True zurück, wenn die Variable nicht initialisiert oder explizit auf Empty festgelegt wurde, andernfalls wird False zurückgegeben. False wird immer zurückgegeben, wenn expression mehrere Variablen enthält. IsEmpty gibt nur für Variant-Werte sinnvolle Informationen zurück.

Bei leeren Zellen ergibt isEmpty() also False. Was willst du bitte damit erreichen?

2 Like

Hallo Flowermoman

Mit bedingter Formatierung? Bei mehreren Dutzend oder hundert Variations-Möglichkeiten von RGB-Color? - Wie machst Du das? Ich bin gespannt!

Bei leeren Zellen ergibt isEmpty() also False. Was willst du bitte damit erreichen?

Ich bin zu wenig versiert in VBA. Mit der IsEmpty()-Bedingung wollte ich folgendes erreichen: Wenn alle drei Zellen A1:C1 leer sind, dann soll B2 nicht schwarz gefärbt werden, sondern B2 soll keine Farb-Füllung haben. - Wie macht man das besser?

Ich weiss, dass ich auch hätte schreiben können:
If IsEmpty(Range(„A1“)) And IsEmpty(Range(„B1“)) And IsEmpty(Range(„C1“))
Aber auch dafür hast Du sicher eine bessere Lösung! Ich bin gespannt!

Bei leeren Zellen ergibt isEmpty() also False.

Das ist höchst interessant: Auf meinem Rechner mit Windows 10 und den Office-Programmen 2013 ergibt
IsEmpty(ColA) And IsEmpty(ColB) And IsEmpty(ColC)
bei leeren Zellen TRUE, nicht FALSE! Das ist leicht zu überprüfen mit:
MsgBox IsEmpty(ColA) And IsEmpty(ColB) And IsEmpty(ColC)

Nur wenn eine oder zwei oder alle drei Zellen A1:C1 einen numerischen Wert enthalten, erst dann ergibt diese IsEmpty-Prüfung FALSE. - Uebrigens: Nicht abgefangen habe ich den Fehler, der sich bei der Eingabe eines Textes statt einer Zahl ergibt.

Welche Programm-Versionen hast Du? - Und wie gesagt, ich warte gespannt auf Deine Lösung!

Grüsse Niclaus

Das ist der typische Fall von „da hat der Kunde Wünsche, die sinnlos sind“. Man muss ehrlich mit seinen Anforderungen umgehen. Soll man Excel wirklich für sowas missbrauchen? Oder ist es extrem wichtig, dass man die richtige Farbe zu RGB-Werten eingibt? Dann nimm C# oder Java oder Brainfuck aber verdammt nochmal nicht Excel.

Ich hab das nicht selbst probiert, die MSDN beschreibt diese Funktion ganz eindeutig. Siehe meinen verlinkten Artikel. Wenn das also bei dir geht, ist das Verhalten anders als beschrieben. Das kann sein, ist aber nicht sehr wahrscheinlich. Wahrscheinlicher ist, dass dein jetziger Testfall anders ist als das, was du oben geschrieben hast. Schauen wir doch mal…

Das ist halt genau nicht das, was du in deinem Snippet oben beschrieben hast.

Dort hattest du - etwas anders notiert - das hier beschrieben: If IsEmpty(Range("A1").Value) ...

Value ist was anderes als Range. Dem aufmerksamen Leser wäre das aufgefallen.

Und diese krude Anweisung soll genau was ergeben? Damit verlässt du dich auf eine implizite Umwandlung von Bool in String, in der Hoffnung, dass aber VORHER der gemeinsame Wahrheitswert aus 3 Funktionen ermittelt wurde. Kann man so machen, lässt halt Zweifel zurück und beweist gar nichts.

2 Like

vX = Split("66, 101, 105, 32, 115, 111, 108, 99, 104, 101, 110, " & _
"32, 65, 101, 117, 115, 115, 101, 114, 117, 110, 103, 101, 110, 32, " & _
"118, 101, 114, 122, 105, 99, 104, 116, 101, 32, 105, 99, 104, 32, 97, " & _
"117, 102, 32, 119, 101, 105, 116, 101, 114, 101, 32, 68, 105, 115, 107, " & _
"117, 115, 115, 105, 111, 110, 101, 110, 46", ",")
For i = 0 To UBound(vX): vX(i) = Chr(vX(i)): Next i: MsgBox Join(vX, "")

Sehr schön. Gut gemacht.

Ich weiß zwar überhaupt nicht, was das soll, aber trotzdem: gut gemacht.

Hieß es nicht irgendwann mal, man programmiert, um sich Arbeit zu ersparen? Da hätte ich jetzt gern mal gewusst: was erspart man sich denn hier?

2 Like

Hallo Nurkucken
Ich sehe das anders: Es ist die uralte komplementäre Dichotomie zwischen Homo ludens und Homo faber!
Grüsse Niclaus

Farbe. Nicht faber.

Und Sinn ergibt das immer noch keinen. Wir sind hier nicht bei ‚Philosophie‘.

2 Like

das ergibt:

grafik

Also, wenn das dein Programmierstil ist, dann hör bitte auf, hier irgendwelche Antworten zu geben. Ich versuche den Fragern das Minimum an Quelltextqualität zu vermitteln. So ein Quick&Dirty Gefrickel, was du hier vorschlägst hilft da überhaupt nicht.

Du solltest dich mal mit KISS und YAGNI, mit sprechenden Variablen, Einrückung und Kommentaren beschäftigen. Und VBA darf 2018 nicht die Antwort auf alle Fragen sein. Aber was sage ich dir das? Du bist bestimmt viel toller als alle anderen.

2 Like

Vielen Dank Niclaus,

ich habe deine Lösung ähnlich übernommen - funktioniert Prima - Genau das habe ich gebraucht.
Den anderen Kollegen Danke ich auch mal (nur wenig) für die Clean Code Diskussion

Gruß aus Hirschberg

Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range(„A2:C2“)) Is Nothing Then
’ „Nichts zu tun“
Else
ActiveSheet.Range(„B4:C7“).Interior.Color = RGB(ActiveSheet.Range(„A2“), ActiveSheet.Range(„B2“), ActiveSheet.Range(„C2“))
End If

End Sub

Das freut mich! Ja, in der Kürze liegt die Würze.

Einen Ratschlag gebe ich Dir noch:

Füge jetzt bitte nicht vor dem End Sub folgende Zeile ein:

If IsEmpty(Range("A2")) And IsEmpty(Range("B2")) And IsEmpty(Range("C2")) _
    Then Range("B4:C7").Interior.ColorIndex = xlNone

und behaupte dann nicht: Wenn der Inhalt der Zellen A2:C2 gelöscht wird, sind die Zellen B4:C7 nicht schwarz gefärbt, sondern sie haben gar keine Hintergrund-Farbe. Sonst bricht ein riesiges Flower Power-Gewitter über Dich herein und Du wirst zum Biedermann unter den Brandstiftern. - Aber das ist wohl zu viel Literatur oder Philosophie für dieses Forum.

Grüsse aus Zürich Niclaus

Super, @Weihnachtsmann. Hat der Frager doch direkt was gelernt von dir. Aber von dir lernen heißt halt auch vom Besten zu lernen.

1 Like

So dumm wird er hoffentlich nicht sein. Wenn die Bedingung erfüllt ist, wird die Hintergrundfarbe nicht auf irgendwas interessantes gesetzt, sie bleibt, wie sie vorher war.

Und hast du mal irgendwann darüber nachgedacht, auf was der Hintergrund gesetzt wird, wenn nur eine oder zwei Zellen leer sind?

Deine Logik solltest du irgendwann mal überdenken. Am besten, bevor du IRGENDEINE weitere Antwort bezüglich Programmierung gibst. Du outest dich sonst vielleicht wieder als … extrem hilfreich.

2 Like

Was denkst Du denn? Ich habe nicht nur darüber nachgedacht, sondern selbstverständlich alle möglichen Eingaben (und „Löschungen“) in A2:C2 auch durchgeführt. Du etwa nicht? - 10 Varianten ergeben sich dabei. So haben wir es in der statistischen Kombinatorik gelernt.

Das ist halt das Problem mit hingerotzten Quelltextbruchstücken ohne jede Erklärung oder Kommentierung. Der Frager nimmt jetzt irgendwas und überlässt es vermutlich seinen Benutzern, sich mit den Laufzeitfehlern rumzuschlagen.

Aber davon hast du nie geredet. Im Gegenteil hast du ihm noch eine weitere Fehlerquelle geschenkt.

Hättest du mal lieber ein OR vorgeschlagen. Naja, er hat es halt jetzt so gemacht wie du und nur das zählt. Ganz großes Kino.

1 Like

Ups. Jetzt kommen zur Logikschwäche auch noch Schwächen in der Grammatik? Du wolltest sicher schreiben:

Denn sonst würdest du dir ja auch noch Realitätsverlust bescheinigen. Und das wäre keine

sondern einfach nur albern.

2 Like