Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2010, 20:59   #1
parsn
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 27
По умолчанию Как заблокировать ввод данных в ячейки?

Есть таблица, в которой надо не позволить пользователю изменять данные в некоторых ячейках.
Проблема в том, что в этой таблице часть столбцов и строк группируются, а если просто сделать ячейки защищаемыми, то после защиты листа эту команду (показать - скрыть) использовать нельзя.
parsn вне форума Ответить с цитированием
Старый 10.01.2010, 22:57   #2
Serge 007
Участник клуба
 
Аватар для Serge 007
 
Регистрация: 15.12.2009
Сообщений: 1,448
По умолчанию

Никак. Только макросом, который будет снимать/ставить защиту при попытке отобразить/скрыть группировку.
Бесплатная помощь: www.excelworld.ru
Платная помощь: serge_007.planetaexcel@mail.ru
https://yoomoney.ru: 41001419691823
Serge 007 вне форума Ответить с цитированием
Старый 10.01.2010, 23:42   #3
parsn
Пользователь
 
Регистрация: 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 не получается ни хрена...
parsn вне форума Ответить с цитированием
Старый 10.01.2010, 23:50   #4
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Может, попробовать просто при активации запрещенной ячейки перемещать курсор на другую?
motorway вне форума Ответить с цитированием
Старый 11.01.2010, 00:03   #5
parsn
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 27
По умолчанию

Цитата:
Сообщение от motorway Посмотреть сообщение
Может, попробовать просто при активации запрещенной ячейки перемещать курсор на другую?
Другая тоже запрещена. К тому же активация ячеек в этой таблице передаёт в другую таблицу номер активной строки.

А нельзя в VBA как-то задать перехват нажатия клавиш? Мышкой пользователь пусть гуляет свободно, а нажатия на цифры и буквы блокировать?
parsn вне форума Ответить с цитированием
Старый 11.01.2010, 00:24   #6
parsn
Пользователь
 
Регистрация: 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, запись возможна.
parsn вне форума Ответить с цитированием
Старый 11.01.2010, 05:04   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
если просто сделать ячейки защищаемыми, то после защиты листа эту команду (показать - скрыть) использовать нельзя.
Это не так. Посмотрите вложение, в котором диапазон ячеек "A3:A10" защищен от изменений при помощи защиты листа. При этом работает группировка, а также макрос ( в отличии от пользователя) может изменять содержимое защищенных ячеек.
Вложения
Тип файла: rar Книга1.rar (6.4 Кб, 70 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 11.01.2010, 17:43   #8
parsn
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 27
По умолчанию

2 SAS888: Спасибо.

Но. Чего бы мне хотелось в идеале.
У таблицы цветом выделены некоторые столбцы. Пользователю я говорю, что вводить данные он может только в ячейки, которые я оставил без цвета. При этом сам пользователь волен закрасить свои ячейки (не закрашенные мной), так что вариант проверки ячеек по цвету тоже не проходит.
Важно то, что я пометил ячейки, в которые пользователь не должен ничего вводить. Если он попытается что-то ввести, то должно появляться окошко с напоминанием о том, что сюда ничего вводить не нужно.
Наверно, это нужно делать при помощи хука, но с хуками я пока не разобрался. Разберусь - напишу.
parsn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запретить ввод данных в ячейки 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