powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Защита защищенных ячеек в Excel
7 сообщений из 7, страница 1 из 1
Защита защищенных ячеек в Excel
    #32713663
IDj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IDj
Гость
Короче, нужно, например, чтоб в ячейки столбца A пользователь мог ввести только целочисленные значения, в ячейки столбца B только действительные положительные и т.п.
Для этого я использую стандартную тройку возможностей Excel "Форматы ячеек"+"Данные\Проверка вводимых значений"+"Защита листов". И это прекрасно работает, когда пользователь заполняет ячейки через клавиатуру.
Но, все идет на смарку, когда пользователь заполняет ячейку вставкой из буфера, при этом в целочисленную ячейку он запросто может ввести строковое значение и вообще просто похерить формат ячейки.

МОЖЕТ ЭТО ОЧЕРЕДНАЯ ГЛУПАЯ НЕДОДЕЛКА EXCEL? Просто когда устанавливаешь защиту листа, форматы ячеек Excel-ем блокируются, но они элементарно изменяются копированием через буфер.

Вопрос такой: как сделать так, чтоб пользователь мог ввести в ячеку только то значение, которое разрешается (целочисленое, положительное, текстовое, из списка)?
У кого какие идеи?
...
Рейтинг: 0 / 0
Защита защищенных ячеек в Excel
    #32713791
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И действительно !!!

Не помню, скрижалей, в которых это записано и сказано - как бороться…


Как будто работает такой вариант:


1) Присвоить для клетки с установленной проверкой значения имя уровня рабочей книги - PROBLEM
2) Завести еще одну клетку (например на скрытом листе) с установленной проверкой значения ТОЧНО ТАКОЙ ЖЕ, как и для целевой отображаемой клетки. Присвоить ей тоже именованный диапазон - TESTRANGE
3) В модуле класса листа ввести примерно такой код:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
Option Explicit

 'локальный адрес целевой клетки на листе 
Private tAddress As String
 'целевой валидатор 
Private tVal As Validation

 'валидатор по которому будем восстанавливать целевой в случае разрушения (образцовый валидатор) 
Private testRV As Validation

 'последнее допустимое значение целевой клетки 
Private prevGoodValue As Variant


Private Sub Worksheet_Activate()
 'эта процедура сработает при выборе листа, на котором расположена целевая клетка 
 'Может быть это надо вместе с переменными 
 'и методами доступа вынести на уровень рабочей книги, например, на открытие книги. 
 ' 

 'так можно было бы переопределять клавиатуру, но это не спасает от мыши 
   'Application.OnKey "+{INSERT}", "MyKeyProc" 
   'Application.OnKey "^v", "MyKeyProc2" 
  
    With Range("PROBLEM")
      'целевой валидатор 
      Set tVal = .Validation
        'адрес 
       tAddress = Range("PROBLEM").Address
        'образцовый валидатор 
       Set testRV = Range("TESTRANGE").Validation
       'текущее значение целевой клетки, в предположении, что оно "допустимое" 
       prevGoodValue = .Value
     End With
  
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
 'здесь оказываемся при любом изменении, которое прорвалось сквозь  
 'валидацию (включая её разрушение)  

 If Target.Address = tAddress Then
    Dim strMess As String
    Dim ErrFlag As Boolean
    
    On Error Resume Next
     'пытаемся обратиться к свойству, которое должно дать ошибку 
     'в случае порчи валидатора. 
     'Возможно умнее обращаться к Formula1 
     'т.к. ErrorMessage, вообще говоря, необязан быть определен. 
    strMess = tVal.ErrorMessage
    
    If Err.Number <>  0  Then
     ' сюда попадаем, когда валидатор разрушен 
      'восстанавливаем валидатор по образцу 
      With tVal
        .Delete
        .Add testRV.Type, testRV.AlertStyle, testRV.Operator, testRV.Formula1, testRV.Formula2
        .ErrorMessage = testRV.ErrorMessage
        .InCellDropdown = testRV.InCellDropdown
        .InputMessage = testRV.InputMessage
        .InputTitle = testRV.InputTitle
        .ShowInput = .ShowInput
        .ShowError = .ShowError
        .ErrorTitle = .ErrorTitle
        .IgnoreBlank = .IgnoreBlank
      End With
      Err.Clear
       'Установим флаг "отмены изменений" 
      ErrFlag = True
    
    Else
       'валидатор цел, но, возможно, не сработал 
       'Установим флаг "отмены изменений" 
       ErrFlag = Not tVal.Value
    End If
    
     'отменим изменения или запомним последнее пригодное к использованию значение 
     ' 
    If ErrFlag Then
      Target.Value = prevGoodValue
      MsgBox "Отмена вставки значения: " & testRV.ErrorMessage
    Else
      prevGoodValue = Target.Value
    End If
  End If
End Sub


ЗЫ1
Может кто придумает что получше…




