Присоединяюсь к выводам в сообщении #21, "но истина дороже". Проблема актуальна, так как фантазия пользователей при заполнении регламентированных форм безгранична.
Код из сообщения #20 проблему не решает. Доказательство - в условиях сообщения #1 записываем в модуль текущего листа рабочей книги указанный код и выполняем следующую (типичную) последовательность действий:
1. Выделяем на текущем листе ячейку N1
2. Переходим на другой лист, выделяем две (или более) непустые последовательные ячейки в одной строке и набираем Ctrl+Ins
3. Возвращаемся на исходный лист и набираем Shift+Ins. Информация попадает в "охраняемый" столбец "O".
Хотелось бы верить, что нижеуказанный код решает проблему лучше (вставлять в модуль листа):
Код |
---|
Option Explicit
Dim c As Range ' выделенная ячейка в контролируемом диапазоне ячеек
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range, nerr As Long
Set r = GetIS(Target)
If r Is Nothing Then ' изменения не касаются контролируемого диапазона
Exit Sub
End If
If c Is Nothing Then
nerr = 1 ' ранее не была выделена ячейка контролируемого диапазона
ElseIf Target.Count > 1 Then
nerr = 2 ' в контролируемом диапазоне можно менять строго по одной ячейке
ElseIf Target.Validation.Value = False Then
nerr = 3 ' занесено значение, противоречащее условиям проверки
ElseIf Target.HasFormula Then
nerr = 4 ' занесена формула
End If
If nerr > 0 Then
MsgBox "Диапазон ячеек " & Target.Address & " изменен недопустимым образом", vbExclamation
With Application
.EnableEvents = False
On Error Resume Next: .Undo: On Error GoTo 0
.EnableEvents = True
End With
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set c = Nothing
If Not GetIS(Target) Is Nothing Then
If Target.Count = 1 Then Set c = Target: Application.CutCopyMode = False
End If
End Sub
' Возвращает пересечение target и контролируемого диапазона
Private Function GetIS(Target As Range) As Range
Set GetIS = Intersect(Target, Me.Columns("O:R")) ' контролируемый диапазон задавать здесь
End Function
|