Всем привет и с Наступающим! Нашёл в Сети макрос, позволяющий организовать защиту только тех ячеек, которые содержат формулы. При этом, добавление/удаление строк и столбцов, например, не блокируется. Макрос полностью устраивает за исключением одного нюанса: при выделении группы ячеек в любой области листа, для вставки или удаления данных, выскакивает вот такая ошибка,
Реальная таблица намного имеет намного больше строк, и зачастую требуется вставлять наименования и цены копипастом. Подскажите, пожалуйста, как исправить?
Пример прилагаю.
Всем привет и с Наступающим! Нашёл в Сети макрос, позволяющий организовать защиту только тех ячеек, которые содержат формулы. При этом, добавление/удаление строк и столбцов, например, не блокируется. Макрос полностью устраивает за исключением одного нюанса: при выделении группы ячеек в любой области листа, для вставки или удаления данных, выскакивает вот такая ошибка,
Реальная таблица намного имеет намного больше строк, и зачастую требуется вставлять наименования и цены копипастом. Подскажите, пожалуйста, как исправить?
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Application.ScreenUpdating = False Application.Calculation = xlCalculateManual Me.Unprotect Password:="123": Me.EnableOutlining = True For Each d_ In Target If d_.Locked Then Me.Protect Password:="123", Contents:=True, Scenarios:=True, UserInterfaceOnly:=True, AllowFiltering:=True: GoTo A Next d_ A: Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub
[/vba]
Так нужно? [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Application.ScreenUpdating = False Application.Calculation = xlCalculateManual Me.Unprotect Password:="123": Me.EnableOutlining = True For Each d_ In Target If d_.Locked Then Me.Protect Password:="123", Contents:=True, Scenarios:=True, UserInterfaceOnly:=True, AllowFiltering:=True: GoTo A Next d_ A: Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub
А, Вы вот про что! Я просто не совсем понял, что Вы делаете для того, чтобы такая ошибка вылезла. Ну да ладно, неважно. Просто напишите перед этой строкой пропуск ошибки [vba]
Код
On Error Resume Next
[/vba]
А, Вы вот про что! Я просто не совсем понял, что Вы делаете для того, чтобы такая ошибка вылезла. Ну да ладно, неважно. Просто напишите перед этой строкой пропуск ошибки [vba]
А ещё вопрос вдогонку: при добавлении или удалении строк макрос не отрабатывает сразу, то есть, до того, как дважды щёлкнешь на любую ячейку - формулы остаются без защиты...это из-за привязки макроса к Worksheet_SelectionChange?
Александр, спасибо! Как всё просто оказалось!
А ещё вопрос вдогонку: при добавлении или удалении строк макрос не отрабатывает сразу, то есть, до того, как дважды щёлкнешь на любую ячейку - формулы остаются без защиты...это из-за привязки макроса к Worksheet_SelectionChange?Xpert
А может быть проще защищать формулы не защитой листа, а проверкой данных? Типа такого:[vba]
Код
Sub Formula_Protect_with_CellValidation() If ActiveWindow.RangeSelection.SpecialCells(xlCellTypeFormulas) Is Nothing Then Exit Sub ActiveWindow.RangeSelection.SpecialCells(xlCellTypeFormulas).Select With Selection.Validation .Delete .Add Type:=xlValidateCustom, Formula1:="=""""" .ErrorTitle = "В ячейке формула!": .ErrorMessage = "Ввод данных запрещён" & vbCrLf & "Нажмите ""ОТМЕНА""" .ShowError = True End With End Sub
А может быть проще защищать формулы не защитой листа, а проверкой данных? Типа такого:[vba]
Код
Sub Formula_Protect_with_CellValidation() If ActiveWindow.RangeSelection.SpecialCells(xlCellTypeFormulas) Is Nothing Then Exit Sub ActiveWindow.RangeSelection.SpecialCells(xlCellTypeFormulas).Select With Selection.Validation .Delete .Add Type:=xlValidateCustom, Formula1:="=""""" .ErrorTitle = "В ячейке формула!": .ErrorMessage = "Ввод данных запрещён" & vbCrLf & "Нажмите ""ОТМЕНА""" .ShowError = True End With End Sub