Макрос, который проверяет орфографию листа и затем блокирует его, не стирая правила - PullRequest
0 голосов
/ 08 февраля 2019

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

Я пытался перечислитьправила после .Protect Password, но это не работает.

Sub ProtectSheetCheckSpellCheck()
'Update by Extendoffice 2018/11/2
Dim xRg As Range
On Error Resume Next
Application.ScreenUpdating = False
    With ActiveSheet
        .Unprotect ("Password123")
        Set xRg = .UsedRange
        xRg.CheckSpelling
        .Protect Password:="Password123", AllowInsertingRows:=True, AllowInsertingColumns:=True
    End With
Application.ScreenUpdating = True
End Sub

1 Ответ

0 голосов
/ 08 февраля 2019

То, что вы ищете, - это возможность изменить ваш рабочий лист, фактически не снимая его.Вы можете защитить лист, но позволить VBA вносить изменения, пока пользователь не может:

ActiveSheet.Protect UserInterfaceOnly:=True

https://docs.microsoft.com/en-us/office/vba/api/excel.worksheet.protect

Имя: UserInterfaceOnly

Описание: True для защиты пользовательского интерфейса, но не макросов.Если этот аргумент пропущен, защита применяется как к макросам, так и к пользовательскому интерфейсу.

Предполагается, что параметр был установлен в значение True, когда лист был защищен в первую очередь.


В качестве альтернативы вы можете сохранить статус текущих настроек защиты в объекте Protection:

Dim myProtection as Protection Set myProtection = ActiveSheet.Protection

Что будет выглядеть так: Обратите внимание, что по некоторым причинам .AllowEditRanges возвращаетошибка при чтении, поэтому я не включил ее в список.

Sub test()

    'Pick your Worksheet
    Dim mySheet As Worksheet
    Set mySheet = ActiveSheet

    'Unprotect it
    Dim myProtection As Protection
    Set myProtection = mySheet.Protection
    mySheet.Unprotect

    'Do your VBA things

    'Re Protect it
    With myProtection

        mySheet.Protect AllowFormattingCells:=.AllowFormattingCells, _
                        AllowFormattingColumns:=.AllowFormattingColumns, _
                        AllowFormattingRows:=.AllowFormattingRows, _
                        AllowInsertingColumns:=.AllowInsertingColumns, _
                        AllowInsertingRows:=.AllowInsertingRows, _
                        AllowInsertingHyperlinks:=.AllowInsertingHyperlinks, _
                        AllowDeletingColumns:=.AllowDeletingColumns, _
                        AllowDeletingRows:=.AllowDeletingRows, _
                        AllowSorting:=.AllowSorting, _
                        AllowFiltering:=.AllowFiltering, _
                        AllowUsingPivotTables:=.AllowUsingPivotTables

    End With

End Sub

Примечание: .Protect включает в себя [DrawingObjects], [Scenarios] и [USerInterfaceOnly], хотя эти настройки не предоставляются Protection объект.Я понимаю, что параметр [Contents] должен относиться к .AllowEditRanges, но поскольку к нему нельзя получить доступ, думаю, он тоже будет пропущен,

...