Я хочу мешать другим редактировать содержание ячейки в моем листе Excel с помощью VBA. Действительно ли возможно сделать это?
Сначала вы можете выбрать ячейки, которые вы не хотите защищать (чтобы они были доступны пользователю), установив для них статус Locked в False:
Worksheets("Sheet1").Range("B2:C3").Locked = False
Затем вы можете защитить лист, и все остальные ячейки будут защищены. Код, позволяющий сделать это, но при этом позволяющий вашему коду VBA изменять ячейки, следующий:
Worksheets("Sheet1").Protect UserInterfaceOnly:=True
или
Call Worksheets("Sheet1").Protect(UserInterfaceOnly:=True)
Попробуйте использовать метод Worksheet.Protect
, например итак:
Sub ProtectActiveSheet()
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Protect DrawingObjects:=True, Contents:=True, _
Scenarios:=True, Password="SamplePassword"
End Sub
Вы должны, однако, позаботиться о включении пароля в ваш код VBA. Вам не обязательно нужен пароль, если вы просто пытаетесь установить простой барьер, который удерживает пользователя от мелких ошибок, таких как удаление формул и т. Д.
Кроме того, если вы хотите узнать, как делать определенные вещи в VBA в Excel, попробуйте записать макрос и посмотреть код, который он генерирует. Это хороший способ начать работу с VBA.
Sub LockCells()
Range("A1:A1").Select
Selection.Locked = True
Selection.FormulaHidden = False
ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= False, AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows:=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
End Sub
Вы также можете сделать это на уровне рабочего листа, зафиксированном в событии изменения рабочего листа. Если это лучше соответствует вашим потребностям. Позволяет динамическую блокировку на основе значений, критериев и т. Д.
Private Sub Worksheet_Change(ByVal Target As Range)
'set your criteria here
If Target.Column = 1 Then
'must disable events if you change the sheet as it will
'continually trigger the change event
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
MsgBox "You cannot do that!"
End If
End Sub