Но что произойдет, если пользователь вдруг вызовет программу тогда, когда открытых документов в Word'e нет? Тогда ведь возникнет ошибка программы. Но этого легко избежать — надо просто проверить перед вставкой, есть ли открытые документы и, если нет, создать новый:
If Documents.Count = 0 Then Documents.Add
Осталась еще одна маленькая деталь. Кнопка "Вставить результат в документ" не должна работать, если результат вычислить нельзя (то есть поле "TextBox6" пусто). Как это сделать?
Среди всего набора возможных свойств элемента "CommandButton" есть свойство "Enabled" — если его установить как "False" (то есть "ложно"), то кнопка будет отображаться серым цветом и не будет реагировать на события (станет неактивной). Это свойство можно задать и программно — командой "CommandButton1.Enabled = False".
Поставим в процедуру вычисления результата пару команд, активизирующих кнопку, когда результат вычисляется и вставка его в текст возможна, и инактивирующих ее в противном случае, а также зададим с самого начала в форме свойство "Enabled" этой кнопки как "False", — чтобы она была неактивной с самого начала, до того, как в какое-либо окно ввода будут вводиться символы и начнет срабатывать процедура вычисления результата с командами задания состояния кнопки.
Вот готовый код нашей программы:
Private Sub CommandButton1_Click()
If Documents.Count = 0 Then Documents.Add
Selection.Text = "При прохождении тока напряжением в " + TextBox1.Text + " вольт по проводнику длиной " + TextBox4.Text + " метров, сечением " + TextBox3.Text + " кв. мм и удельным сопротивлением " + TextBox5.Text + " ом на метр за " + TextBox2.Text + " секунд выделится" + TextBox6.Text + " джоулей теплоты. "
Selection.Collapse Direction:=wdCollapseEnd
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
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) A
2) * Val(TextBox2.Text) * Val(TextBox3.Text)) / (Val(TextBox4.Text) * Val(TextBox5.Text))TextBox6.Text = Str$(rez)
CommandButtonl.Enabled = True
Else
TextBox6.Text = ""
CommandButtonl.Enabled = False
End If
End Sub
(В формуле, используемой в программе, указывается напряжение между концами проводника, а не сила тока. Поэтому не удивляйтесь, что выделение тепла окажется максимальным при большой толщине проводника и его малой длине. Эта ситуация имеет место быть при коротком замыкании, когда в условиях постоянного напряжения через точку замыкания идет ток огромной силы.)
Назначить форме кнопку или пункт меню для вызова из Word нельзя, — это возможно только для модулей. Поэтому переименуем для красоты форму в "Teplotok", например (свойство "Name" объекта "UserForm" — можно Задать в окне свойств, выделив форму) и напишем модуль, в котором будет всего одна команда — вызов созданной нами формы:
Sub TeploCount()
Teplotok.Show
End Sub
Зададим модулю красивое имя ("Teplo", например, через свойство "Name" объекта "Модуль1", если модуль для программы вызова формы был вставлен с помощью пункта "Вставить"-"Модуль" контекстного меню правой кнопки мыши в Менеджере проектов) и назначим в Word кнопку для вызова макроса "Normal.Teplo.TeploCount".