Защита условного форматирования (Microsoft Excel)
У Киса есть рабочий лист, в котором широко используется условное форматирование.
Однако условное форматирование продолжает сбиваться, когда пользователи копируют и вставляют информацию или когда они используют перетаскивание для редактирования рабочего листа. Он задается вопросом, как лучше этого избежать.
Это происходит потому, что условное форматирование считается именно форматированием. Стандартное копирование и вставка (или редактирование перетаскиванием)
копирует все, включая форматирование. Это означает, что целевые ячейки будут иметь форматирование исходных ячеек, а не форматирование целевых ячеек (включая любое условное форматирование, которое могло быть в целевых ячейках).
Тогда ответ — сказать пользователям не делать стандартное копирование и вставку.
Вместо этого они должны использовать параметры вставки, чтобы вставить что-нибудь (или все), кроме форматирования.
Другой вариант, конечно же, — защитить рабочий лист, чтобы пользователь не мог ничего копировать и вставлять. Однако это может быть немного критичным для ваших пользователей, поскольку вы можете захотеть, чтобы они внесли изменения. (Вы просто не хотите, чтобы они испортили условное форматирование.)
Это приводит к макро-подходу. Если вы можете записать макрос, который применяет условное форматирование к ячейкам, вы можете создать несколько дополнительных макросов, которые при необходимости применяют этот записанный макрос. Например, допустим, что записываемый вами макрос называется чем-то коротким и сексуальным, например SetCondFormat.
Затем войдите в редактор Visual Basic и в окне «Немедленное» введите следующее:
? Cells.SpecialCells(xlCellTypeAllFormatConditions).Address
Предполагая, что у вас настроено условное форматирование, это должно вернуть строку — возможно, длинную строку, — которая показывает адреса ячеек и диапазонов, использующих условное форматирование. Это будет выглядеть примерно так:
$B$3:$B$50,$D$3:$D$50,$G$3:$I$20
Затем добавьте следующий макрос в модуль кода ThisWorksheet:
Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Range Const cCFAddress = "$B$3:$B$50,$D$3:$D$50,$G$3:$I$20" On Error Resume Next Set r = Range(cCFAddress) On Error GoTo 0 If r IsNot Nothing Then If Application.Intersect(Target, r) IsNot Nothing Then SetCondFormat End If End If End Sub
Главное здесь — убедиться, что константа cCFAddress установлена равной тому, что было возвращено, когда вы видели адреса в окне Immediate. (Если вы измените условное форматирование позже, вы можете снова использовать трюк с немедленным окном и просто изменить строку в приведенном выше макросе.)
Макрос выполняется каждый раз при изменении рабочего листа. Он проверяет, является ли измененный адрес (переданный в переменной Target) частью исходных ячеек, содержащих условные форматы. Если это так, то ваш SetCondFormat (тот, который вы записали для условного форматирования) снова выполняется.
ExcelTips — ваш источник экономичного обучения Microsoft Excel.
Этот совет (4362) применим к Microsoft Excel 2007, 2010, 2013 и 2016.