ПРИЛОЖЕНИЕ 1
Схема алгоритма
ПРИЛОЖЕНИЕ 2
Текст программы
Модуль листа «Конструкция»:
'Возникает при нажатии кнопки расчёт с помощью VBA на листе1
Private Sub CommandButton1_Click()
'Показ окна расчета с помощью VBA
UserForm1.Show
End Sub
Модуль книги Excel «ЭтаКнига»:
‘Данная процедура выполняется при открытии книги курсовой работы’
Private Sub Workbook_Open()
'Вывод на экран заставки (пользовательской формы)'
UserForm2.Show
'Заполнение списка на странице График'
End Sub
Модуль пользовательской формы «Form2»:
'Процедура вызывается при открытии пользовательской формы на экран'
Private Sub UserForm_Activate()
Application.OnTime Now + TimeValue("00:00:05"), "killtheform"
End Sub
'Процедура инициализации пользоваетльской формы'
Private Sub UserForm_Initialize()
With txtlogo
.MultiLine = True
.Font.Size = 12
.Font.Bold = True
.Locked = True
.Text = "БрГТУ гр. Т-77" + vbCr + "Copyright " + Chr(169) + " Андрияшко А.С." + vbCr + "All Right Reserved"
End With
End Sub
Модуль программы «Module1»:
'Макрос закрытия заставки(пользовательской формы), вызывается через пять секунд после' 'вывода ее на экран, после закрытия на экран выводится рабочая форма'
Private Sub killtheform()
'закрытие пользовательской формы'
Unload UserForm2
'Вывод рабочей формы на экран'
UserForm1.Show
End Sub
Модуль программы «Module3»:
Sub Command_button2()
Worksheets("конструкция").Unprotect
Worksheets("конструкция").Activate
k = 1 ' номер варианта
'Ввод исходных данных
F = Val(InputBox("Введите F", "", "10"))
Cells(21, 1) = F + 0.1 * k
G1 = Val(InputBox("Введите G1", "Ввод исходных данных", "10"))
Cells(21, 2) = G1 + 0.1 * k
G2 = Val(InputBox("Введите G2", "Ввод исходных данных", "10"))
Cells(21, 3) = G2 + 0.1 * k
sina1 = Val(InputBox("Введите sin a1", "Ввод исходных данных", "0.2"))
Cells(21, 4) = sina1 + 0.001 * k
sina2 = Val(InputBox("Введите sin a2", "Ввод исходных данных", "0.13"))
Cells(21, 5) = sina2 - 0.001 * k
sina3 = Val(InputBox("Введите sin a3", "Ввод исходных данных", "0.68"))
Cells(21, 6) = sina3 - 0.001 * k
sina4 = Val(InputBox("Введите sin a4", "Ввод исходных данных", "0.88"))
Cells(21, 7) = sina4 - 0.001 * k
a = Val(InputBox("Введите a", "Ввод исходных данных", "1"))
Cells(21, 8) = a
b = Val(InputBox("Введите b", "Ввод исходных данных", "1"))
Cells(21, 9) = b
Worksheets("конструкция").Protect
End Sub
Модуль основной пользовательской формы «Form1»:
'Объявление переменных
Dim N As Integer
Dim G1, G2, F, Nd, Nc, S1, S2 As Single
Dim sina1, sina2, sina3, sina4, a, b As Single
Dim str_znach As String
'Задание матрицы в виде двумерного массива
Dim MATR(7, 7) As Double
'Задание вектора свободных членов в виде одномерного массива
Dim S_CH(7) As Double
'Одномерный массив, содержащий решение СЛАУ
Dim resh(7) As Double
' Процедура вызывается при активации рабочей формы'
Private Sub UserForm_Activate()
N = 1 'первая цифра варианта
Worksheets("конструкция").Unprotect ' снятие защиты с листа Конструкция'
Worksheets("конструкция").Activate ' сделать активной лист конструкция'
' считывание данных в текстовое поле Ft вкладки "исходные данные" из листа "Конструкция"
tf.Text = Format(Cells(21, 1), "#0.#0")
F = Format(Cells(21, 1), "#0.#0")
' считывание данных в текстовое поле G1 вкладки "исходные данные" из листа "Конструкция"
tg1.Text = Format(Cells(21, 2), "#0.#0")
G1 = Format(Cells(21, 2), "#0.#0")
' считывание данных в текстовое поле G2 вкладки "исходные данные" из листа "Конструкция"
tg2.Text = Format(Cells(21, 3), "#0.#0")
G2 = Format(Cells(21, 3), "#0.#0")
' считывание данных в текстовое поле sina1 вкладки "исходные данные" из листа "Конструкция"
tsina1.Text = Format(Cells(21, 4), "0.##0")
sina1 = Format(Cells(21, 4), "0.##0")
' считывание данных в текстовое поле sina2 вкладки "исходные данные" из листа "Конструкция"
tsina2.Text = Format(Cells(21, 5), "0.##0")
sina2 = Format(Cells(21, 5), "0.##0")
' считывание данных в текстовое поле sina3 вкладки "исходные данные" из листа "Конструкция"
tsina3.Text = Format(Cells(21, 6), "0.##0")
sina3 = Format(Cells(21, 6), "0.##0")
' считывание данных в текстовое поле sina4 вкладки "исходные данные" из листа "Конструкция"
tsina4.Text = Format(Cells(21, 7), "0.##0")
sina4 = Format(Cells(21, 7), "0.##0")
' считывание данных в текстовое поле a вкладки "исходные данные" из листа "Конструкция"
ta.Text = Format(Cells(21, 8), "#0.0")
a = Format(Cells(21, 8), "#0.0")
' считывание данных в текстовое поле b вкладки "исходные данные" из листа "Конструкция"
tb.Text = Format(Cells(21, 9), "#0.0")
b = Format(Cells(21, 9), "#0.0")
Worksheets("графика").Activate
' считывание данных в текстовые поля вкладки "Графика" из листа "Графика"
TextBox1.Text = Format(Cells(3, 8), "#0.#0")
TextBox2.Text = Format(Cells(4, 8), "#0.#0")
TextBox3.Text = Format(Cells(3, 9), "#0.#0")
TextBox4.Text = Format(Cells(4, 9), "#0.#0")
' сделать активным лист конструкция'
Worksheets("конструкция").Activate
' защита листа Конструкция
Worksheets("конструкция").Protect
End Sub
' кнопка "Показать"(Exel)
Private Sub CommandButton1_Click()
Worksheets("Решение").Activate
'Cчитывание значение Xo из рабочего листа "рассчёт реакций"
TextCelXo = Format(Cells(12, 1), "#0.###0")
'Cчитывание значение Yo из рабочего листа "рассчёт реакций"
TextcelYo = Format(Cells(12, 2), "#0.###0")
'Cчитывание значение Nd из рабочего листа "рассчёт реакций"
TextcelNd = Format(Cells(12, 3), "#0.###0")
'Cчитывание значение Nc из рабочего листа "рассчёт реакций"
TextcelNc = Format(Cells(12, 4), "#0.###0")
'Cчитывание значение S1 из рабочего листа "рассчёт реакций"
TextcelS1 = Format(Cells(12, 5), "#0.###0")
'Cчитывание значение S2 из рабочего листа "рассчёт реакций"
TextcelS2 = Format(Cells(12, 6), "#0.###0")
End Sub
'кнопка расчитать(VBA)
Private Sub CommandButton2_Click()
'объявление переменных
Dim z, z2 As Integer
'сделать рабочим лист "Решение"
Worksheets("Решение").Activate
For z = 4 To 9 Step 1
S_CH(z - 3) = Cells(z, 9) 'Заполняем матрицу свободных членов'
For z2 = 1 To 6 Step 1
MATR(z - 3, z2) = Cells(z, z2) 'Заполняем матрицу коэфициентов'
Next z2
Next z
' элементам массива Х(i) присваиваем значение 0
For z = 1 To 6
resh(z) = 0
Next z
'вызов функции для решения СЛАУ
Call gaussmethod(6, MATR(), S_CH, resh())
'Вывод значений эмлементов массива resh на вкладку "Расчёт реакций"
TextCelXo1 = resh(1)
TextcelYo1 = resh(2)
TextcelNd1 = resh(3)
TextcelNc1 = resh(4)
TextcelS11 = resh(5)
TextcelS21 = resh(6)
End Sub
' метод Гауса
' сначала делает из искомой матрицы нижнюю треугольную. Это называется прямым ходом
' затем методом выражения находит решение СЛАУ. Это называется обратным ходом.
' также прооверяет нет ли на главной диагонали нулевых элементов.
Sub gaussmethod(N As Integer, M() As Double, b() As Double, X() As Double)
' M - искомая матрица
' B - матрица свободных членов
' X - матрица полученных решений систему уравнений
' N - размерность матрицы
'объявление переменных
Dim i, a, l As Integer
Dim q, p, t As Double
'прямой ход
For l = 1 To (N - 1)
' проверка не является ли элемент главной диагонали равен нулю
If M(l, l) = 0 Then
p = 0
For i = 2 To N Step 1
'Перестановка строк местами
If Abs(M(i, l)) <> 0 Then
p = i
If (l <> p) Then
For a = 1 To (N + 1) Step 1
t = M(l, a)
M(l, a) = M(p, a)
M(p, a) = t
Next a
t = b(l)
b(l) = b(p)
b(p) = t
End If
Exit For
End If
Next i
End If
'прямой ход
q = M(l, l)
' делим lю строку на коэфициент q
For i = l To N Step 1
M(l, i) = M(l, i) / q
Next i
b(l) = b(l) / q
For a = (l + 1) To N Step 1
q = M(a, l)
For i = 1 To N Step 1
M(a, i) = M(a, i) - M(l, i) * q
Next i
b(a) = b(a) - b(l) * q
Next a
Next l
'обратный ход
For i = N To 1 Step -1
q = 0 ' промежуточная сумма
For a = 0 To (N - i)
q = q + M(i, N - a) * X(N - a)
Next a
b(i) = b(i) - q
X(i) = b(i) / M(i, i) ' нахождение корней СЛАУ
Next i
End Sub
' кнопка "расчитать" вкладки "Контроль Решения"
Private Sub CommandButton3_Click()
'объявление переменных
Dim delta, max As Double
Dim i As Byte
'вызов нажатия кнопки "Рассчитать(VBA)"
Call CommandButton2_Click
'нахождение максимального элемента из массива Resh
max = Abs(resh(1))
For i = 1 To 6 Step 1
If Abs(resh(i)) > Abs(max) Then max = Abs(resh(i))
Next i
S2 = Val(TextcelS11)
S1 = Val(TextcelS21)
'считывение в текстовое поле формы невязку, полученную с помощью рассчётов в Exсel
tpogrexcel.Text = Format(Worksheets("решение").Range("F21").Value, "percent")
' расчёт невязки
delta = Abs(a * F - a * G1 + a * S1 * Sqr(1 - sina3 ^ 2) + a * S2 * (Sqr(1 - sina4 ^ 2) - 2 * sina4))
tpogrvba.Text = Format(delta / max * 100, "percent")
If Val(tpogrexcel.Text) <= 0.03 And Val(tpogrvba.Text) <= 0.03 Then
'если точность удовлетворяет заданным условиям
lblvivod.Caption = "Малость величины относительной невязки показывает, что полученные значения реакций могут быть взяты в качестве решения системы"
Else
' если точность слишком мала
lblvivod.Caption = "Точность решения неудовлетворительная!"
'вывод Message Box
MsgBox "Проверьте исходные данные и расчеты!", vbCritical, "Предупреждение"
End If
End Sub
'Обработчик кнопки "построить график" вкладки "Графика"
Private Sub cmd_gr_Click()
'сделать лист "Графика" рабочим
Worksheets("Графика").Activate
' проверка введённых данных
If (Val(TextBox1.Text) <> Val(TextBox2.Text)) Then
If (Val(TextBox3.Text) <> Val(TextBox4.Text)) Then
'считывание значений в ячейки EXCEL
Cells(3, 8) = TextBox1.Text
Cells(4, 8) = TextBox2.Text
Cells(3, 9) = TextBox3.Text
Cells(4, 9) = TextBox4.Text
Else: MsgBox "исходные данные неверны!", vbCritical, "Ошибка ввода данных"
End If
Else: MsgBox "исходные данные неверны!", vbCritical, "Ошибка ввода данных"
End If
Set currentchart = Sheets("Графика").ChartObjects(2).Chart
fname = "temp.gif"
currentchart.Export Filename:=fname, filtername:="gif"
Image4.Picture = LoadPicture(fname)
End Sub
'обработчики двойного клика по текстовым полям вкладки "Исходные данные"
Private Sub tg1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
' снятие защиты от записи листа Конструкция'
Worksheets("конструкция").Unprotect
str_znach = InputBox("Введите G1", "Ввод исходных данных", "10.0")
'проверка введённого значения
If str_znach <> "" Then
G1 = Val(str_znach)
' сделать активным лист "конструкция"'
Worksheets("конструкция").Activate
Cells(21, 2) = G1 + 0.1 * N
tg1.Text = Format(Cells(21, 2), "0#.#0")
' поставить защиту от записи на лист "Конструкция"'
Worksheets("конструкция").Protect
End If
End Sub
Private Sub tg2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Worksheets("конструкция").Unprotect
str_znach = InputBox("Введите G2", "Ввод исходных данных", "10.0")
If str_znach <> "" Then
G2 = Val(str_znach)
Worksheets("конструкция").Activate
Cells(21, 3) = G2 + 0.1 * N
tg2.Text = Format(Cells(21, 3), "0#.#0")
Worksheets("конструкция").Protect
End If
End Sub
Private Sub tf_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Worksheets("конструкция").Unprotect
str_znach = InputBox("Введите F", "Ввод исходных данных", "10.0")
If str_znach <> "" Then
F = Val(str_znach)
Worksheets("конструкция").Activate
Cells(21, 1) = F + 0.1 * N
tf.Text = Format(Cells(21, 1), "0#.#0")
Worksheets("конструкция").Protect
End If
End Sub
Private Sub tb_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Worksheets("конструкция").Unprotect
str_znach = InputBox("Введите b", "Ввод исходных данных", "1")
If str_znach <> "" Then
b = Val(str_znach)
Worksheets("конструкция").Activate
Cells(21, 9) = b
tb.Text = Format(Cells(21, 9), "#.0")
Worksheets("конструкция").Protect
End If
End Sub
Private Sub tsina4_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Worksheets("конструкция").Unprotect
str_znach = InputBox("Введите sina4", "Ввод исходных данных", "0.88")
If str_znach <> "" Then
sina4 = Val(str_znach)
Worksheets("конструкция").Activate
Cells(21, 7) = sina4 - 0.001 * N
tsina4.Text = Format(Cells(21, 7), "0.##0")
Worksheets("конструкция").Protect
End If
End Sub
Private Sub tsina1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Worksheets("конструкция").Unprotect
str_znach = InputBox("Введите sina1", "Ввод исходных данных", "0.2")
If str_znach <> "" Then
sina1 = Val(str_znach)
Worksheets("конструкция").Activate
Cells(21, 4) = sina1 + 0.001 * N
tsina1.Text = Format(Cells(21, 4), "0.##0")
Worksheets("конструкция").Protect
End If
End Sub
Private Sub tsina2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Worksheets("конструкция").Unprotect
str_znach = InputBox("Введите sina2", "Ввод исходных данных", "0.13")
If str_znach <> "" Then
sina2 = Val(str_znach)
Worksheets("конструкция").Activate
Cells(21, 5) = sina2 - 0.001 * N
tsina2.Text = Format(Cells(21, 5), "0.##0")
Worksheets("конструкция").Protect
End If
End Sub
Private Sub tsina3_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Worksheets("конструкция").Unprotect
str_znach = InputBox("Введите sina3", "Ввод исходных данных", "0.68")
If str_znach <> "" Then
sina3 = Val(str_znach)
Worksheets("конструкция").Activate
Cells(21, 6) = sina3 - 0.001 * N
tsina3.Text = Format(Cells(21, 6), "0.##0")
Worksheets("конструкция").Protect
End If
End Sub
Private Sub ta_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Worksheets("конструкция").Unprotect
str_znach = InputBox("Введите a", "Ввод исходных данных", "1")
If str_znach <> "" Then
a = Val(str_znach)
Worksheets("конструкция").Activate
Cells(21, 8) = a
ta.Text = Format(Cells(21, 8), "#.0")
Worksheets("конструкция").Protect
End If
End Sub