2017-01-06 1 views
0

Я искал сайт по этому вопросу, и, хотя один вопрос был задан об этом, ответы были неудовлетворительными для меня, так как проблема, о которой сообщал ОП, не была непосредственно обращается. Вместо этого были предложены обходные пути, которые избежали проблемы, а не объясняли, почему код не будет работать.Проблема с использованием записанного макроса, который содержит инструкции для условного форматирования

Итак, здесь я пробую свою версию.

У меня есть таблица, в которой уже есть определенные условные форматы. В частности, для столбцов U и V применяются два условных формата. Теперь я хочу применить новый условный формат ко всему соответствующему диапазону данных, и это включает в себя то, что находится в столбцах U и V.

Я записал следующий макрос, который работал нормально во время его записи. Однако запуск макроса сам по себе вызывает ошибку. Это макрос в вопрос:

Sub Macro13() 
' 
' Macro13 Macro 
' 

' 
    Range("A1").Select 
    Range(Selection, Selection.End(xlToRight)).Select 
    Range(Selection, Selection.End(xlDown)).Select 
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$C1<>$C2" 
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority 
    With Selection.FormatConditions(1).Borders(xlBottom) 
     .LineStyle = xlContinuous 
     .TintAndShade = 0 
     .Weight = xlThin 
    End With 
    Selection.FormatConditions(1).StopIfTrue = False 
End Sub 

макросъемки дословно, то есть, это именно так, как Excel производится его.

Ошибка «Невозможно установить свойство LineStyle класса Border» встречается в строке .LineStyle = xlContinuous.

Может кто-нибудь помочь мне понять, почему это работает, когда я записываю его, но не когда я его запускаю? Как я могу изменить его так, чтобы он работал правильно?

Я использую Excel 2007 на компьютере под управлением Windows 7 Professional.

UPDATE Если я вставить строку «Selection.FormatConditions.Delete» в коде, например так:

Sub Macro13() 
' 
' Macro13 Macro 
' 

' 
    Range("A1").Select 
    Range(Selection, Selection.End(xlToRight)).Select 
    Range(Selection, Selection.End(xlDown)).Select 

    Selection.FormatConditions.Delete <-----------Added here 

    Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$C1<>$C2" 
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority 
    With Selection.FormatConditions(1).Borders(xlBottom) 
     .LineStyle = xlContinuous 
     .TintAndShade = 0 
     .Weight = xlThin 
    End With 
    Selection.FormatConditions(1).StopIfTrue = False 
End Sub 

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

+0

Попробуйте удалить три строки, которые начинаются с '.', поскольку это настройки по умолчанию? – CJC

+1

Я не могу заставить его выбросить ошибку. Он работает для меня даже при существующем форматировании. –

+0

Я не могу получить сообщение об ошибке при запуске этого кода; однако у меня есть мысль, почему это может не сработать ... при нажатии F8 (в VBA) каждая часть кода будет выполняться индивидуально. Вы видите, что что-то происходит непосредственно перед ошибкой, которая может сбросить ориентацию «выбора»? Что такое ошибка, которая появляется? – Cyril

ответ

0

См. Приведенный ниже код для пояснения. Также см. this link о том, как избежать использования Select - что-то, что известно о макрорекордере!

Sub AddFormatting() 

    ' Create a range object so Select isn't needed, use the same xlToRight and xlDown methods though 

    Dim myRange As Range 

    With ActiveSheet 
     Set myRange = .Range(.Range("A1"), .Range("A1").End(xlToRight).End(xlDown)) 
    End With 

    ' Note you may not want to use the above method, as it formats the whole document if there is nothing in row 1!! 
    ' You could remove the above With block and consider using instead: 
    ' Set myRange = ActivesSheet.UsedRange 

    ' Add a new Format Condition 
    myRange.FormatConditions.Add Type:=xlExpression, Formula1:="=$C1<>$C2" 

    ' Make it the first Format Condition (Macro recorder's default) 
    ' Note you may not want this priority order in your conditional formats! 
    ' For now though, it makes referencing the format simpler as it's now FormatConditions(1) 

    myRange.FormatConditions(myRange.FormatConditions.Count).SetFirstPriority 

    With myRange.FormatConditions(1).Borders(xlBottom) 
     .LineStyle = xlContinuous 
     .TintAndShade = 0 
     .Weight = xlThin 
    End With 

    ' Again, this is excel's default but may not be what you want, look up StopIfTrue 
    myRange.FormatConditions(1).StopIfTrue = False 

End Sub 

Заключительное примечание:

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

Надеюсь, это поможет.

Смежные вопросы