В экселе можно защитить один или несколько диапазонов от изменений стандартными средствами "разрешить изменение диапазонов"/"защитить лист" 1. это средство защищает весь лист, позволяя оставлять "окна" (бреши) в защите для разреш§нных действий пользователя 2. этот способ защищает диапазоны не только от пользователей, но и от макросов
Однако, возникают ситуации, когда надо защитить не весь лист, а только определенный диапазон (или несколько диапазонов), и при этом оставить возможность макросам изменять содержимое ячеек защищаемых диапазонов.
Борода подсказал несколько вариантов защиты ячейки (ячеек) от изменения.
Защита одной строки (первой) [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row <> 1 Then Exit Sub ' проверяем, что фокус не на первой строке - значит можно редактировать и выходим If [A2] = "$$$" Then Exit Sub ' проверяем, что "пароль" $$$ введен в специально отведëнную для этого ячейку - значит можно редактировать и выходим Target.Offset(1).Select ' уводим фокус с защищаемой строки End Sub
[/vba] тоже самое можно сделать со столбцом, заменив [A2] на В1, например
Защита одной ячейки (А1) [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address(0, 0) <> "A1" Then Exit Sub If [A2] = "$$$" Then Exit Sub Target.Offset(1).Select End Sub
[/vba]
хотелось бы получить код в общем виде для подобной защиты
1.1. на несколько строк/столбцов идущих подряд 1.2. на несколько строк/столбцов разбросанных по листу 2. на несколько диапазонов (самый общий случай)
вот что-то такое хотелось бы [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Range <> (Range("D9")+Range("1:3")+Range("N:P")+ Range("С4:С9")+ Range("F4:F9")+ Range("K4:K9")) Then Exit Sub If [A4] = "$$$" Then Exit Sub Target.Offset(1).Select End Sub
[/vba]
где "+" - это логическое ИЛИ, а запись носит условный, поясняющий характер
помогите, пожалуйста
Здравствуйте!
В экселе можно защитить один или несколько диапазонов от изменений стандартными средствами "разрешить изменение диапазонов"/"защитить лист" 1. это средство защищает весь лист, позволяя оставлять "окна" (бреши) в защите для разреш§нных действий пользователя 2. этот способ защищает диапазоны не только от пользователей, но и от макросов
Однако, возникают ситуации, когда надо защитить не весь лист, а только определенный диапазон (или несколько диапазонов), и при этом оставить возможность макросам изменять содержимое ячеек защищаемых диапазонов.
Борода подсказал несколько вариантов защиты ячейки (ячеек) от изменения.
Защита одной строки (первой) [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row <> 1 Then Exit Sub ' проверяем, что фокус не на первой строке - значит можно редактировать и выходим If [A2] = "$$$" Then Exit Sub ' проверяем, что "пароль" $$$ введен в специально отведëнную для этого ячейку - значит можно редактировать и выходим Target.Offset(1).Select ' уводим фокус с защищаемой строки End Sub
[/vba] тоже самое можно сделать со столбцом, заменив [A2] на В1, например
Защита одной ячейки (А1) [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address(0, 0) <> "A1" Then Exit Sub If [A2] = "$$$" Then Exit Sub Target.Offset(1).Select End Sub
[/vba]
хотелось бы получить код в общем виде для подобной защиты
1.1. на несколько строк/столбцов идущих подряд 1.2. на несколько строк/столбцов разбросанных по листу 2. на несколько диапазонов (самый общий случай)
вот что-то такое хотелось бы [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Range <> (Range("D9")+Range("1:3")+Range("N:P")+ Range("С4:С9")+ Range("F4:F9")+ Range("K4:K9")) Then Exit Sub If [A4] = "$$$" Then Exit Sub Target.Offset(1).Select End Sub
[/vba]
где "+" - это логическое ИЛИ, а запись носит условный, поясняющий характер
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Intersect(Target, Range("D9,1:3,N:P,C4:C9,F4:F9,K4:K9")) Is Nothing Then Exit Sub If [A4] = "$$$" Then Exit Sub Range("A5").Select End Sub
[/vba] См.Файл.
Код [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Intersect(Target, Range("D9,1:3,N:P,C4:C9,F4:F9,K4:K9")) Is Nothing Then Exit Sub If [A4] = "$$$" Then Exit Sub Range("A5").Select End Sub