Подтвердить что ты не робот

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, почему?

4b9b3361

Ответ 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, это выполнит одно и то же, и вы сможете прочитать цвет из кода. это имеет смысл?