Wir wünschen allen Forenteilnehmern ein frohes Fest und einen guten Rutsch ins neue Jahr. x

Bedingte Formatieung VBA
#1
Hallo ich möchte in VBA eine Formel Schreiben, der ich eine Range, RGB-Werte vom Vorder- und Hintergrund und einen Namen aus dem Namensmanager übergebe. Ich möchte eine Bedingte Formatierung machen, ohne dies über die Menü zu bearbeiten. Es  soll überprüft werden ob der Name aus dem Namensmanager in der Range steht und mit den übergebenen RGB-Werten formatiert werden. Das ist mein Code:
Function FORMAT(rng As Range, rh As Integer, gh As Integer, bh As Integer, rv As Integer, gv As Integer, bv As Integer, bedingungsname As Name)
   
Code:
Dim Zelle As Range

    ' Überprüfen, ob der übergebene Bereich eine einzelne Zelle ist
    If rng.Cells.Count = 1 Then
        ' Überprüfen, ob der Wert in der Zelle dem Bedingungsnamen entspricht
        If rng.Value = bedingungsname.name Then
            ' Die Vordergrund- und Hintergrundfarbe der Zelle ändern
            rng.Interior.Color = RGB(rv, gv, bv)
            rng.Font.Color = RGB(rh, gh, bh)
        End If
    Else
        ' Schleife durch alle Zellen im übergebenen Bereich
        For Each Zelle In rng.Cells
            ' Überprüfen, ob der Wert in der Zelle dem Bedingungsnamen entspricht
            If Zelle.Value = bedingungsname.name Then
                ' Die Vordergrund- und Hintergrundfarbe der Zelle ändern
                Zelle.Interior.Color = RGB(rv, gv, bv)
                Zelle.Font.Color = RGB(rh, gh, bh)
            End If
        Next Zelle
    End If
End Function

Jedoch kommt immer #WERT als Fehler
Mein Aufruf:
=FORMAT(C:C;223;33;39;255;255;255;FCB) (steht in Zelle D3)

In Zelle C3 steht =FCB

Im Namensmanager ist FCB definiert als "FC Bayern München"

Wo ist mein Fehler
Antworten Top
#2
Hi,

Zitat:Wo ist mein Fehler
1. In einer UDF kannst du nur lesend auf Eigenschaften von Rangeobjekte zugreifen (Workarounds sind möglich).
2. Du gibst in deiner Function keinen Wert zurück, daher erhältst du auch den #wert Fehler.
3. Die .Name Eigenschaft eines Namens gibt nicht den Inhalt zurück.

Viele Grüße
derHöpp
Antworten Top
#3
Hallöchen,

hier mal noch ein Ansatz, wie es gehen könnte. Schreibe Deinen Code in ein Worksheet_Change - Makro und lässt in der Zelle zumindest das "=" vor dem FORMAT weg oder gleich beides Smile .

2 Varianten:

1) Deine Daten sind statisch.
Du änderst die Zelle mit FORMAT(..). Dann prüfst Du lediglich, ob die geänderte Zelle die mit dem FORMAT ist und wenn ja, führst Du den Teil mit der Formatierung aus.
Ich würde übrigens zuerst noch prüfen, ob die FORMAT-Angaben vollständig und syntaktisch passend sind.

2) Deine Daten sind nicht statisch
Du änderst Daten. Dann prüfst Du, ob die Änderung im betreffenden Datenbereich erfolgt ist und wenn ja, führst Du den Teil mit der Formatierung aus.

Falls beides zutreffen kann, musst Du das kombinieren.
Falls Du mehrere Zellen mit FORMAT für verschiedene Bedingungen hast, musst Du die ggf. in einer Schleife verarbeiten.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#4
Wie müsste ich den die Function anpassen

(26.02.2023, 09:21)schauan schrieb: Hallöchen,

hier mal noch ein Ansatz, wie es gehen könnte. Schreibe Deinen Code in ein Worksheet_Change - Makro und lässt in der Zelle zumindest das "=" vor dem FORMAT weg oder gleich beides Smile .

2 Varianten:

1) Deine Daten sind statisch.
Du änderst die Zelle mit FORMAT(..). Dann prüfst Du lediglich, ob die geänderte Zelle die mit dem FORMAT ist und wenn ja, führst Du den Teil mit der Formatierung aus.
Ich würde übrigens zuerst noch prüfen, ob die FORMAT-Angaben vollständig und syntaktisch passend sind.

