2011-09-13 27 views
6

Tôi đang sử dụng thang màu cho định dạng có điều kiện của mình trong Excel 2007 và tôi đang gặp khó khăn khi tìm mã màu tô cho các ô được định dạng có điều kiện. Tôi biết Interior.Color trả về giá trị màu mặc định nhưng điều đó không giúp được gì khi sử dụng định dạng có điều kiện. Tôi chuyển tiếp khá ngạc nhiên về mức độ khó khăn của việc này.Làm cách nào để tìm giá trị màu tô của ô được định dạng có điều kiện trong Excel 2007 bằng vba?

Cảm ơn bạn.

+0

Xem tại đây: http://stackoverflow.com/questions/996384/excel-2007-conditional-formatting-how-to-get-cell-color – RBarryYoung

Trả lời

2

Mã bên dưới được lấy từ VBAExpress, tất cả tín dụng đều là tác giả gốc - byundt.

Nó có thể cần phải được sửa đổi cho excel 2007.

Original Link

Function ConditionalColor(rg As Range, FormatType As String) As Long 
    'Returns the color index (either font or interior) of the first cell in range rg. If no _ 
    conditional format conditions apply, Then returns the regular color of the cell. _ 
    FormatType Is either "Font" Or "Interior" 
    Dim cel As Range 
    Dim tmp As Variant 
    Dim boo As Boolean 
    Dim frmla As String, frmlaR1C1 As String, frmlaA1 As String 
    Dim i As Long 

    'Application.Volatile 'This statement required if Conditional Formatting for rg is determined by the _ 
    value of other cells 

    Set cel = rg.Cells(1, 1) 
    Select Case Left(LCase(FormatType), 1) 
    Case "f" 'Font color 
     ConditionalColor = cel.Font.ColorIndex 
    Case Else 'Interior or highlight color 
     ConditionalColor = cel.Interior.ColorIndex 
    End Select 

    If cel.FormatConditions.Count > 0 Then 
     'On Error Resume Next 
     With cel.FormatConditions 
      For i = 1 To .Count 'Loop through the three possible format conditions for each cell 
       frmla = .Item(i).Formula1 
       If Left(frmla, 1) = "=" Then 'If "Formula Is", then evaluate if it is True 
        'Conditional Formatting is interpreted relative to the active cell. _ 
        This cause the wrong results If the formula isn 't restated relative to the cell containing the _ 
        Conditional Formatting--hence the workaround using ConvertFormula twice In a row. _ 
        If the Function were Not called using a worksheet formula, you could just activate the cell instead. 
        frmlaR1C1 = Application.ConvertFormula(frmla, xlA1, xlR1C1, , ActiveCell) 
        frmlaA1 = Application.ConvertFormula(frmlaR1C1, xlR1C1, xlA1, xlAbsolute, cel) 
        boo = Application.Evaluate(frmlaA1) 
       Else 'If "Value Is", then identify the type of comparison operator and build comparison formula 
        Select Case .Item(i).Operator 
        Case xlEqual ' = x 
         frmla = cel & "=" & .Item(i).Formula1 
        Case xlNotEqual ' <> x 
         frmla = cel & "<>" & .Item(i).Formula1 
        Case xlBetween 'x <= cel <= y 
         frmla = "AND(" & .Item(i).Formula1 & "<=" & cel & "," & cel & "<=" & .Item(i).Formula2 & ")" 
        Case xlNotBetween 'x > cel or cel > y 
         frmla = "OR(" & .Item(i).Formula1 & ">" & cel & "," & cel & ">" & .Item(i).Formula2 & ")" 
        Case xlLess ' < x 
         frmla = cel & "<" & .Item(i).Formula1 
        Case xlLessEqual ' <= x 
         frmla = cel & "<=" & .Item(i).Formula1 
        Case xlGreater ' > x 
         frmla = cel & ">" & .Item(i).Formula1 
        Case xlGreaterEqual ' >= x 
         frmla = cel & ">=" & .Item(i).Formula1 
        End Select 
        boo = Application.Evaluate(frmla) 'Evaluate the "Value Is" comparison formula 
       End If 

       If boo Then 'If this Format Condition is satisfied 
        On Error Resume Next 
        Select Case Left(LCase(FormatType), 1) 
        Case "f" 'Font color 
         tmp = .Item(i).Font.ColorIndex 
        Case Else 'Interior or highlight color 
         tmp = .Item(i).Interior.ColorIndex 
        End Select 
        If Err = 0 Then ConditionalColor = tmp 
        Err.Clear 
        On Error GoTo 0 
        Exit For 'Since Format Condition is satisfied, exit the inner loop 
       End If 
      Next i 
     End With 
    End If 

