Попробуйте заменить весь ваш код следующим:
Dim newCondition As FormatCondition 'Red text if Sheet1 cell doesn't match Sheet2 cell.
Dim conditionFormula As String 'Formula for the format condition
' Compare each cell using indirect addressing of the current row and column. Result is
' true if the sheet cells don't match, false if they do.
conditionFormula = "=(INDIRECT(ADDRESS(ROW(),COLUMN(),1,1,""Sheet1"")) <>" & _
" INDIRECT(ADDRESS(ROW(),COLUMN(),1,1,""Sheet2"")))"
' Create the condition and get a pointer to it.
Set newCondition = Range("A1:S200").FormatConditions.Add( _
Type:=xlExpression, _
Formula1:=conditionFormula)
' Add the formatting, priority, stop rule to the condition.
With newCondition
.SetFirstPriority
With .Font
.Color = -16776961 ' Red
.TintAndShade = 0
End With
.StopIfTrue = False
End With
' Clear the pointer
Set newCondition = Nothing
Естественно, объявление строки conditionFormula
необязательно, но мне нравится писать код, который легко прочитать и понять позже.У меня было слишком много раз, когда я возвращался позже и задавался вопросом, что # @% * &!Я пытался сделать.
Обратите внимание, что вы могли бы использовать ActiveSheet.UsedRange
вместо Range("A1:S200")
.Это гарантирует, что вы всегда получите все ячейки с данными.
Наконец, я не полностью определил метод Range()
в моем коде.Поэтому Excel будет угадывать, какой лист вы хотите использовать.Возможно, было бы лучше уточнить, о какой книге и листе вы говорите.Так, например, когда вы создаете новую книгу, сделайте что-то вроде этого:
Dim newWorkbook As Workbook
Set newWorkbook = Workbooks.Open(.... whatever you do here...)
Затем вы можете заменить Range("A1:S200")
на
newWorkbook.Worksheets(1).Range("A1:S200")
или даже
newWorkbook.Worksheets(1).UsedRange
Надеюсь, все это поможет.Извините за длину.