Условное форматирование Excel 2007 - как получить цвет ячейки? - PullRequest
12 голосов
/ 15 июня 2009

Давайте предположим, что у меня есть следующий диапазон от (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 но это не говорит о том, что это зеленый, почему? Пожалуйста, вы можете мне помочь?

Range ("A1"). Interior.Color всегда возвращает 16777215 Range ("A1"). Interior.ColorIndex всегда возвращает -4142

(независимо от того, является ли цвет А1 красным, синим, зеленым, ...)

Диапазон («A1», «C3»). FormatConditions.Count этот всегда возвращает 0, почему?

Ответы [ 7 ]

10 голосов
/ 15 июня 2009

.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!"
6 голосов
/ 23 сентября 2011

Вам нужно обратиться к <Cell>.FormatConditions(index that is active).Interior.ColorIndex, чтобы получить цвет условного форматирования ячейки.

Вы можете обратиться к ссылке ниже для примера:

http://www.xldynamic.com/source/xld.CFConditions.html#specific

3 голосов
/ 17 июня 2009

В продолжение @richardtallent (извините, я не смог сделать комментарии), следующая ссылка предоставит вам функцию, которая возвращает вам индекс цвета, оценивая условное форматирование для вас.

http://www.bettersolutions.com/excel/EPX299/LI041931911.htm

0 голосов
/ 18 июня 2009

, поскольку у меня может быть более трех разных цветов за раз ... я не нашел хорошего способа справиться с этим с помощью цветов условного форматирования по умолчанию ... я сделал это так затем всякий раз, когда я спрашиваю цвет ячейки, я получаю правильный цвет!

 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 - это Color [], который содержит различные цвета для каждого отдельного значения! этот код можно легко перевести на vb!

0 голосов
/ 15 июня 2009

Похоже, что цвет «Условный формат» доступен программно. Что бы я предложил, вместо этого вы пишете небольшую функцию, которая вычисляет цвет ячейки, а затем просто устанавливаете макрос для запуска его в активной ячейке всякий раз, когда вы редактируете значение. Например (извините за псевдо-код - я больше не эксперт по 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, это позволит выполнить то же самое, и вы сможете прочитать цвет из кода. имеет ли это смысл?

0 голосов
/ 15 июня 2009

Чтобы получить цвет ячейки в диапазоне, вам нужно сослаться на отдельную ячейку внутри массива в виде диапазона («А1», «С3»). Ячейки (1,1) (для ячейки А1) , Справка по Excel очень хороша, если вы посмотрите название свойства, с которым у вас проблемы.

Кроме того, Excel 2007 использует целочисленные значения для своих типов цвета, поэтому лучше всего назначить целочисленный индекс цвета и использовать его во всей программе. Для вашего примера попробуйте:

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 (сплошной цвет), и оно может быть установлено на что-то другое, если цвет не меняется.

0 голосов
/ 15 июня 2009

Согласно Перечисление XlColorIndex ColorIndex=-4142 означает Нет цвета

Что касается того, почему это происходит, я не знаю. Возвращаемое значение представляется десятичным представлением значения RGB. Улучшенная версия этого скрипта для расшифровки значения в шестнадцатеричном формате 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...