Excel 2007 условное форматирование - как получить цвет ячейки?
Предположим, что у меня есть следующий диапазон от (a1: c3)
A B C
1 -1 1 1
2 -1 0 0
3 0 0 1
Теперь я выбрал следующий диапазон и отформатировал его с помощью условного форматирования (с использованием по умолчанию красно-желтой зеленой цветовой гаммы).... теперь цвета диапазона стали
A B C
1 Green Red Red
2 Green Yellow Yellow
3 Yellow Yellow Red
Теперь я хочу задать цвет любой ячейки в диапазоне, например MsgBox Range ( "A1" ). Interior.Color
но он не говорит, что это зеленый, почему? Plz вы можете мне помочь?
Диапазон ( "A1" ). Interior.Color всегда возвращает 16777215
Range ( "A1" ). Interior.ColorIndex всегда возвращает -4142
(независимо от того, является ли цвет A1 красным, синим, зеленым,...)
Диапазон ( "A1", "C3" ). FormatConditions.Count
этот возвращает всегда 0, почему?
Ответы
Ответ 1
так как у меня может быть больше трех разных цветов за раз... я не нашел никакого хорошего способа справиться с условным форматированием цветов по умолчанию... я сделал это таким образом. то всякий раз, когда я спрашиваю цвет ячейки, я получаю правильный цвет!
for (int t = 0; t < d_distinct.Length; t++ )
{
Excel.FormatCondition cond =
(Excel.FormatCondition)range.FormatConditions.Add(
Excel.XlFormatConditionType.xlCellValue,
Excel.XlFormatConditionOperator.xlEqual,
"="+d_distinct[t],
mis, mis, mis, mis, mis);
cond.Interior.PatternColorIndex =
Excel.Constants.xlAutomatic;
cond.Interior.TintAndShade = 0;
cond.Interior.Color = ColorTranslator.ToWin32(c[t]);
cond.StopIfTrue = false;
}
d_distinct содержит все отдельные значения в диапазоне... c - это цвет [], который содержит разные цвета для каждого отдельного значения! этот код можно легко перевести на vb!
Ответ 2
.Interior.Color возвращает "реальный" цвет, а не результат условного форматирования цвета.
@sss: он недоступен через API.
Лучшее, что вы можете сделать, это проверить те же условия, которые вы использовали в условном форматировании.
Чтобы избежать дублирования кода, я предлагаю переместить условные критерии в UDF. Примеры:
Function IsGroup1(ByVal testvalue As Variant) As Boolean
IsGroup1 = (testvalue < 0)
End Function
Function IsGroup2(ByVal testvalue As Variant) As Boolean
IsGroup1 = (testvalue = 0)
End Function
Function IsGroup3(ByVal testvalue As Variant) As Boolean
IsGroup1 = (testvalue > 0)
End Function
Затем используйте эти формулы в своем условном форматировании:
=IsGroup1(A1)
=IsGroup2(A1)
=IsGroup3(A1)
Затем ваш код, а не глядя на цвет ячеек, посмотрит, выполнено ли условие:
If IsGroup1(Range("$A$1").Value) Then MsgBox "I'm red!"
Ответ 3
Вам нужно передать <Cell>.FormatConditions(index that is active).Interior.ColorIndex
, чтобы получить цвет условного форматирования ячейки.
Вы можете обратиться к приведенной ниже ссылке для примера:
http://www.xldynamic.com/source/xld.CFConditions.html#specific
Ответ 4
В дополнение к @richardtallent (извините, я не мог комментировать), следующая ссылка предоставит вам функцию, которая вернет вам индекс цвета, оценив условное форматирование для вас.
http://www.bettersolutions.com/excel/EPX299/LI041931911.htm
Ответ 5
Согласно Перечисление XlColorIndex ColorIndex=-4142
означает Нет цвета
Что касается этого, я не знаю. Возвращаемое значение представляется десятичным представлением значения RGB. Улучшенная версия this script, чтобы расшифровать значение в шестнадцатеричной нотации RGB
Function RGB(CellRef As Variant)
RGB = ToHex(Range(CellRef).Interior.Color)
End Function
Function ToHex(ByVal N As Long) As String
strH = ""
For i = 1 To 6
d = N Mod 16
strH = Chr(48 + (d Mod 9) + 16 * (d \ 9)) & strH
N = N \ 16
Next i
strH2 = ""
strH2 = Right$(strH, 2) & Mid$(strH, 3, 2) & Left$(strH, 2)
ToHex = strH2
End Function
Ответ 6
Чтобы получить цвет ячейки в диапазоне, вам нужно указать отдельную ячейку внутри массива в виде диапазона ( "A1", "C3" ). Ячейки (1,1) (для ячейки A1), Справка Excel очень хороша, если вы ищете имя свойства, с которым у вас проблемы.
Кроме того, Excel 2007 использует Integer для своих типов цветов, поэтому лучше всего назначить индекс цвета целому числу и использовать его во всей вашей программе. В вашем примере попробуйте:
Green = Range("A1","C3").Cells(1,1).Interior.Color
Yellow = Range("A1","C3").Cells(1,3).Interior.Color
Red = Range("A1","C3").Cells(2,1).Interior.Color
И затем, чтобы переключить цвета на все красные:
Range("A1","C3").Interior.Color = Red
Снова, проверьте справку Excel о том, как использовать ячейки ([RowIndex], [ColumnIndex]).
Если приведенное выше не работает для вас, проверьте, что .Interior.PatternColorIndex равно. Обычно я оставляю его на xlAutomatic (сплошной цвет), и он может быть установлен на что-то еще, если цвет не меняется.
Ответ 7
Похоже, что "Условный формат" -цвет доступен программно. Я бы предположил, что вместо этого вы пишете небольшую функцию, которая вычисляет цвет ячеек, а затем просто устанавливайте макрос для запуска его в активной ячейке всякий раз, когда вы редактируете значение. Например (извините за psuedo-code - я больше не специалист VBA):
Function GetColorForThisCell(Optional WhatCell as String) as Int
If WhatCell="" Then WhatCell = ActiveCell
If Range(WhatCell).value = -1 then GetColorForThisCell = vbGreen
If Range(WhatCell).value = 0 then GetColorForThisCell = vbYellow
If Range(WhatCell).value = 1 then GetColorForThisCell = vbRed
End Function
Sub JustEditedCell
ActiveCell.color = GetColorForThisCell()
End Sub
Sub GetColorOfACell(WhatCell as string)
Msgbox(GetColorForThisCell(WhatCell) )
End Sub
Хотя вы не сможете использовать встроенное условное форматирование Excel, это выполнит одно и то же, и вы сможете прочитать цвет из кода. это имеет смысл?