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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2011, 17:57   #1
clever77
Пользователь
 
Регистрация: 13.04.2011
Сообщений: 58
По умолчанию Ограничение на ввод значений в ячейку макросом. Как учесть особенности?

Здравствуй, всяк сюда заглянувший. Помоги, пожалуйста, разобраться.
Вопросы:
1. Не знаю, как поймать вводимое значение, на экране оно уже сменилось (после нажатия кнопки Enter), а по факту ячейке еще не присвоилось (т.к. не прошло проверку).
2. Можно ли как то учесть в макросе особенности?
Суть проблемы:
Есть макрос, который ограничивает тип вводимых данных в опр. диапазон ячеек (В данном примере диапазон ячеек (N5:N10), а вводимые значения могут быть только целые числа от 2 до 10):
Sub Проверка_значений_ввода()
' Проверка_значений_ввода Макрос
Range("N5:N10").Select
With Selection.Validation
.Delete
.Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertWarning, _
Operator:=xlBetween, Formula1:="2", Formula2:="10"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = "Только целые числа"
.ErrorTitle = "Это не целое число"
.InputMessage = "от 2 до 10"
.ErrorMessage = "Только от 2 до 10. "
.ShowInput = True
.ShowError = True
End With
End Sub
Мне бы хотелось сделать более информативным сообщение об ошибке –т.е. указать пользователю, что та информация которую он ввел не является целым числом. Меняю строку .ErrorMessage:
.ErrorMessage = "Только от 2 до 10. Ну разве это ("") похоже на целое число от 2 до 10?"
Вместо - ""- получить непосредственно то, что ввел пользователь. Допустим, введен текст – Вечер-
Тогда
.ErrorMessage = "Только от 2 до 10. Ну разве это (Вечер) похоже на целое число от 2 до 10?"
И тут у меня проблема
1. Если исп. адрес активной ячейки:
.ErrorMessage = "Только от 2 до 10. Ну разве это ("& Cells(ActiveCell.Row, ActiveCell.Column) &") похоже на целое число от 2 до 10?"
, то выдает ноль, т.е "0"
2. Если исп. & Cells(5,14) &, то выдает предыдущее значение (т.е. значение ячейки, которое было до того момента как пользователь ввел новые)
Пусть Cells(5,14) было 123, запускаем макрос и вводим новое значение «текст» Получаем: 123
.ErrorMessage = "Только от 2 до 10. Ну разве это (123) похоже на целое число от 2 до 10?"
, а надо «текст».
Хотя в момент выдачи сообщения об ошибке на экране монитора в активной ячейке значение сменилось на «текст»
Не знаю, как поймать вводимое значение, на экране оно уже сменилось (после нажатия кнопки Enter), а по факту ячейке еще не присвоилось (т.к. не прошло проверку).
Подмечена интересная особенность:
Шаг первый:
Пусть макрос защищает ячейку N5, а в M5 “текст”, то присвоить ячейке N5 значение M5 (т.е в N5 записать =M5) НЕЛЬЗЯ
Шаг второй:
Однако если в М5 число удовлетворяющее условию то МОЖНО.
1 особенность: после второго шага в М5 можно писать все что угодно и ячейке N5 присвоиться все, что Вы ввели в М5 БЕЗ ОГРАНИЧЕНИЯ.
2 особенность: В защищаемую ячейку всегда можно вставить любые данные из буфера обмена, даже если они не удовлетворяют условию.
Можно ли как то учесть в макросе и эти особенности?
clever77 вне форума Ответить с цитированием
Старый 22.05.2011, 18:12   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я думаю, код нужно строить на событии изменения значения ячейки, а не на проверке данных.
Тогда можно всё сделать - и проверку любую, и сообщения, и стереть введённое кодом, если оно не соответствует требованиям. И вставка из буфера тоже отлавливается.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 22.05.2011, 19:04   #3
clever77
Пользователь
 
Регистрация: 13.04.2011
Сообщений: 58
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Я думаю, код нужно строить на событии изменения значения ячейки, а не на проверке данных.
Тогда можно всё сделать - и проверку любую, и сообщения, и стереть введённое кодом, если оно не соответствует требованиям. И вставка из буфера тоже отлавливается.

Пока так все и работает.... Позволяю вводить все что угодно, а потом преобразую введенные данные к соотв типу и значению.
Просто увидел, что можно ограничить ввод, показалось интересным. Покрутил по разному данную конструкцию и понял, что есть ньюансы.

Думал может кто уже нашел решение.............

Да и любопытство осталось..... Где находится введенное значение с момента нажатия Enter и до момента прохождения проверки
clever77 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ограничение на ввод символов в ячейку J-Max БД в Delphi 7 29.12.2010 13:30
как поставить ограничение на ввод нуля? Dr.Swat Общие вопросы Delphi 5 14.06.2010 06:43
Как в MS Excel посчитать сумму значений по столбцам, входящих в именованную ячейку? sahthey Microsoft Office Excel 3 20.05.2010 11:32
Как можно запретить повторный ввод нуля в ячейку StringGrid Ветас Помощь студентам 5 12.11.2009 13:43
Как копировать URL адрес из ячейки в другую ячейку (макросом). AlexDoom Помощь студентам 1 09.03.2009 10:59