2015-05-29 13 views
9

Ich habe viele Benutzer gesehen, die Fragen stellten, die versuchten, die Farben von Zellen mit benutzerdefinierten Funktionen zu ändern. Ich hatte immer den Eindruck, dass das nicht möglich war. Mein Verständnis war, dass eine benutzerdefinierte Funktion keine Eigenschaften einer Zelle außer dem Wert der Zelle, die die Formel enthält, ändern kann. Subs sind was Zellen selbst verändern.Benutzerdefinierte Funktion zum Ändern der Farbe einer Zelle

Allerdings habe ich festgestellt, dass es nicht immer der Fall ist, wenn ich mit etwas Code experimentiere.
den einfachen Code:

Function ColorCell(rng As Range) 
If rng.Value = 1 Then 
    ColorCell = False 
Else 
    ColorCell = True 
    rng.Interior.ColorIndex = 3 
End If 
End Function 

Wenn ich die Funktion in eine Zelle eingeben, ich erwartete Ergebnisse erzielen, ändern Sie keine Zellen Farben. Wenn ich jedoch die Schaltfläche Formeln> Funktion einfügen benutze und zu meiner Formel navigiere, um sie so einzufügen, fügt sie die Zielzellen ein.
Cell Color Function

Wie ist das möglich, und warum hat sich die Funktion anders verhalten, wenn sie auf verschiedene Arten eingegeben wurde?

EDIT: Diese wurde getestet diesen Code Excel 2007

+0

Ich kenne die Antwort nicht, aber beachten Sie, dass wenn Sie die Zellwerte ändern, wird es nicht Ändern Sie die Färbung auch im unteren Fall. Wenn Sie also Zelle A11 zu 1 ändern, bleibt die Zelle rot. – OpiesDad

+0

Richtig, es gibt keine Aktualisierung der Funktion selbst. Außer wenn Sie zurückgehen und "Funktion einfügen" erneut verwenden, aktualisiert * * den Wert/die Farbe. – TMH8885

+3

'Ich fand, dass es nicht immer der Fall ist." Richtig :) Hast du gesehen [This] (http://stackoverflow.com/questions/23433096/using-a-udf-in-excel-to-update-the- Arbeitsblatt) –

Antwort

2

Verwendung mit ... nur Blattnamen ersetzen und

Sheets("sheet_name").range(j:j).clear 

for j=2 to 15 
if Sheets("sheet_name").Cells(j, 1).value=1 then 

else 

Sheets("sheet_name").Cells(j, 1).Interior.ColorIndex = 3 
next j 
0

Ich benutze Worksheet_Change Ereignis versuchen Wertänderungsbereich in der Arbeit zu erkennen. Beispiel. Ich möchte etwas tun, wenn Bereich A1: A5 geändert wurde. Ich verwende unter Ereignis.

Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range(<Your working range>)) Is Nothing Then 'Define range that you want to do 
     'Statement here 
     ... 

    End If 
End Sub 

Wenn der Bereichswert geändert wurde. Es wird Ihren Code ausführen.

Und anderen Weg. Verwenden Sie bedingte Formatierung.

0

Wie wir alle früher oder später feststellen, können Sie in Benutzerfunktionen nicht auf Subs zugreifen, die die Dinge in Ihrer Tabelle direkt ändern.

Aber versuchen Sie dies:

Dim ColorMeTarget As Range, ColorMeVal As Long 

Public Function ColorMe(ByVal TargetRange As Range, ByVal ColVal As Long) 
    Set ColorMeTarget = TargetRange 
    ColorMeVal = ColVal 
    ColorMe = ColVal 
End Function 

Public Sub ColorMeSub() 
    Application.OnTime Now + TimeValue("00:00:05"), "ColorMeSub" 
    If ColorMeTarget.Interior.Color <> ColorMeVal Then ColorMeTarget.Interior.Color = ColorMeVal 
End Sub 

Wenn Sie die Unter zuerst ausgeführt, es wird ständig die statischen Variablen ColorMeTarget und ColorMeVal scannen, um zu sehen, ob es eine Änderung gibt. Die Funktion ColorMe legt diese Werte fest. Wenn ColorMeTarget noch nicht initialisiert ist, wird zusätzlicher Code benötigt.

Wenn Sie intelligenter werden, könnten Sie die Funktion zuerst überprüfen lassen, ob es tatsächlich eine Änderung gibt und die neuen Färbungsanforderungen zu einem Stapel hinzufügen. Ihr wiederkehrendes Sub kann dann "aufholen", besonders wenn Sie viele Funktionen wie diese haben.

Sie können dann sogar alle Arten von zusätzlichen Steuerelementen zu Ihrer Funktion hinzugefügt/Makro - EVEN STUFF NICHT VON DEN NEUESTEN VERSIONEN DER 'CONDITIONAL FORMATING' ABGEDECKT !!! YAY!!!!

Etwas zu versuchen: In einigen meiner automatisierten Makros kann ich OnTime über eine Funktion einstellen, kann es aber hier nicht funktionieren lassen. Es wäre sauberer, wenn die Funktion die OnTime-Funktion und keine wiederherstellende Subroutine hätte, die initialisiert werden muss.

0

auch die Nicht-Skriptmethode von Auto-Färbung einer Zelle basierend auf dem Zustand der Zelle (aka Bedingte Formatierung) versuchen könnte:

highlight desired range & click "conditional formatting from the toolbar

use either an established rule or make a new rule

note options on rule types; I selected one to simply format the range based on cell contents. You can format based on a formula as well. Set the conditions to test ... in this case I said the condition is when a cell value is more than 5. Then click on format and set the desire format whether it be a font change or shading of the cell, etc. Here I selected to shade the cell a color of green when above 5 Here is the result. You can delete the contents of the cells without deleting the conditional formatting set for the cells.

Verwandte Themen