События KeyDown и KeyUp, напротив, распознают практически любую посылаемую им комбинацию клавиш, включая выкрутасы типа <Alt+Shift+Ctrl+F9>. С этими событиями работать труднее, чем с KeyPress, но зато они позволяют использовать более широкий набор сочетаний клавиш. Например, можно создать процедуру обработки события KeyDown, которая позволяет с помощью комбинаций <Ctrl+<-> и <Ctrl+->> соответственно уменьшать или увеличивать значение полосы прокрутки, например, на 10.
В главе 10 мы обсудили основные приемы, позволяющие убедиться в том, что пользователь ввел в форму правильные сведения. Здесь мы обсудим еще несколько приемов.
В случае текстовых полей и полей со списком некоторые символы для вводимых данных не допускаются. Используйте процедуру обработки события KeyPress, чтобы убрать с экрана недопустимые символы в случае печатания их пользователем. Следующий программный код позволяет вводить только буквы и цифры:
Private Sub txtSerial Number_KeyPress(ByVal KeyAscii _
As MSForms.ReturnInteger)
' весь следующий блок является условием:
If Chr(KeyAscii) < "0" Or _
(Chr(KeyAscii) > "9" And Chr(KeyAscii) < "A") Or _
(Chr(KeyAscii) > "Z" And Chr(KeyAscii) < "a") Or _
Chr(KeyAscii) > "z" Then
MsgBox "Недопустимый символ!"
KeyAscii = 0 ' отбрасывание символа
End If
End Sub
Да, я признаю, что используемое здесь условие оказалось довольно длинным, но зато оно работает. Как только оператор If ... Then обнаружит недопустимый символ, отображается сообщение об этом. Затем идет оператор KeyAscii = 0; KeyAscii является аргументом процедуры обработки события KeyPress, поэтому он используется как локальная переменная в данной процедуре. Изменение его значения меняет код символа, передаваемого в текстовое поле. А поскольку само текстовое поле не воспринимает символ, имеющий код 0, напечатанный пользователем недопустимый символ исчезнет без следа.
Изменение значения аргумента KeyAscii позволяет изменять неправильно введенные данные на правильные. Например, следующую процедуру обработки события можно использовать для отображения и сохранения вводимого пользователем текста в виде текста, записанного буквами верхнего регистра:
Private Sub txtSerial Number_KeyPress(ByVal KeyAscii _
As MSForms.ReturnInteger)
KeyAscii = Asc(UCase(Chr(KeyAscii)))
End Sub
Оператор, осуществляющий преобразование, потребовал использования трех функций, вложенных одна в другую. Поскольку KeyAscii является числовым кодом символа, сначала приходится конвертировать этот код в строку с помощью функции Chr, затем перевести строку в верхний регистр с помощью UCase и, наконец, конвертировать строку снова в целое число с помощью Asc.
Если вы хотите перепроверять значение элемента управления при каждом изменении, создайте процедуру обработки события или используйте готовую из предыдущего подраздела. Но иногда предпочтительнее отложить проверку данных до момента, когда пользователь завершит ввод полностью. Некоторые будут признательны вам за возможность без посторонней помощи корректировать вводимые ими данные перед тем, как окончательно передать эти данные на проверку программе, - это они воспринимают как косвенное признание их умственных способностей.
Отложить проверку имеет смысл и в том случае, если она занимает много времени. Если придется сравнивать введенные данные с данными из какой-нибудь базы данных или данными из Internet, вы, наверное, не захотите заставлять пользователя ждать, пока программа будет искать данные для сравнения после каждого нажатия клавиши и каждого щелчка кнопки мыши.
Чтобы проверить значение элемента управления после того, как пользователь закончит ввод полностью, создайте процедуру обработки события BeforeUpDate. Эти события происходят, когда пользователь щелкает на другом элементе управления, нажимает клавишу <Tab> или нажимает комбинацию клавиш, назначенную другому элементу управления. VBA регистрирует событие BeforeUpDate непосредственно перед тем, как покинуть данный элемент управления, тут вы и можете отменить обновление данных и остаться на месте, предлагая пользователю исправить ошибку. Следующий пример показывает, как использовать оператор Cancel:
Private Sub txtSerial Number_Change()
If Len(t xt Serial Number.Value) > 5 Then
MsgBox "Слишком много символов. Повторите ввод."
Cancel
End If
End Sub
Иногда имеет смысл отложить проверку данных элемента управления до того момента, когда пользователь щелкнет на кнопке ОК, закрывающей форму. Это приходится делать тогда, когда критерии проверки используют значения нескольких элементов управления в форме. Если вы выбрали такой тип проверки, поместите соответствующий программный код в процедуру обработки события Click кнопки ОК. Предположим, вы разрабатываете форму, которая позволит пользователю ввести даты будущих важных событий. В форме есть список, в котором пользователь может указать, за какое время до наступления события нужно напомнить о нем. Если пользователь запланирует некоторую встречу на завтра, но попросит напомнить о ней за два дня до этого, вы можете сообщить о запрете ввода таких данных уже после того, как пользователь щелкнет на кнопке ОК. Таким образом вам не придется просить пользователя ввести данные в элементы управления в определенном порядке, чтобы избежать появления сообщений об ошибке.
Часть V Великолепные десятки
В этой части...
Эта короткая часть, оставленная на десерт, подогревает интерес к УВЛ множеством эффектных примеров. Попробовав представленное здесь, вы непременно захотите еще.
В главе 20 обсуждается ряд тонких приемов программирования, вполне способных заставить "летать " вашу VBA-программу.
Среди рассмотренных тем - запись информации в реестр
Windows и извлечение информации из него, использование возможностей других приложений и компонентов, чтение и запись дисковых файлов, а также добавление элементов управления ActiveX в панель элементов управления редактора Visual Basic. В главе 21 приведен обзор других ресурсов VBA, о которых вам полезно знать, - это журналы, Web страницы, программные средства различных производителей.
Глава 20. Десятка (без трех) эффектных решений с помощью VBA.
В этой главе ...
~ Сохранение установок программы в реестре Windows и извлечение их оттуда
~ Доступ к объектам других приложений
~ Работа с базами данных в VBA
~ Сохранение информации на диске и ее чтение с диска
~ Сохранение табличной информации в объектах Dictionary
~ Создание своих собственных объектов
~ Установка элементов управления ActiveX
Прочитав книгу до этой главы (а значит, большую ее часть), вы стали почти экспертом по VBA. Теперь вас уже не нужно постоянно вести за ручку, поэтому в этой главе, знакомящей с целым рядом важных приемов программирования в VBA, описания будут довольно сжатыми. Вы сможете воспользоваться предлагаемой здесь информацией на практике, чтобы почувствовать удовольствие от освоения достаточно тонких приемов программирования.
Сохранение информации в реестре Windows
Чтобы сохранить установки и значения других переменных, можно использовать небольшие файлы на диске, но реестр Windows как раз и предназначен для хранения подобных данных. VBA обеспечивает все необходимые средства для создания параметров реестра, размещения там данных и последующего извлечения информации.
Сохранение элемента информации в реестре осуществляет оператор Save Settings, который автоматически создаст заданный вами параметр, если его в реестре не окажется. Синтаксис оператора следующий:
Save Settings приложение, раздел, параметр, значение
Здесь приложение, раздел и параметр- это имена соответствующих уровней иерархии реестра. Все установки реестра для одной VBA-программы должны размещаться в одной, созданной специально для этой программы ветви реестра (используйте аргумент приложение для идентификации этой ветви). Сохраняемые в реестре данные можно разбивать на разделы и параметры совершенно произвольно, используя при этом произвольные имена.
Если вы назвали свою программу "Случайные цитаты" и хотите добавить в реестр параметры, хранящие информацию о том, сколько раз вызывалось диалоговое окно, содержащее случайную цитату, используйте для этого оператор типа:
SaveSettings "Случайные цитаты", "Параметры", _
"Число вызовов", "6"
Последний аргумент, "6", задает реальные данные, которые должны быть помещены в реестр. На рис. 20.1 приведен результат выполнения этой строки программного кода.
Рис. 20.1. Вид реестра Windows после добавления пользовательского параметра
Подобным образом для извлечения данных из реестра используется функция Get Setting. В ее синтаксисе, показанном ниже, первые три аргумента обязательны, а аргумент по_умолчанию не обязателен:
Get Setting приложение, раздел, параметр, по_умолчанию
Функция Get Setting используется, когда нужно выяснить, какое значение хранится в некотором параметре реестра. В программном коде нужно присвоить значение функции