2) Deine Daten sind nicht statisch
Du änderst Daten. Dann prüfst Du, ob die Änderung im betreffenden Datenbereich erfolgt ist und wenn ja,  führst Du den Teil mit der Formatierung aus.

Falls beides zutreffen kann, musst Du das kombinieren.
Falls Du mehrere Zellen mit FORMAT für verschiedene Bedingungen hast, musst Du die ggf. in einer Schleife verarbeiten.

Wie müsste ich den die Function anpassen?
Antworten Top
#5
Hallöchen,

in Deinem geposteten Code fehlt ja der Funktionsaufruf, und welche Variante zutrifft schreibst Du auch nicht. Hast Du den Code nicht selbst geschrieben?
Im Prinzip so für eine Änderung in D3. In D3 stehen nur die Parameter, also C:C;223;...

Code:
Private Sub Worksheet_Change(...Target...)
'Deklaration der Variablen
Dim rng as Range, ...

If Target.Address = "$D$3" Then

'Variablen befuellen durch Trennung der Parameter aus D3
set rng = range(split(target,";")(0))
...

'Nun kommt Dein bisheriger Code


Falls Du Variante 1 und 2 kombinieren willst, dann ggf. die Prüfung so:

If Target.Address = "$D$3" Or Intersect(Target, range(split(Range("D3");";")(0)) Then


Falls range(split(target,";")(0)) zu einem Fehler führt probiere bitte die Zuweisung von split(target,";")(0) an eine Variable und verwende diese dann z.B. in der set - Zeile.
Die (0) gibt hier C:C zurück. Falls das der Bereich zum Einfärben bzw. Umfärben bei Änderung ist, sollte es auch bei der If-Prüfung passen.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#6
=FORMAT(C:C;223;33;39;255;255;255;FCB) diesen Funktionsaufruf mache ich in Zelle D3, mit dem Ziel, dass alle Zellen der Spalte C (angebene als 1. Parameter), die die Formel =FCB enthalten (letzter Parameter) mit den Farbwerten (Parameter 2-4 Vordergrund, Parameter 5-7 Hintergrund) formatiert werden. Jedoch funktioniert das nicht.
Antworten Top
#7
Hallo,

1)
bitte keine Vollzitate. Ich habe das letzte entfernt.

2)
Zitat:=FORMAT(C:C;223;33;39;255;255;255;FCB) diesen Funktionsaufruf mache ich in Zelle D3

Wenn Du das immer noch machst, dann hast Du vermutlich die Antworten nicht verstanden. Mein Ansatz geht in eine andere Richtung und derHoepp hatte 1. ... geschrieben.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#8
(27.02.2023, 07:14)schaua schrieb: Wenn Du das immer noch machst, dann hast Du vermutlich die Antworten nicht verstanden. Mein Ansatz geht in eine andere Richtung und derHoepp hatte 1. ... geschrieben.

Ich hab die Antwortenn auch nicht verstanden
Antworten Top
#9
Hallöchen,

Also, das was derHoep geschrieben hat, bedeutet in etwa, dass Deine Funktion nicht funktioniert weil Excel das nicht kann. Ich wüsste jetzt nicht, wie man das noch beschreiben soll.
Da muss bzw. kann man demzufolge auch nix anpassen, damit es funktioniert.

Man kann z.B. einen anderen Weg beschreiten, ohne diese Funktion. Aber wenn Du auf einer Funktion beharrst ...
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#10
Moin,

als UDF bezeichnet man eine VBA-Funktion, die wie eine "normale" Formel in einer Excel-Zelle verwendet wird. UDF sind dabei darauf beschränkt, Werte zurückzugeben, die dann in der Zelle angezeigt werden können (wie das bei Formeln eben so ist). Excel-VBA zieht automatisch eine Art Sicherheitszaun um die UDF um sicherzustellen, dass (potentiell schädliche) aktive Inhalte nicht durch einfache Zellformeln ausgelöst werden. Das führt dazu, dass sich weder Farben, noch Inhalte von Zellen ändern lassen.

Wenn du das dennoch tun willst, musst du die UDF eben in ein "normales" VBA-Programm umschreiben, das du von VBA aus aufrufst.

Der von dir gezeigte Code sieht schon ziemlich fortgeschritten aus, deswegen verwundert es ein wenig, dass du die bisherigen Anregungen nicht aufnehmen konntest. Woher hast du den Code denn? Und was willst du eigentlich erreichen? Wieviele Formatierungen willst du erzeugen? In welchem Rhythmus ändern sich die Daten? Gibt es eine Beispieldatei?

Viele Grüße
derHöpp
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste