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

Чтобы настроить точку останова:

breakpointObserver.observe(['(min-width: 500px)'])
10
задан Community 23 May 2017 в 12:31
поделиться

2 ответа

Если я пойму вопрос правильно, то Вы будете тем, защищающим лист. Если это так, можно использовать следующий VBA:

myWorksheet.Protect contents:=True, userinterfaceonly:=True

Ключевая роль здесь "userinterfaceonly: = верный". Когда рабочий лист защищен с этим набором флага, макросы VBA все еще позволяются внести изменения.

Поместите этот код в WorkBook_Activate событие, чтобы автоматически защитить рабочую книгу и установить флаг каждый раз, когда это активируется.

Править: Благодаря Lance Roberts для его рекомендации использовать 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. Они прошли почти такие же шаги и пришли к тому же заключению. По крайней мере, Вы не являетесь одними!

12
ответ дан 3 December 2019 в 23:15
поделиться

я не уверен, является ли это универсальным решением, но когда у меня недавно была эта ошибка, я просто должен был сделать MywkSheet. Активироваться прямо, прежде чем я сделал Проверку. Добавить. Так:

' 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 уже был прочь, таким образом, пользователь никогда не видит, что листы переключаются назад и вперед. HTH.

2
ответ дан 3 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: