Условное форматирование документа Excel через VB6 (проблема с перезаписью форматов)

Я создаю документ Excel во время выполнения, который имеет набор значений, которые я хотел бы условно отформатировать. Выполняя различные попытки с нуля, а также используя / изменяя код, выводимый из средства записи макросов Excel, у меня возникает постоянная проблема, связанная с перезаписью форматирования.

Я опубликовал фрагмент кода ниже и могу сказать, что я тестировал, чтобы убедиться, что мои диапазоны выбора действительны и подходят для того, что я хочу условно отформатировать. Есть некоторое совпадение, но что странно, так это то, что первый условный формат принимает только одно свойство второго условного формата. Значение D5: в конце рабочего листа отображается шрифт зеленого цвета, а не красный, которым он должен быть. Комментирование каждого раздела кода позволяет им работать независимо, но я предполагаю, что это проблема с дальнейшим указанием условных форматов? Я пробовал несколько разных сценариев, и ниже приведен код с изменениями:

РЕДАКТИРОВАТЬ (обновленный код):

'First conditional format, check sheet for values > 50 and make text red.
With xl.range("D5:" & theLastColumn & lastRow)
  .FormatConditions.add Type:=xlCellValue, Operator:=xlGreater, Formula1:="=50"
  With .FormatConditions(1).Font
    .Color = -16383844
    .TintAndShade = 0
  End With
  .FormatConditions(1).StopIfTrue = False
End With


'Second conditional format, check specific row (row 5 in the example) 
'for values > 40, and fill interior with green in addition to dark green text.
With xl.range("D" & Infectivity & ":" & theLastColumn & Infectivity)
  .FormatConditions.add Type:=xlCellValue, Operator:=xlGreater, Formula1:="=40"
  With .FormatConditions(2).Font
    .Color = -16752384
    .TintAndShade = 0
  End With
  With .FormatConditions(2).Interior
    .PatternColorIndex = xlAutomatic
    .Color = 13561798
    .TintAndShade = 0
  End With
End With

Итак, как лучше всего иметь несколько условных форматов (которые могут перекрывать диапазоны) и при этом все они будут работать так, как задумано? Я так много пробовал отлаживать это, я уверен, что есть кое-что, что я упускаю. Я также пробовал несколько разных методов, чтобы указать отдельные условия форматирования (1) и условия форматирования (2), но по-прежнему получаю странные проблемы.

РЕДАКТИРОВАТЬ:

Код VBA, в котором у меня по-прежнему возникает та же проблема.

Sub conditionalFormat()
  With Range("D5:BA9")
    .FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, Formula1:="=50"
    .FormatConditions(.FormatConditions.Count).SetFirstPriority
    With .FormatConditions(1).Font
      .Color = -16383844
      .TintAndShade = 0
    End With
    .FormatConditions(1).StopIfTrue = False
  End With

  With Range("D9:BA9")
    .FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, Formula1:="=40"
    With .FormatConditions(2).Font
      .Color = -16752384
      .TintAndShade = 0
    End With
    With .FormatConditions(2).Interior
      .PatternColorIndex = xlAutomatic
      .Color = 13561798
      .TintAndShade = 0
    End With
    .FormatConditions(2).StopIfTrue = False
  End With    
End Sub

Даже с SetFirstPriority в соответствующем условном формате (красный текст) он просто каким-то образом перезаписывается. Я что-то упустил?


person Bernard    schedule 04.10.2013    source источник
comment
Я пытаюсь это понять. Вы можете мне помочь, приведя пример. Скажем, первый диапазон равен A1:G1, а второй диапазон - D1:J1, поэтому есть перекрытие на D1:G1. Так чего вы ждете?   -  person Siddharth Rout    schedule 04.10.2013
comment
Я просто получаю много смешанных результатов, когда область, которая не перекрывается, по-прежнему получает странное условное форматирование, связанное со вторым условным форматом. Извините, это немного сложно понять, но я попробую макетировать пример в своем исходном посте.   -  person Bernard    schedule 04.10.2013
comment
Да, условное форматирование может быть PIA, если с ним не обращаться должным образом ... Будем ждать вашего примера.   -  person Siddharth Rout    schedule 04.10.2013
comment
Я провожу дополнительное тестирование, чтобы понять, могу ли я понять, почему только часть форматирования из одного условного формата применяется в другом месте. Это немного расстраивает, когда вы имеете дело с чем-то таким простым, как цвет шрифта (и у вас не хватает красного / зеленого цвета). Тем не менее, спасибо за готовность помочь @SiddharthRout. Надеюсь на вашу помощь.   -  person Bernard    schedule 04.10.2013
comment
На всякий случай .. Какую версию excel вы используете?   -  person Siddharth Rout    schedule 04.10.2013
comment
Excel 2007. Следует упомянуть, что в 2007 году я читал несколько смешанных вещей о цветах (в основном, об использовании значений RGB). Используя значения RGB, я все еще получаю те же результаты.   -  person Bernard    schedule 04.10.2013
comment
Должно быть что-то странное происходит с тем, как vb6 ссылается на условные форматы. У меня мои форматы отлично работали в редакторе VBA, но при его переносе кажется, что все идет наперекосяк. В худшем случае я смогу найти способ ввести код VB в файл Excel и таким образом запустить макрос. Конечно, нежелательно ...   -  person Bernard    schedule 04.10.2013
comment
подождите :) Обо всем по порядку ... Вы выполняете позднюю или раннюю привязку с Excel из vb6?   -  person Siddharth Rout    schedule 04.10.2013
comment
Использование позднего связывания ... будет ли раннее связывание лучше подходить для этого типа условного форматирования?   -  person Bernard    schedule 04.10.2013
comment
в этом случае вы определили константы xlCellValue, xlGreater, xlAutomatic, xlThemeColorAccent3?   -  person Siddharth Rout    schedule 04.10.2013
comment
Приношу свои извинения ... мы использовали позднее связывание в этой форме, но теперь оно было переключено на раннее связывание.   -  person Bernard    schedule 04.10.2013
comment
Вы уверены, что это раннее связывание? Если нет, то см. Правку в моем сообщении   -  person Siddharth Rout    schedule 04.10.2013
comment
Да, меня по-прежнему сбивает с толку раннее связывание. Большое спасибо за постоянную помощь @SiddharthRout. Не могу передать, насколько я это ценю.   -  person Bernard    schedule 04.10.2013
comment
Хорошо, текущий код vba, который у вас есть, работает?   -  person Siddharth Rout    schedule 04.10.2013
comment
При тестировании кода с помощью редактора макросов я обнаружил ту же проблему. Я обновлю свой пост еще раз с кодом VBA, который в настоящее время не работает.   -  person Bernard    schedule 04.10.2013
comment
Вы тестировали мой код?   -  person Siddharth Rout    schedule 04.10.2013
comment
позвольте нам продолжить обсуждение в чате   -  person Siddharth Rout    schedule 04.10.2013


