Dim x As Single, a As Single, m As Single, w As Single, z As Single
x = Worksheets("Лист2").Range("c17")
a = Worksheets("Лист2").Range("c18")
m = Worksheets("Лист2").Range("c19")
w = 0.5 * Sqr(x * a * Abs(1 - m * m))
z = Cos(Log(Abs(w)) / (2 + w))
Worksheets("Лист2").Range("g25") = w
Worksheets("Лист2").Range("h25") = z
End Sub
Здесь ввод исходных данных и вывод результата организован из ячеек рабочего листа и в ячейки рабочего листа.
Если использовать относительные ссылки, то эта же процедура может выглядеть следующим образом:
Private Sub CommandButton1_Click()
Dim x As Single, a As Single, m As Single, w As Single, z As Single
x = Worksheets("Лист1").Cells(17, 3)
a = Worksheets("Лист1").Cells(18, 3)
m = Worksheets("Лист1").Cells(19, 3)
w = exp(x) * a * (1 - m ^ 2)
z = Sin(w / (2 + w))
Worksheets("Лист1").Cells(24, 7) = w
Worksheets("Лист1").Cells(24, 8) = z
End Sub
Можно организовать ввод данных с клавиатуры, а вывод результатов – в окно сообщений. Тогда процедура примет такой вид:
Private Sub CommandButton2_Click()
Dim x As Single, a As Single
Dim m As Single, w As Single
Dim z As Single
x = Val(InputBox(“Введите x “))
a = Val(InputBox(“Введите a”))
m= Val(InputBox(“Введите m”))
w = 0.5*Sqr(x*a*abs(1 - m * m))
z = cos(log(w)/( 2 + w))
MsgBox (“w=” & w )
MsgBox (“z=” & z )
End Sub
Для проверки результатов введем в ячейку G24 формулу:
=0,5*КОРЕНЬ((C17*C18)*ABS(1-C19*C19))
А в ячейку H24:
=COS(LN(ABS(G24))/(2+G24))
Для очистки ячеек рабочего листа можно использовать метод Clear для объектов Cells() и Range().
Т.о. программный код кнопки «Очистить» будет выглядеть следующим образом:
Private Sub CommandButton4_Click()
Worksheets("Лист2").Range("g25").Clear
Worksheets("Лист2").Range("h25").Clear
End Sub
Если необходимо очистить диапазон ячеек, либо все ячейки рабочего листа, то нужно записать:
Private Sub CommandButton4_Click()
Worksheets("Лист1").Range("d8:d12").Clear ‘очистка диапазона ячеек
Worksheets("Лист2").Сells.Clear ‘очистка всех ячеек
End Sub
Свойства ячеек также можно менять программно, например, если нужно вывести значения на рабочем листе «Лист1», используя размер 14 и шрифт Times New Roman, то надо записать в процедуре перед выводом данных:
Worksheets("Лист1").Range("a2").Font.Name = "Times New Roman"
Worksheets("Лист1").Range("a2").Font.Size = 14
Отладка программы. Если при вводе оператора была допущена синтаксическая ошибка, то редактор VBA помечает строку красным цветом. При возникновении ошибки во время запуска программы (например, деление на 0) происходит прерывание выполнения программы и вывод сообщения о типе ошибки. При этом в окне сообщения можно выбрать режим остановки программы End или перехода в окно отладки программы Debug. Строка с ошибкой или процедура, где возникла ошибка, будет помечена желтым цветом.
Для исправления ошибки нужно прервать программу, нажав кнопку Reset на панели инструментов редактора VBA, исправить ее и запустить программу заново. Или исправить ошибку, затем продолжить выполнение программы, нажав кнопку Continue(Run).
Содержание заданий
1. Создать командную кнопку с заголовком «Пример расчета». Набрать для этой командной кнопки приведенный выше текст линейной программы и выполнить программу щелчком мыши по кнопке.
2. Создать командную кнопку c заголовком «Расчет по формулам» и записать для нее программу по условию, приведенному в табл. 4.2.
Выполнить программу и проанализировать результаты.
Таблица 4.2
№ | Формула для вычислений | Исходные данные |
ЦИКЛЫ В ИНЖЕНЕРНЫХ РАСЧЕТАХ
Если в программе необходимо повторить один оператор или последовательность операторов несколько раз, используются операторы циклов. Операторы циклов заключают такой оператор или группу операторов между ключевыми словами начала и конца цикла и определяют условия повтора выполнения. Параметром цикла называется переменная, которая используется при проверке условия цикла и принудительно изменяется на каждой итерации. Если параметр цикла целочисленный, он называется счетчиком цикла. Имеется большой выбор средств организации циклов, которые можно разделить на две группы: циклыFor ... Nextи циклыDo ... Loop
5.1 Циклы For ... Next
Циклы For…Next используются, когда заранее определено, сколько раз должны выполняться операторы цика.
For <счетчик> = <нач. значение> То <кон. значение> Step <приращение>
<операторы>
Next
В роли счетчика количества повторений в цикле может выступать любая переменная числового типа. Приращение может быть как положительным, так и отрицательным числом. Если приращение равно единице, то конструкция Step может быть опущена. Если приращение отрицательно, то начальное значение, естественно, должно быть больше конечного.
Например, в следующей программе счетчиком является переменная целого типа, увеличивающаяся на каждом шаге цикла на 1:
For i = 1 To 10
C=i^2
MsgBox C
Next
В результате выполнения программы будут выведены в окно сообщений квадраты целых чисел от 1 до 10.
В другом примере значения функции Sin(x) полученные на интервале от 0 до 1 с приращением аргумента 0,1, будут выведены в ячейки первого столбца рабочего листа Лист1начиная с первой строки:
i=1 ‘номер строки, в ячейки которой осуществляется вывод
For x = 0 To 1 Step 0.1
y=Sin(x)
Worksheets(“Лист1”).Cells(i, 1)=y
i=i+1 ‘номер строки увеличивается на 1
Next
5.2 Циклы Do...Loop
Циклы Do...Loop используются в тех случаях, когда заранее неизвестно, сколько раз должна выполняться расположенная в теле цикла группа операторов. Такой цикл продолжает работу до тех пор, пока не будет выполнено определенное условие. Существуют 4 типа операторов цикла Do...Loop:
1) Цикл с ключевым словом While продолжает свою работу, пока условие остается истинным, т.е. пока условие выполняется, и задается в двух вариантах, представленных ниже.
Do While <условие> <операторы > Loop | Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. |
Do <операторы> Loop While <условие> | Условие проверяется после того, как операторы, составляющие тело цикла, будут выполнены хотя бы один раз. |
2) Цикл с ключевым словом Until продолжает свою работу, пока условие является ложным, т.е. условие не выполняется, и задается в двух вариантах, представленных ниже.
Do Until <условие> <операторы> Loop | Условие проверяется до того, как выполняется группа операторов, образующих тело цикла. |
Do <операторы> Loop Until <условие> | Условие проверяется после того, как операторы, составляющие тело цикла, будут выполнены хотя бы один раз. |
Если условие постоянно будет ложно, то программа зациклится. Чтобы этого не произошло, значения переменных, входящих в условие, должны изменяться в теле цикла. Если произошло зацикливание (зависание машины), надо прервать программу нажатием Ctrl + Break и исправить ошибку.
Пример 1. На складе ежедневно происходит обновление товара. Все данные о видах товара заносятся в таблицу рис. 5.1. Необходимо определить, какое количество видов товара находится на складе.
Для решения этой задачи необходимо подсчитать, количество записей в таблице. Для этого создадим командную кнопку и напишем для нее следующую процедуру:
Private Sub CommandButton1_Click()
i = 3 ‘строка с которой начинаются записи в таблице
Do Until Worksheets("Склад").Cells(i, 3) = "" ‘проверяется условие – не являеся ли строка пустой
i = i + 1 ‘подсчитывается количество заполненных строк
Loop
Worksheets("Склад").Cells(i + 4, 1) = "Общее количество видов"
Worksheets("Склад").Cells(i + 4, 3) = i
End Sub
Рис. 5.1 − Образец оформления рабочего листа для примера 1
Цикл будет работать до тех пор, пока не встретится пустая строка. В переменной i после окончания цикла будет записан номер строки, следующей за последней заполненной строкой таблицы. Результат выведется в первый и третий столбец на 4 строки ниже последней строки таблицы.
Пример 2. Пусть необходимо вычислить значения на интервале x=3 (0,1) 4(х меняется от 3 до 4 с шагом 0,1).
Создадим командную кнопку и напишем для нее следующую процедуру:
Private Sub CommandButton1_Click()
x=3 : n=1
Do While x<=4
t=Sin(x)^2+Exp(3-x)
Worksheets(“Лист1”).Cells (1, n) =t
x=x+0.1 : n=n+1
Loop
End Sub
Перед началом цикла переменной x присваивается начальное значение 3. Затем в начале цикла проверяется условие x<=4, где 4 − конечное значение x. Если это условие верно, то выполняются все операторы, входящие в тело цикла и вычисляется значение x, увеличенное на величину шага. Как только условие x<=4 станет неверным, циклический процесс и выполнение программы завершается.
В этой программе в одной строке записано два оператора, разделенные двоеточием. Результаты вычислений размещаются в первой строке на рабочем листе Excel.
Пример 3. Пусть нужно вычислить значение q по формуле: для z={1; 4; 7,5; 9; 15}и a=3, а также для значений z=0 (0,5) 5. Ввод исходных данных должен осуществляться из ячеек рабочего листа. Вывод результатов надо организовать в ячейки на рабочем листе Excel.
Составим две процедуры. Первую с использованием оператора цикла For ... Next и вторую с использованием оператора цикла Do...Loop. Для решения задачи оформим рабочий лист согласно образцу:
Рис. 5.2 − Образец оформления рабочего листа для примера 3
Для кнопки «Расчет For ... Next»составим следующую процедуру:
Private Sub CommandButton1_Click()
a = 3
j = 18' j − это номер строки, в которую введено первое значение z
For i = 1 To 5 ‘счетчик количества значений переменной z
z = Worksheets("Лист4").Cells(j, 2)
q = Sqr(z ^ 2 + 8 * a) * Log(z + 0.5)
Worksheets("Лист4").Cells(j, 3) = q
j = j + 1
Next i
End Sub
Для кнопки «Расчет Do...Loop» процедура может иметь вид:
Private Sub CommandButton2_Click()
a = 3 : j = 18 : z = 1
Do While z <= 5
q = Sqr(z ^ 2 + 8 * a) * Log(z + 0.5)
Worksheets("Лист4").Cells(j, 8) = q
z = z + 0.5
j = j + 1
Loop
End Sub
Для проверки результатов вычислений с помощью формул Excel в ячейку D15 можно поместить формулу:
=КОРЕНЬ(B15^2+8*$J$7)*LN(B15+0,5).
Её надо скопировать в ячейки D16:D19 и в ячейки I15:I23. Результат расчета с помощью VBA и Excel должен совпасть.
Содержание заданий
1. Выполнить приведенные выше примеры циклических программ.
2. В табл. 5.1 приведены формулы и два варианта исходных данных, по которым надо составить две программы с одними и теми же расчетными формулами. Предусмотреть вывод результатов в ячейки таблицы на рабочем листе Excel.
Таблица 5.1
№ | Формула для вычислений | For...Next | Do...Loop |