2014-03-12 6 views
9

ich die Funktion unten geschrieben habe, zu testen, ob eine Zelle bedingte Formatierung hat auf der Basis der Zellfüllung aktiviert.VBA-Funktion zu testen, ob Zelle bedingt in Excel formatiert ist

Function cfTest(inputCell) 

    If inputCell.DisplayFormat.Interior.Color <> 16777215 Then 
     cfTest = True 
    Else 
     cfTest = False 
    End If 
End Function 

Es funktioniert jedoch nicht. Wenn man das sagt, macht diese Methode.

Sub myCFtest() 
Dim R As Integer 
R = 2 
Do 
    If Range("I" & R).DisplayFormat.Interior.Color <> 16777215 Then 
     Range("K" & R).Value = True 
    Else 
     Range("K" & R).Value = False 
    End If 

    R = R + 1 

Loop Until R = 20 
End Sub 

Kann mir jemand erklären, warum die Funktion nicht funktioniert?

Prost.

EDIT: Aktualisierte Funktion aber nicht für die bedingte Formatierung arbeiten

Function cfTest(inputCell) 
    If inputCell.Interior.ColorIndex <> -4142 Then 
     cfTest = True 
    Else 
     cfTest = False 
    End If 
End Function 
+2

rufen Sie diese Funktion von Zelle wie folgt auf: '= cfTest (A1)'? Wenn ja, funktioniert 'DisplayFormat' nicht in der UDF-Funktion, wenn es aus dem Arbeitsblatt aufgerufen wird. Siehe _Remarks_ in diesem Link für Details: http://msdn.microsoft.com/en-us/library/office/ff838814(v=office.15).aspx –

+0

Das ist genau das, was ich versuchte zu tun - nennen Sie es von der Arbeitsblatt. Danke für den Link. Leider, wenn ich das DisplayFormat entferne, funktioniert es, aber nicht auf bedingt formatierten Zellen. Irgendwelche Tipps? Will den Beitrag bearbeiten die aktualisierte, aber immer noch nicht funktionierende Funktion .... – Chris

+3

Überprüfen Sie dies [http://www.cpearson.com/excel/CFColors.htm](http://www.cpearson.com/excel/CFColors. htm) – Nybbe

Antwort

0

ich eine Vorabkontrolle für den Farbindex führen würde Ihre Bedingung, die diese für die Verwendung ist:

Function cfTest_color_chk(inputCell As Range) 
    cfTest_color_chk = inputCell.Interior.ColorIndex 
End Function 

dann Ihre Funktion

Function cfTest(inputCell As Range) 
    If inputCell.Interior.ColorIndex <> -4142 Then 
     cfTest = True 
    Else 
    cfTest = False 
    End If 
End Function 

Anoth er Lösung, um die Dinge Fels in der Brandung ist sowohl Funktion zu kombinieren, so dass cfTest cfTest_color_chk als Parameter übernimmt und cfTest_color_chk den Wert der Farbe zurück zum Match ...

this helps

Pascal

1

Ich bin mir nicht sicher, warum das so ist, aber vielleicht hilft es. VB scheint nicht den Zugang zu einer Zelle Farbe zu ermöglichen, wenn die Farbe auf dem bedingten Formatierung basiert.

Zum Beispiel ..

'cell A1 colored yellow through conditional formatting 
MsgBox Range("A1").Interior.ColorIndex 
'returns the incorrect result of -4142 regardless of cell color 

'cell B1 colored yellow via the fill option on the ribbon 
MsgBox Range("B1").Interior.ColorIndex 
'returns the correct result of 6 

Davon abgesehen, gibt es einen Grund, warum Sie nicht nur die Zelle, für was auch immer Formatierungsregeln testen könnten Sie in Wirkung. Dies würde die Notwendigkeit einer UDF beseitigen.

=IF(A1<50,False,True) 
1

Hier sind zwei verwandte Funktionen, die mathematische Bedingungen implementieren. Dies ist etwas weniger kompliziert als die Chip-Pearson-Version und auch weniger vollständig, aber ich denke, das die meisten Fälle abdecken soll, und dies sollte nicht allzu schwierig sein, zu verlängern.

Function isConditionallyFormatted(rng As Range) As Boolean 

    Dim f As FormatCondition 

    On Error Resume Next 
    isConditionallyFormatted = False 
    For Each f In rng.FormatConditions 

     isConditionallyFormatted = checkFormula(rng.Value, f.operator, f.Formula1) 
     isConditionallyFormatted = checkFormula(rng.Value, f.operator, f.Formula2) 

     Next 

End Function 

Function checkFormula(rng As Variant, operator As Variant, condition As Variant) 

    On Error GoTo errHandler: 

    Dim formula As String 
    condition = Right(condition, Len(condition) - 1) 
    Select Case operator 

      Case xlEqual: formula = rng & "=" & condition 
      Case xlGreater: formula = rng & ">" & condition 
      Case xlGreaterEqual: formula = rng & ">=" & condition 
      Case xlLess: formula = rng & "<" & condition 
      Case xlLessEqual: formula = rng & "<=" & condition 
      Case xlExpression: formula = condition 

      End Select 

    checkFormula = Evaluate(formula) 
Exit Function 
errHandler: 
    Debug.Print Err.Number & " : " & Err.Description 
End Function 

Dies wird für einige gängige Betreiber arbeiten, aber es gibt zwei andere Operatoren (xlBetween und xlNotBetween) und es gibt auch andere Arten von Zustand, der auch gefangen werden müssten, und die Logik für einige von denen würde ein bisschen komplizierter als das sein. Einige von ihnen, aber (wie Datenbalken), vermitteln von Natur aus, dass es eine Bedingung ist, so dass keine Bearbeitung notwendig wäre. Hier

ist ein Link auf die vollständige Dokumentation:

http://msdn.microsoft.com/en-us/ff835850(v=office.15)

+0

Sorry, habe nicht gesehen, dass Sie sehen müssen, ob es aktiviert wurde. Erneut meinen Code überprüfen. –

3

Hier ist ein funktionierendes Demo, wenn das gewünschte Ergebnis. Spalte E sieht in Spalte D und zeigt den Wert TRUE, wenn es bedingt durch Zell Füllfarbe formatiert ist. d.h.Klicken Sie auf den Namen ‚Bob‘ und bedingt Highlights der Zelle über den Code unten

=IF(AND(CELL("row")=ROW(D1),CELL("col")=COLUMN(D1)),TRUE) 

enter image description here

Klicken Sie auf einen anderen Namen Formatierung und das gleiche Ergebnis auftritt.

enter image description here

Allerdings, wenn ich die Namen auf eine andere Zelle klicken weg, ich Zuname ausgewählt bleibt hervorgehoben, den Eindruck einer Taste gedrückt geben nach wie vor.

enter image description here

Der VBA-Code ist hinter wie folgt.

Dieser sitzt im Sheet1 Code:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

If Target.Column = 4 And Target.Row <= Application.WorksheetFunction.CountA(Range("D:D")) Then 
    Range("D:D").Calculate 
    Call cfTest 

End If 

End Sub 

Und das ist die Methode selbst:

Sub cfTest() 

Range("E:E").ClearContents 

If ActiveCell.DisplayFormat.Interior.color <> 16777215 Then 
    ActiveCell.Offset(0, 1) = True 
End If 

End Sub 

Die Anwendung, die ich dieses Beispiel zu viel mehr hatte, das weg gelandet, aber geht zurück Mit der cfTest() - Methode konnte ich testen, ob eine Zelle aufgrund der Zellenfüllung bedingt formatiert wurde.

Verwandte Themen