(с выражением лица)
...
Рейтинг: 0 / 0
Защита защищенных ячеек в Excel
    #32714622
IDj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IDj
Гость
Спасибо за хороший ответ.

НО! У этого варианта есть серьезные минусы:
1) Этот код рекурсивен. Т.е. Изменение ячейки внутри Worksheet_Change вызовет последующий запуск Worksheet_Change и так до бесконечности.
2) Требует наличия дубликатов ячеек и при таком количестве разных ячеек, которые используются в моем проекте, я на 80% запутаюсь при синхронизации валидаторов.
3) Такой подход требует "ручного" (полного прописывания в макросе) исправления всех параметров ячейки включая цвет, границы, параметры защиты, примечания из TESTRANGE т.п. Не мудрено что тут могут возникнуть новые ошибки при выполнении.
4) Замедляет и без того нагруженные в моем проекте, обработчики событий.
5) Не совместим с "Условным форматированием", т.е. если УФ включить, не будет работать эта проверка.
6) Эту проверку легко можно обойти, если не включать макросы (хотя это для меня не существенно), сохранить и заново запустить но с включенными макросами.
...
Рейтинг: 0 / 0
Защита защищенных ячеек в Excel
    #32714635
IDj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IDj
Гость
Спасибо за хороший ответ.

НО! У этого варианта есть серьезные минусы:
1) Этот код рекурсивен. Т.е. Изменение ячейки внутри Worksheet_Change вызовет последующий запуск Worksheet_Change и так до бесконечности.
2) Требует наличия дубликатов ячеек и при таком количестве разных ячеек, которые используются в моем проекте, я на 80% запутаюсь при синхронизации валидаторов.
3) Такой подход требует "ручного" (полного прописывания в макросе) исправления всех параметров ячейки включая цвет, границы, параметры защиты, примечания из TESTRANGE т.п. Не мудрено что тут могут возникнуть новые ошибки при выполнении.
4) Замедляет и без того нагруженные в моем проекте, обработчики событий.
5) Не совместим с "Условным форматированием", т.е. если УФ включить, не будет работать эта проверка.
6) Эту проверку легко можно обойти, если не включать макросы (хотя это для меня не существенно), сохранить и заново запустить но с включенными макросами.
...
Рейтинг: 0 / 0
Защита защищенных ячеек в Excel
    #32714771
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDjСпасибо за хороший ответ.

НО! У этого варианта есть серьезные минусы:
1) Этот код рекурсивен. Т.е. Изменение ячейки внутри Worksheet_Change вызовет последующий запуск Worksheet_Change и так до бесконечности.


Это Вам спасибо - за хороший вопрос - размял неплохо. Для меня его информативность достаточна для получения удовольствия.

про бесконечность - это слишком. Бесконечности здесь нет - все кончается "вторым вызовом".

Все остальные замечания, наверно, справедливы. Что-то не проверял (
"роль условного форматирования"), что-то частично может быть компенсировано "планированием" ( 2) и 3) ).

Клавиатурную вставку из буфера (Ctrl-v,Shift-Insert) легко отменить - там показано в комментариях как.
С мышью, возможно умнее обходиться не этим кодом, а манипуляциями с с запретом/разрешением элементов меню/контекстных меню/панелей/тулбаров

Тот код, что был показан - сообразил за час. В манипуляции с элементами управления не стал ввязываться - за час не сваял бы точно.

зато другой теперь точно сделает лучше. И, может быть, даже покажет
Итого(результат).
:))
...
Рейтинг: 0 / 0
Защита защищенных ячеек в Excel
    #32714849
IDj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IDj
Гость
Victosha
про бесконечность - это слишком. Бесконечности здесь нет - все кончается "вторым вызовом".


Действительно. Как то не подумал.

Victosha
Клавиатурную вставку из буфера (Ctrl-v,Shift-Insert) легко отменить - там показано в комментариях как.
С мышью, возможно умнее обходиться не этим кодом, а манипуляциями с с запретом/разрешением элементов меню/контекстных меню/панелей/тулбаров


Тоже выход. Но он относится больше к крайним мерам. Просто тогда я должен буду лишить пользователя возможности стандартного копирования/вставки и предложить свои "кнопки" и соответствено дополнительно повесить на них обработчики проверки значений по ячейкам.
Т.о. преимущества быстрой разработки на Excel постепенно сходят на нет. В результате я все больше прихожу к тому, что проще было сделать свое приложение не на Excel, а например на Delphi+Access.

Неужели на такую стандартную проблему в Excel не предусмотрено стандартных решений?
...
Рейтинг: 0 / 0
Защита защищенных ячеек в Excel
    #33068965
Leonard117
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще-то, в хелпе написано, что проверки не выполняются при вставке из буфера или если в ячейку помещается результат работы макроса.
Посмотрите этот вопрос на схожую тему
http://www.sql.ru/forum/actualthread.aspx?tid=184411
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Защита защищенных ячеек в Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]