"Change" — это по-английски "изменение". Код, написанный в этой части программы (часть эта называется "обработчик события "Change"), должен выполняться всякий раз при происхождении этого события. Можно предположить, что это событие происходит тогда, когда в поле ввода ввели какой-либо символ или удалили его оттуда. В этом случае это — именно то событие, которое нам надо. Но то ли? Проверим. Напишем-ка здесь строчку:
Private Sub TextBox1_Change
TextBox6. Text=TextBox1. Text
End Sub
Пусть для эксперимента при изменении текста в первом поле ввода произойдет изменение текста в поле отображения результата. Проверим, будет ли это работать, — нажмем F5 (запуск программы на выполнение) и введем текст в первое поле ввода.
Прекрасно — в поле отображения результата появляется тот же текст! Значит, событие "Change" — именно то, которое нам надо использовать в нашей программе, чтобы после каждого нового ввода данных пользователем проверять условия возможности отображения результата и отображать его в случае их выполнения. Ну, а если бы оно нам не подошло, то пришлось бы перебирать все остальные события из выпадающего списка вверху справа окна программного кода формы и для каждого проводить такое же исследование: помещать в обработчик этого события команду, выполняющую какое-либо действие и смотреть, будет ли она выполнена при вводе текста в первое поле ввода.
Проверка возможности подсчета результата и вывод его в случае соблюдения описанных выше условий должна происходить после каждого ввода какого-либо символа в любое из окон ввода, а также при удалении символа из любого окна ввода. Писать пять одинаковых программ для каждого из окон ввода представляется нецелесообразным, поэтому лучше проверку возможности отображения результата и его подсчет вынести в отдельную подпрограмму-процедуру, а из каждого обработчика события "Change" полей ввода ее вызывать.
Переведем на язык Visual Basic for Applications условие возможности отображения результата. Во-первых, все значения полей ввода должны быть числовыми. В Visual Basic for Applications есть специальная функция для проверки того, является ли та или иная строка записью числа — IsNumeric Можно, например, найти ее описание в разделе "Поиск" Справочной системы по VBA из Microsoft Office 97 по словам "строковое выражение числовое значение" — рис. 6.7.
Рис. 6.7.
(В Microsoft Office 2000/ХР информацию об этой функции так просто не получить, однако можно попробовать задать вопрос Мастеру ответов, например, так: "Does the expression a number?" — "Является ли это выражение числом?" В этом случае в перечне результатов поиска будет и справка по функции IsNumeric (рис. 6.8).
Рис. 6.8.
Справка по функции IsNumeric в Microsoft Office ХР.Однако найти ее, не зная имени функции, все же непросто — при другой формулировке запроса эта информация может вообще не быть выведена даже в перечне результатов поиска.)
Ее (функцию IsNumeric) и используем. Ну, а для проверки отличия от нуля значений в последних двух полях ввода используем функцию "Val", которая переводит строковое выражение в числовое, если это строковое выражение содержит в своем начале цифры (или все состоит из них).
Итак, результат существует, если
IsNumeric (TextBox1. Text) = True And IsNumeric (TextBox2. Text) = True And IsNumeric (TextBox3.Text) = True And IsNumeric (TextBox4.Text) = True And IsNumeric (TextBox5. Text) = True And Not Val (TextBox4. Text) = 0 And Not Val (TextBox5. Text) = 0
В этом случае можно осуществить подсчет по формуле:
rez = ((Val (TextBox1. Text)^2) * Val (TextBox2. Text) * Val (TextBox3. Text))/(Val (TextBox4. Text) * Val (TextBox5. Text))
и отобразить его в поле вывода результата:
Функция Str делает преобразование, обратное тому, что производит Val — конвертирует числовое значение выражения в строковое, что позволяет этому значению в дальнейшем обрабатываться как строке.
(Функции Val и Str нужны "для самого VBA" — они, не производя никакого видимого действия, преобразуют ни что иное, как типы данных обрабатываемых ими переменных, — соответственно из строкового в числовой и из числового в строковый. Подробнее о типах данных — в четвертой главе.)
Теперь можно написать процедуру вычисления результата и вызовы ее из всех обработчиков событий "Change":
Private Sub TextBox1_Change
Scet End Sub
Private Sub TextBox2_Change
Scet End Sub
Private Sub TextBox3_Change
Scet End Sub
Private Sub TextBox4_Change
Scet End Sub
Private Sub TextBox5_Change
Scet End Sub
Private Sub Scet
If IsNumeric (TextBox1. Text) = True And IsNumeric (TextBox2. Text) = True And IsNumeric (TextBox3. Text) = True And IsNumeric (TextBox4. Text) = True And IsNumeric (TextBox5. Text) = True And Not Val (TextBox4. Text) = 0 And Not Val (TextBox5. Text) = 0 Then rez = ((Val (TextBox1. Text) ^ 2) * Val (TextBox2. Text) * Val (TextBox3. Text)) / (Val (TextBox4. Text) * Val (TextBox5. Text))