представляется нецелесообразным, поэтому лучше проверку возможности отображения результата и его подсчет вынести в отдельную подпрограмму-процедуру, а из каждого обработчика события «Change» полей ввода ее вызывать.
Переведем на язык VBA условие возможности отображения результата. Во-первых, все значения полей ввода должны быть числовыми. В VBA есть специальная функция для проверки того, является ли та или иная строка записью числа — IsNumeric (можно, например, найти ее описание в разделе «Поиск» справки по VBA из Microsoft Office 97 по словам 'строковое выражение числовое значение', а в справке VBA из более старших версий этого пакета — по английским эквивалентам данных слов). Ее и используем. Ну, а для проверки отличия от нуля значений в последних двух полях ввода используем функцию «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))
и отобразить его в поле вывода результата:
TextBox6.Text = Str$(rez)
Теперь можно написать процедуру вычисления результата и вызовы ее из всех обработчиков событий '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))
TextBox6.Text = Str$(rez)
Else
TextBox6.Text = ''
End If
End Sub
В принципе программа уже почти закончена, но стоит еще разобраться с командными кнопками. Для кнопки «Отмена» обработчик события «Click» (то есть нажатия на кнопку) прост — выход из программы:
Private Sub CommandButton2_Click()
Unload Me
End Sub
Но у нас есть еще вторая кнопка — 'Вставить результат в документ'. А пусть она вставит в документ не просто значение результата, а осмысленную фразу, содержащую как результат, так и введенные параметры! Это можно сделать командой
Selection.Text = 'При прохождении тока напряжением в ' + TextBox1.Text + ' вольт по проводнику длиной ' + TextBox4.Text + ' метров, сечением ' + TextBox3.Text + ' кв. мм и удельным сопротивлением ' + TextBox5.Text + ' ом на метр за ' + TextBox2.Text + ' секунд выделится' + TextBox6.Text + ' джоулей теплоты.»
Она сформирует фразу из значений полей ввода и вставит ее в активный документ. Проверим… так, действительно вставляет, но фраза остается выделенной. А значит, что следующая фраза, выведенная с помощью нашей программы, сотрет предыдущую. Надо посмотреть, нет ли в VBA функции снятия выделения? Посмотрим по выпадающему меню после точки 'Selection.'… есть команда «Collapse» (то есть 'Свернуть'). Из справки по ней узнаем ее синтаксис:
Selection.Collapse Direction:=wdCollapseEnd.
Эта команда убирает выделение и помещает курсор в его конец.
Можно также вставить текст в активный документ 'Selection.TypeText Text:='Мой текст' (двоеточие после слова «Text» обязательно, так как это — оператор присваивания значения параметру команды). Тогда в команде специального снятия выделения со вставленного текста не будет необходимости, — после выполнения команды выделенного текста не окажется.
Но что произойдет, если пользователь вдруг вызовет программу тогда, когда открытых документов в Word'е нет? Тогда ведь возникнет ошибка программы. Но этого легко избежать — надо просто проверить перед вставкой, есть ли открытые документы и, если нет, создать новый:
If Documents.Count = 0 Then Documents.Add
Осталась еще одна маленькая деталь. Кнопка 'Вставить результат в документ' не должна работать, если результат вычислить нельзя (то есть поле «TextBox6» пусто). Как это сделать?
Среди всего набора возможных свойств элемента «CommandButton» есть свойство «Enabled» — если его установить как «False» (то есть 'ложно'), то кнопка будет отображаться серым цветом и не будет