У Киса есть рабочий лист, в котором широко используется условное форматирование.

Однако условное форматирование продолжает сбиваться, когда пользователи копируют и вставляют информацию или когда они используют перетаскивание для редактирования рабочего листа. Он задается вопросом, как лучше этого избежать.

Это происходит потому, что условное форматирование считается именно форматированием. Стандартное копирование и вставка (или редактирование перетаскиванием)

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

Тогда ответ — сказать пользователям не делать стандартное копирование и вставку.

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

Другой вариант, конечно же, — защитить рабочий лист, чтобы пользователь не мог ничего копировать и вставлять. Однако это может быть немного критичным для ваших пользователей, поскольку вы можете захотеть, чтобы они внесли изменения. (Вы просто не хотите, чтобы они испортили условное форматирование.)

Это приводит к макро-подходу. Если вы можете записать макрос, который применяет условное форматирование к ячейкам, вы можете создать несколько дополнительных макросов, которые при необходимости применяют этот записанный макрос. Например, допустим, что записываемый вами макрос называется чем-то коротким и сексуальным, например 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.