Ответы (2)


Извините. У меня нет Excel 2007. Проверял в Excel 2010.

Когда дело доходит до условного форматирования, вы должны быть очень осторожны с тем, что выдает макрос записи. Это частный случай, когда код запутывается.

Также вы устанавливаете второе правило как .SetFirstPriority, что неверно, кроме того, что второе правило запускается, несмотря на rule 1 удовлетворение :)

Вот очень простой пример. Допустим, мой диапазон выглядит так D5:G7

введите описание изображения здесь

Это код VBA, который я тестировал.

Sub Sample()
    Dim ws As Worksheet
    Dim rng As Range

    Set ws = ThisWorkbook.Sheets("Sheet1")
    Set rng = ws.Range("D5:G7")

    With rng
        .FormatConditions.Add Type:=xlCellValue, _
        Operator:=xlGreater, Formula1:="=50"
        .FormatConditions(.FormatConditions.Count).SetFirstPriority
        With .FormatConditions(1).Font
            .Color = -16776961
            .TintAndShade = 0
        End With
        .FormatConditions(1).StopIfTrue = True

        .FormatConditions.Add Type:=xlCellValue, _
        Operator:=xlGreater, Formula1:="=40"
        With .FormatConditions(2).Font
            .Color = -11489280
            .TintAndShade = 0
        End With
        With .FormatConditions(2).Interior
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorAccent3
            .TintAndShade = 0.599963377788629
        End With
    End With
End Sub

И вот результат, который я получил.

введите описание изображения здесь

Я уверен, что вам будет очень легко перенести приведенный выше код на vb6.

FOLOWUP (из комментариев)

Использование позднего связывания ... будет ли раннее связывание лучше подходить для этого типа условного форматирования? - Бернард 2 минуты назад

Если вы используете LateBinding, объявите этот код в верхней части кода.

Const xlCellValue as Long = 1
Const xlGreater as Long = 5
Const xlAutomatic as Long = -4105
Const xlThemeColorAccent3 as Long = 7
person Siddharth Rout    schedule 04.10.2013
comment
Я собираюсь отредактировать свой исходный пост с помощью обновленного кода, который я использую, но все еще имею ту же проблему. Каким-то образом первый условный формат (применяемый к D5: конец листа) использует зеленый текст вместо красного. Это как-то связано со вторым форматом (несмотря на то, что он не входит в этот диапазон). Комментирование выделения / форматирования второго диапазона позволяет правильно отображать красный текст. А комментирование первого выбора / форматирования диапазона позволяет второму условному формату работать правильно. Они просто плохо ладят друг с другом вместе. - person Bernard; 04.10.2013
comment
см. мой комментарий в вашем посте. - person Siddharth Rout; 04.10.2013

После долгих размышлений и переделки кода мы пришли к выводу, что то, что я делал (несколько перекрывающихся условий), было причиной неоднозначных результатов. На простейшем уровне я смог добавить .FormatConditions.Delete к моим дополнительным условным форматам, чтобы обеспечить применение только одного формата.

Исправленный окончательный код показан ниже:

Dim Infectivity As Long
Infectivity = Application.WorksheetFunction.match("Infectivity", range("A1:" & "A" & lastRow), 0)

With xl.range("D5:" & theLastColumn & lastRow)
    .FormatConditions.add Type:=xlCellValue, Operator:=xlGreater, _
    Formula1:="=50"
    .FormatConditions(.FormatConditions.count).SetFirstPriority
With .FormatConditions(1).Font
    .Color = -16383844
    .TintAndShade = 0
End With

    .FormatConditions(1).StopIfTrue = False
End With

If Infectivity > 0 Then
With xl.range("D" & Infectivity & ":" & theLastColumn & Infectivity)
    .FormatConditions.Delete
    .FormatConditions.add Type:=xlCellValue, Operator:=xlGreater, _
     Formula1:="=40"
With .FormatConditions(1).Font
    .Color = -16752384
    .TintAndShade = 0
End With
With .FormatConditions(1).Interior
    .PatternColorIndex = xlAutomatic
    .Color = 13561798
    .TintAndShade = 0
End With
.FormatConditions(1).StopIfTrue = False
End With
End If

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

Большое спасибо Сиддхарту Рауту за помощь.

person Bernard    schedule 04.10.2013