1

Я написал две VBA подпрограммы:Ошибка при проверке необязательный атрибут условного формата в VBA

1) Чтобы установить условное форматирование (с оператором, Formula1 и Formula2 как опция)

Sub setConditionalFormatting(sheetName As String, cellRange As String, CFcellColor As String, CFfontColor As String, CFtype As XlFormatConditionType, Optional CFoperator As Variant, Optional CFformula1 As Variant, Optional CFformula2 As Variant) 
On Error GoTo Errhandler 
    Dim sheet As Worksheet 
    Dim cell As range 
    Set sheet = Sheets(sheetName) 
    sheet.Select 
    Set cell = range(cellRange) 
    cell.Select 
    'user defined sub to print string in a file 
    Call OutputString("Setting Conditional Formatting...") 

    With cell.FormatConditions.Add(_ 
     Type:=CFtype, _ 
     Operator:=CFoperator, _ 
     Formula1:=CFformula1, _ 
     Formula2:=CFformula2) 

     .Interior.color = CFcellColor 
     .Font.color = CFfontColor 
    End With 

    Call OutputString("Conditional Formatting successfully applied") 
Exit Sub 
Errhandler: 
    'a sub for error handling task 
    Call ErrorHandler(Err) 
    Exit Sub 
End Sub 

2) для проверки условного форматирования (CF) над листом и печать атрибутов для каждого CF:

Sub checkConditionalFormattingsOnSheet(sheetName As String, rng As String) 
On Error GoTo Errhandler 
    Dim cellRange As range 
    Dim i As Integer 
    Dim temp As Variant 
    Sheets(sheetName).Select 

    Set cellRange = range(rng) 
    cellRange.Select 

    If cellRange.FormatConditions.Count > 0 Then 
     Call OutputString("Conditional formatting (CF) in sheet " + sheetName + ":") 
     For i = 1 To cellRange.FormatConditions.Count 
      Call OutputString(CStr(i) + ") Conditional Formatting-") 
      Call OutputString("Interior Color: " + CStr(cellRange.FormatConditions(i).Interior.color)) 
      Call OutputString("Font Color: " + CStr(cellRange.FormatConditions(i).Font.color)) 
      Call OutputString("CF Type: " + CStr(cellRange.FormatConditions(i).Type)) 

      If IsMissing(cellRange.FormatConditions(i).Operator) Then 
       Call OutputString("CF Operator: Not Applicable") 
      Else 
       Call OutputString("CF Operator: " + CStr(cellRange.FormatConditions(i).Operator)) 
      End If 

      Call OutputString("Formula1: " + CStr(cellRange.FormatConditions(i).Formula1)) 

      If IsMissing(cellRange.FormatConditions(i).Formula2) Then 
       Call OutputString("CF Formula2: Not Applicable") 
      Else 
       Call OutputString("Formula2: " + CStr(cellRange.FormatConditions(i).Formula2)) 
      End If 
     Next i 
    ElseIf cellRange.FormatConditions.Count = 0 Then 
     Call OutputString("No conditional formatting found in sheet " + sheetName) 
    End If 

Exit Sub 
Errhandler: 
    Call ErrorHandler(Err) 
    Exit Sub 
End Sub 

Теперь, когда я хочу установить условный формат, скажем, «Клетку со значением Greate г чем 2 должен иметь ячейки окрашенные в RGB (198, 239, 206) и шрифт как RGB (255, 255, 0)», сделав вызов функции

'PS: I am not parameterizing Optional value- Formula2 here 
Call setConditionalFormatting("MyWrkSheet", "C5:N13", RGB(198, 239, 206), RGB(255, 255, 0), xlCellValue, xlGreater, "=2") 

я получаю ошибку при If IsMissing(cellRange.FormatConditions(i).Formula2) в checkConditionalFormattingsOnSheet:

Ошибка: приложения или объект определенной ошибки HelpContext: 1000095, ErrorID: 1004

Я пробовал другие варианты, такие как 'ничего', 'IsNull()' и попутные параметры Формула2 как ничто и нуль соответственно, но не имели при удаче!

Спасибо за ваше время и терпение в Advance! :)

+0

PS: Я знаю, один из вариантов может быть использовать значение по умолчанию, но я искал другие варианты, как это не очень хорошая практика, чтобы использовать значения по умолчанию в качестве параметров. – Rishi

+1

Вы должны получить 1004 ошибку, а не 91 ошибку, если попытаетесь проверить 'Формула2', когда это не подходит. – Rory

+0

Да, вы были правы @Rory, это действительно 1004 ошибка, а не 91 ошибка, как вы указали. Эта ошибка 91 была бы вызвана неправильной линией, которую я случайно добавил при отладке. Теперь у меня возникло ощущение, что ваш следующий комментарий к этой теме будет содержать решение моей проблемы :) – Rishi

ответ

1

В соответствии с MS Documentation.Formula2 «Используется только при условии, что условный формат проверки данных имеет свойство оператора xlBetween или xlNotBetween».

Поэтому, предположим, вы должны проверить свойство .Operator, прежде чем пытаться получить доступ к .Formula2.

Что-то вроде ...

If cellRange.FormatConditions(i).Operator = xlBetween or celRange.FormatConditions(i).Operator = xlNotBetween Then 
    If IsMissing(cellRange.FormatConditions(i).Formula2) Then 
     Call OutputString("CF Formula2: Not Applicable") 
    Else 
     Call OutputString("Formula2: " + CStr(cellRange.FormatConditions(i).Formula2)) 
    End If 
End If 
+0

Извините, я не обновил его здесь о том, что я сделал наконец. Btws, да, вы правы. Фактически, я использовал одно и то же условие, и только тогда я печатаю Формулу 2. На самом деле, я также проверяю, является ли мое условие format (i) .type xlexpression или xlCellValue и, соответственно, я проверяю условия форматирования (i) .Operator. – Rishi