Как избежать ошибок во время выполнения, когда лист защищен в MS-Excel? - PullRequest
10 голосов
/ 15 января 2009

Приведенный ниже фрагмент кода изменяет состояние проверки данных ячейки и запускается, когда рабочая таблица Excel-2003 не защищена. Однако, когда я защищаю рабочий лист, макрос не запускается и выдает ошибку времени выполнения

Ошибка времени выполнения '-2147417848 (80010108)':

Метод 'Добавить' объекта 'Проверка' не удался

Я попытался обернуть код

Me.unprotect
...
Me.protect

Но это не работает должным образом. Итак, как я могу изменить приведенный ниже код, чтобы он работал (то есть, чтобы код изменял проверку разблокированной ячейки), когда лист защищен без вышеуказанной ошибки времени выполнения?

Обновление

Моя оригинальная рабочая книга - Excel 2003. Я тестировал решение @ eJames в Excel 2007 со следующим определением для Workbook_Open

Sub WorkBook_Open()
    Me.Worksheets("MainTable").Protect  contents:=True, userinterfaceonly:=True 
End Sub

Код все еще не работает со следующей ошибкой во время выполнения, когда лист защищен

Ошибка времени выполнения «1004»: Ошибка приложения или объекта

Спасибо, Азим


Фрагмент кода

'cell to add drop down validation list'
dim myNamedRange as String
dim modifyCell as Range 
modifyCell = ActiveCell.Offset(0,1) 


' set list values based on some conditions not defined for brevitity'
If myCondition then
   myNamedRange = "range1"
Else
   myNamedRange = "range2"
End If

With modifyCell.Validation
   .Delete

   'Run time error occurs on the next line'
   .Add Type:=xlValidateList, AlertStyle:=xlValidAltertStop, _
        Operator:=xlBetween, Formula1:="=" & myNamedRange

   ... 
   ' skipping more property setting code '
   ...
End With

Ответы [ 2 ]

12 голосов
/ 15 января 2009

Если я правильно понимаю вопрос, вы будете тем, кто защищает лист. Если это так, вы можете использовать следующий 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. Они прошли почти одинаковые шаги и пришли к одному и тому же выводу. По крайней мере, вы не одиноки!

2 голосов
/ 14 января 2010

Я не уверен, является ли это универсальным решением, но когда у меня недавно была эта ошибка, мне просто нужно было выполнить MywkSheet.Activate прямо перед тем, как я сделал Validation.Add. Итак:

' set list values based on some conditions not defined for brevitity'
If myCondition then
   myNamedRange = "range1"
Else
   myNamedRange = "range2"
End If

''--------------------------------------------------
Sheets("mysheet").Activate
''--------------------------------------------------

With modifyCell.Validation
   .Delete

   'Run time error occurs on the next line'
   .Add Type:=xlValidateList, AlertStyle:=xlValidAltertStop, _
        Operator:=xlBetween, Formula1:="=" & myNamedRange

   ... 
   ' skipping more property setting code '
   ...
End With

в моем случае ScreenUpdating уже отключен, поэтому пользователь никогда не видит, как листы переключаются назад и вперед. НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...