|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
10.01.2010, 20:59 | #1 |
Пользователь
Регистрация: 04.10.2009
Сообщений: 27
|
Как заблокировать ввод данных в ячейки?
Есть таблица, в которой надо не позволить пользователю изменять данные в некоторых ячейках.
Проблема в том, что в этой таблице часть столбцов и строк группируются, а если просто сделать ячейки защищаемыми, то после защиты листа эту команду (показать - скрыть) использовать нельзя. |
10.01.2010, 22:57 | #2 |
Участник клуба
Регистрация: 15.12.2009
Сообщений: 1,448
|
Никак. Только макросом, который будет снимать/ставить защиту при попытке отобразить/скрыть группировку.
Бесплатная помощь: www.excelworld.ru
Платная помощь: serge_007.planetaexcel@mail.ru https://yoomoney.ru: 41001419691823 |
10.01.2010, 23:42 | #3 |
Пользователь
Регистрация: 04.10.2009
Сообщений: 27
|
В принципе, эта задача решалась здесь в теме http://programmersforum.ru/showthread.php?t=76078
Там предлагался, в частности, следующий код: Dim ЗапрещённыйДиапазон As Range Private Sub Worksheet_Activate() Set ЗапрещённыйДиапазон = [a2, b3:b52,f4:g18] ' здесь можно редактировать список ячеек Dim cell As Range For Each cell In ЗапрещённыйДиапазон.Cells: cell.ID = cell.Value: Next cell End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Count = 1 Then If Not Intersect(Target, ЗапрещённыйДиапазон) Is Nothing Then Target.Value = Target.ID End If End If End Sub У меня этот код выдаёт ошибку. К тому же при активации листа много времени уходит на сохранение всех значений ячеек запрещённого диапазона (их в таблице несколько тысяч). А нельзя это сделать проще? При смене активной ячейки (Sub Worksheet_SelectionChange) её значение присваивать какой-нибудь переменной, а при попытке изменения значения активной ячейки (Sub Worksheet_Change) возвращать ей значение той переменной? В Delphi я бы это сделал на раз, а в VBA не получается ни хрена... |
10.01.2010, 23:50 | #4 |
Участник клуба
Регистрация: 28.06.2009
Сообщений: 1,950
|
Может, попробовать просто при активации запрещенной ячейки перемещать курсор на другую?
|
11.01.2010, 00:03 | #5 | |
Пользователь
Регистрация: 04.10.2009
Сообщений: 27
|
Цитата:
А нельзя в VBA как-то задать перехват нажатия клавиш? Мышкой пользователь пусть гуляет свободно, а нажатия на цифры и буквы блокировать? |
|
11.01.2010, 00:24 | #6 |
Пользователь
Регистрация: 04.10.2009
Сообщений: 27
|
В принципе, сделал.
Dim sVal As String Private Sub Worksheet_Activate() bWrite = False sVal = ActiveCell.Value End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Not bWrite Then Target.Value = sVal End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) bWrite = False sVal = ActiveCell.Value End Sub bWrite - переменная в главном модуле. Public bWrite As Boolean Она нужна, чтобы позволить сделать программную запись данных в таблицу из другой таблицы. Когда bWrite = true, запись возможна. |
11.01.2010, 05:04 | #7 | |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
Цитата:
Чем шире угол зрения, тем он тупее.
|
|
11.01.2010, 17:43 | #8 |
Пользователь
Регистрация: 04.10.2009
Сообщений: 27
|
2 SAS888: Спасибо.
Но. Чего бы мне хотелось в идеале. У таблицы цветом выделены некоторые столбцы. Пользователю я говорю, что вводить данные он может только в ячейки, которые я оставил без цвета. При этом сам пользователь волен закрасить свои ячейки (не закрашенные мной), так что вариант проверки ячеек по цвету тоже не проходит. Важно то, что я пометил ячейки, в которые пользователь не должен ничего вводить. Если он попытается что-то ввести, то должно появляться окошко с напоминанием о том, что сюда ничего вводить не нужно. Наверно, это нужно делать при помощи хука, но с хуками я пока не разобрался. Разберусь - напишу. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Запретить ввод данных в ячейки | valerij | Microsoft Office Excel | 21 | 03.09.2015 17:30 |
Как в C++ организовать ввод данных в одну строчку? | amdbodia | Общие вопросы C/C++ | 10 | 16.05.2009 18:03 |
Как заблокировать сменные устройства хранения данных? | Air | Win Api | 8 | 01.12.2007 20:08 |
как заблокировать ввод букв в StringGrid? | LeoN | Общие вопросы Delphi | 1 | 05.10.2007 08:09 |
как узнать с какого устройства идет ввод данных | keg | Win Api | 5 | 20.07.2007 10:50 |