Если я правильно понимаю вопрос, вы будете тем, кто защищает лист. Если это так, вы можете использовать следующий VBA:
myWorksheet.Protect contents:=True, userinterfaceonly:=True
Ключевая часть здесь "userinterfaceonly: = true". Когда лист защищен с помощью этого установленного флага, макросам VBA по-прежнему разрешено вносить изменения.
Поместите этот код в событие WorkBook_Activate
, чтобы автоматически защитить рабочую книгу и установить флаг, когда она активируется.
Редактировать: Спасибо Лэнсу Робертсу за его рекомендацию использовать Workbook_Activate
вместо Workbook_Open
.
Редактировать: Поскольку вышеприведенное, похоже, не сработало, вам, возможно, придется обернуть ошибочную часть кода VBA командами снятия защиты / защиты. Если вы сделаете это, я бы также обернул весь макрос обработчиком ошибок, чтобы лист не остался незащищенным после ошибки:
Sub MyMacro
On Error Goto HandleError
...
myWorksheet.unprotect
With ModifyCell.Validation
...
End With
myWorksheet.protect contents:=True, userinterfaceonly:=True
...
Goto SkipErrorHandler
HandleError:
myWorksheet.protect contents:=True, userinterfaceonly:=True
... some code to present the error message to the user
SkipErrorHandler:
End Sub
Редактировать: Посмотрите на эту ветку на PCreview. Они прошли почти одинаковые шаги и пришли к одному и тому же выводу. По крайней мере, вы не одиноки!