End Function 
7

Bạn có thể truy cập vào màu sắc nội thất trong các điều kiện fomatting (không phải những gì các tế bào hiện đang là) như vậy, giả sử có này là điều kiện đầu tiên được áp dụng trên ô:

Range("A1").FormatConditions(1).interior.color 

Đây là hàm sẽ trả về mã màu cho tất cả các định dạng có điều kiện là ô chứa đựng. Nó sẽ trả lại không có gì nếu không có điều kiện, và nếu có một điều kiện nhưng không có màu sắc được thiết lập cho nó, sau đó nó sẽ cho bạn biết "không".

Function ConditionalColor(ByVal cell As Range) 

Dim colors As String 
Dim i As Long 

For i = 1 To Range(cell.Address).FormatConditions.count 
    If Range(cell.Address).FormatConditions(i).Interior.Color <> 0 Then 
     colors = colors & "Condition " & i & ": " & _ 
     Range(cell.Address).FormatConditions(i).Interior.Color & vbLf 
    Else 
     colors = colors & "Condition " & i & ": None" & vbLf 
    End If 
Next 

If Len(colors) <> 0 Then 
    colors = Left(colors, Len(colors) - 1) 
End If 

ConditionalColor = colors 

End Function 

CẬP NHẬT: Trong trường hợp bạn tò mò (Tôi là), mã màu mà Excel sử dụng thực sự là BGR, không RGB. Vì vậy, nếu bạn muốn chuyển đổi mã để các giá trị RGB, bạn có thể sử dụng này:

Function GetRGB(ByVal cell As range) As String 

Dim R As String, G As String 
Dim B As String, hexColor As String 
hexCode = Hex(cell.Interior.Color) 

'Note the order excel uses for hex is BGR. 
B = Val("&H" & Mid(hexCode, 1, 2)) 
G = Val("&H" & Mid(hexCode, 3, 2)) 
R = Val("&H" & Mid(hexCode, 5, 2)) 

GetRGB = R & ":" & G & ":" & B 
End Function 
5

Hi Những câu trả lời bạn đã cung cấp đã không làm việc vì tôi đang sử dụng một thang màu vì vậy nó không trả lại 3 giá trị điều kiện bình thường .

Sau nhiều tìm kiếm hơn, tôi đã tìm thấy một giải pháp thay thế hoạt động. Đó là để lấy dữ liệu và đặt nó vào từ sau đó sao chép nó trở lại vào excel làm cho phạm vi đi đến một màu sắc thực sự trong tế bào để Interior.Color sẽ làm việc. Tôi tìm thấy một người nào đó đã lấy và đưa nó vào VBA. Đây là link cho nó nếu có ai khác đang tìm cách để làm điều này.

+0

Chính xác, dòng thứ 2 của hàm 'If Range (ô) .Address) .FormatConditions (i) .Tiếp theo.Màu <> 0 Sau đó, tạo ra > lỗi 438 'Đối tượng không hỗ trợ thuộc tính hoặc phương pháp này' > Điều này là do chúng tôi sử dụng nhiều hơn 3 điều kiện. Cách giải quyết của bạn (dán vào Word và sau đó quay lại Excel) có vẻ là tùy chọn tốt nhất. – ProtoVB

+1

Có ai biết điều gì sẽ xảy ra khi dán từ Excel vào Word. Nếu chúng ta hiểu rằng chúng ta có thể trích xuất mã màu. – ProtoVB

-3

Cách dễ dàng: In màn hình bảng tính. Dán nó vào sơn. Sử dụng công cụ pipet để tìm màu. Nhấp vào Chỉnh sửa màu.

BOOM tìm thấy thông tin RGB của bạn mà bạn có thể nhập trở lại vào excel

2

Tôi không có một câu trả lời làm việc với Excel 2007 hoặc thấp hơn nhưng từ Excel 2010 trở đi bạn có thể sử dụng như sau (thay đổi Phạm vi cho phù hợp):

Range("A1").DisplayFormat.Interior.ColorIndex 

May mắn thay, trong khi phần mềm mà tôi cần nó được hỗ trợ trên Excel 2003 trở đi, tôi chỉ thực sự yêu cầu nó trong quy trình thử và mô-đun thử được lấy ra khỏi phiên bản sản xuất.

Các vấn đề liên quan