Интернет-журнал "Домашняя лаборатория", 2007 №7 - Глуховский
Шрифт:
Интервал:
Закладка:
Рис. 6.7. Справка по функции IsNumeric в Microsoft Office 97.
(В 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))
и отобразить его в поле вывода результата:
TextBox6. Text = Str $ (rez)
Функция 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))
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 + " кв. мм и удельным сопротивлением " + ТехtBox5. Text + " ом на метр за " + TextBox2. Text + " секунд выделится" + TextBox6. Text + " джоулей теплоты. "
Она сформирует фразу из значений полей ввода и вставит ее в активный документ. Проверим… так, действительно вставляет, но фраза остается выделенной. А значит, что следующая фраза, выведенная с помощью нашей программы, сотрет предыдущую. Надо посмотреть, нет ли в Visual Basic for Applications функции снятия выделения? Посмотрим по выпадающему меню после точки "Selection."… есть команда "Collapse" (то есть "Свернуть") — рис. 6.9.
Рис. 6.9. Список методов объекта Selection.
Из справки по ней (рис. 6.10) узнаем ее синтаксис:
Selection.Collapse Direction:=wdCollapseEnd.
Рис. 6.10. Справка по команде Collapse.
Эта команда убирает выделение и помещает курсор в его конец.
Можно также вставить текст в активный документ "Selection.TypeText Техt="Мой текст" (двоеточие после слова "Text" обязательно). Тогда в специальном снятии выделения со вставленного текста не будет необходимости, — оно будет автоматически сворачиваться к своему концу.
А если вдруг пользователь вызовет программу тогда, когда открытых документов в Word'e нет? Тогда ведь возникнет ошибка программы. Но этого легко избежать — надо просто проверить перед вставкой, есть ли открытые документы и, если нет, создать новый:
If Documents.Count = 0 Then Documents.Add
Осталась еще одна маленькая деталь. Кнопка "Вставить результат в документ" не должна работать, если результат вычислить нельзя (то есть поле "TextBox6" пусто). Как это сделать? Среди всего набора возможных свойств элемента "CommandButton" есть свойство "Enabled" (рис. 6.11) — если его установить как "False" (то есть "ложно"), то кнопка будет отображаться серым цветом и не будет реагировать на события (станет неактивной).
Рис. 6.11. Свойство Enabled элемента CommandButton.
Это свойство можно задать и программно — командой "CommandButton1.Enabled = False". Поставим в процедуру вычисления результата пару команд, активизирующих кнопку, когда результат вычисляется и вставка его в текст возможна, и инактивирующих ее в противном случае, а также зададим с самого начала в форме свойство "Enabled" этой кнопки как "False", — чтобы она была неактивной с самого начала, до того, как в какое-либо окно ввода будут вводиться символы и начнет срабатывать процедура вычисления результата с командами задания состояния кнопки.
Вот готовый код нашей программы:
Private Sub CommandButtonl_Click ()
If Documents.Count = 0 Then Documents.Add
Selection. Text = "При прохождении тока напряжением