52953.fb2 VBA для чайников - читать онлайн бесплатно полную версию книги . Страница 119

VBA для чайников - читать онлайн бесплатно полную версию книги . Страница 119

Сведения, изложенные в настоящей главе, должны помочь вам лучше и быстрее достичь поставленной цели.

Использование переменных для ссылок на формы

Хотя в программном коде можно ссылаться на форму непосредственно по ее имени, не исключено, что вы предпочтете использовать для этого переменную. Например, чтобы уменьшить объем необходимого печатания, когда у формы длинное имя, или чтобы ускорить выполнение программы, когда в ней приходится отображать формы из разных проектов.

Поскольку формы являются объектами, к ним применима техника работы с объектами, рассмотренная в главе 10. Следующая процедура иллюстрирует процесс. Обратите внимание, что переменная должна объявляться как конкретная форма, а не как родовой объект User Form:

Sub FormVariableDemo()

Dim frml As FormAnOpinion

Set frml = FormAnOpinion

' Изменение свойств и вызов методов с помощью переменной:

With frml

.Caption = "Все указанное выше"

. Show

End With

End Sub

Строго говоря, оператор Set создает отдельную копию, или экземпляр, формы, присваивая его заданной вами переменной. Таким образом можно отображать несколько копий одной и той же формы, каждая из которых будет со своими собственными значениями в элементах управления. Для создания дополнительных экземпляров формы нужно использовать ключевое слово New. Вот как это выглядит:

' объявление переменных для форм

Dim frmOne As MultiForm

Dim frmTwo As MultiForm

' заполнение каждой переменной своим экземпляром формы

Set frmOne = MultiForm

Set frmTwo = New MultiForm ' Здесь используется New

' отображение двух экземпляров форм

frmOne . Show

frmTwo.Show

Распознавание нажатий клавиш

Используйте события KeyPress, KeyDown и KeyUp, чтобы отвечать на нажатия клавиш пользователем. Событие KeyPress удобно использовать для распознавания клавиш с обычными "печатаемыми" символами (буквы, числа, знаки пунктуации), когда нужно обработать информацию, вводимую в текстовое поле или в поле со списком. С помощью этого события распознаются также многие из комбинаций типа <Ctrl+клавиша>, а также клавиша <Backspace>. Немного позже я покажу, как проверить или изменить напечатанный символ с помощью процедуры обработки события KeyPress.

События 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 "Слишком много символов. Повторите ввод."