Существует ли альтернативный способ зафиксировать значение ячейки (запретить внесение изменений) кроме выставление параметров защиты листа? В каком случае это необходимо?
К вопросу прикладываю файл. В нем в столбцах D, F, H с помощью макроса автоматически проставляется время, при внесении значения в соседнюю слева ячейку.
Если эти столбцы с помощью параметров "Защитить лист" сделать защищенными, то макрос проставления времени будет работать некорректно и проставлять время в другие столбцы.
Нужен альтернативный способ запретить изменения значений этих столбцов, после того как макрос проставил в них время.
Спасибо. Надеюсь это поможет другим пользователям тоже.
P.S. Макрос на проставление времени следующий (возможно в нем как раз и стоит прописать запрет на изменение/удаление значений):
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Intersect(Me.UsedRange, Me.[C:C,E:E,G:G], Target) Is Nothing Then Exit Sub Target.Next = IIf(Target = "", "", Now) End Sub
[/vba]
Существует ли альтернативный способ зафиксировать значение ячейки (запретить внесение изменений) кроме выставление параметров защиты листа? В каком случае это необходимо?
К вопросу прикладываю файл. В нем в столбцах D, F, H с помощью макроса автоматически проставляется время, при внесении значения в соседнюю слева ячейку.
Если эти столбцы с помощью параметров "Защитить лист" сделать защищенными, то макрос проставления времени будет работать некорректно и проставлять время в другие столбцы.
Нужен альтернативный способ запретить изменения значений этих столбцов, после того как макрос проставил в них время.
Спасибо. Надеюсь это поможет другим пользователям тоже.
P.S. Макрос на проставление времени следующий (возможно в нем как раз и стоит прописать запрет на изменение/удаление значений):
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub If Intersect(Me.UsedRange, Me.[C:C,E:E,G:G], Target) Is Nothing Then Exit Sub Target.Next = IIf(Target = "", "", Now) End Sub
Здесь нет однозначного ответа. 1. Если макросом нужно изменять защищённые ячейки - можно макросом снять защиту, изменить ячейку, вернуть защиту. 2. Можно проанализировать изменяемый диапазон - и если он входит в контролируемый, то сделать undo (в случае ручного изменения ячеек). 3. ну вероятно можно придумать ещё что-то, в зависимости от задачи.
Но лучше делать по первому варианту - запишите рекордером снятие и установку защиты, используйте полученный код.
Здесь нет однозначного ответа. 1. Если макросом нужно изменять защищённые ячейки - можно макросом снять защиту, изменить ячейку, вернуть защиту. 2. Можно проанализировать изменяемый диапазон - и если он входит в контролируемый, то сделать undo (в случае ручного изменения ячеек). 3. ну вероятно можно придумать ещё что-то, в зависимости от задачи.
Но лучше делать по первому варианту - запишите рекордером снятие и установку защиты, используйте полученный код.Hugo
Вероятно, я произвел впечатление человека, который хорошо разбирается в возможностях Excel и работе с макросами VBA.
Однако, к сожалению, я просто обезьяна, которой дали готовый макрос и она его радостно использует. Поэтому я буду крайне признателен, если кто-нибудь поможет решить эту небольшую проблемку языком, более доступным для представителя отряда приматов. Возможно, я не один такой.
Hugo, спасибо за оперативный ответ.
Вероятно, я произвел впечатление человека, который хорошо разбирается в возможностях Excel и работе с макросами VBA.
Однако, к сожалению, я просто обезьяна, которой дали готовый макрос и она его радостно использует. Поэтому я буду крайне признателен, если кто-нибудь поможет решить эту небольшую проблемку языком, более доступным для представителя отряда приматов. Возможно, я не один такой.
Private Sub Worksheet_Change(ByVal Target As Range) Me.Unprotect ' снять защиту листа Dim rRng As Range: Set rRng = Me.[C:C,E:E,G:G] ' так просто удобнее, чтобы диапазон можно было задавать и изменять в одном месте Me.Cells.Locked = False ' сделать все ячейки листа не защищаемыми rRng.Offset(, 1).Locked = True ' сделать ячейки столбцов правее rRng защищаемыми If Target.Count > 1 Then Exit Sub If Intersect(Me.UsedRange, rRng, Target) Is Nothing Then Exit Sub Target.Next = IIf(Target = "", "", Now) Me.Protect Contents:=True ' защитить лист End Sub
[/vba](было немного свободного времени, расписал с комментариями "более доступным языком")
Ну, вот так, например, попробуйте:[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Me.Unprotect ' снять защиту листа Dim rRng As Range: Set rRng = Me.[C:C,E:E,G:G] ' так просто удобнее, чтобы диапазон можно было задавать и изменять в одном месте Me.Cells.Locked = False ' сделать все ячейки листа не защищаемыми rRng.Offset(, 1).Locked = True ' сделать ячейки столбцов правее rRng защищаемыми If Target.Count > 1 Then Exit Sub If Intersect(Me.UsedRange, rRng, Target) Is Nothing Then Exit Sub Target.Next = IIf(Target = "", "", Now) Me.Protect Contents:=True ' защитить лист End Sub
[/vba](было немного свободного времени, расписал с комментариями "более доступным языком")Alex_ST
Alex_ST, спасибо, таким образом это работает для защиты данных столбцов. Однако, в таком случае я не учел одну вещь в своем вопросе. Помимо защиты столбцов, где проставляется время (которые благодаря этому макросу теперь защищены), у меня на листе стоит еще защита множества других диапазонов ячеек, чтобы пользователь не мог их случайно удалить-изменить. И при использовании макроса, который ты написал, защита с других ячеек слетает. Возможно ли ее как то учесть в коде?
Alex_ST, спасибо, таким образом это работает для защиты данных столбцов. Однако, в таком случае я не учел одну вещь в своем вопросе. Помимо защиты столбцов, где проставляется время (которые благодаря этому макросу теперь защищены), у меня на листе стоит еще защита множества других диапазонов ячеек, чтобы пользователь не мог их случайно удалить-изменить. И при использовании макроса, который ты написал, защита с других ячеек слетает. Возможно ли ее как то учесть в коде?balancea
Ну я же специально комментарии написал поподробнее … А мозги включить трудно? Я-то старался научить, а Вы, оказывается, за готовым решением пришли Ну уж ладно... Назвался клизмой, полезай в … [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Me.Unprotect ' снять защиту листа If Target.Count > 1 Then Exit Sub If Intersect(Me.UsedRange, Me.[C:C,E:E,G:G], Target) Is Nothing Then Exit Sub Target.Next = IIf(Target = "", "", Now) Me.Protect Contents:=True ' защитить лист End Sub
[/vba]
Ну я же специально комментарии написал поподробнее … А мозги включить трудно? Я-то старался научить, а Вы, оказывается, за готовым решением пришли Ну уж ладно... Назвался клизмой, полезай в … [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Me.Unprotect ' снять защиту листа If Target.Count > 1 Then Exit Sub If Intersect(Me.UsedRange, Me.[C:C,E:E,G:G], Target) Is Nothing Then Exit Sub Target.Next = IIf(Target = "", "", Now) Me.Protect Contents:=True ' защитить лист End Sub