Как подготвиться к контрольной работе по VBA

VBA — не самый сложный язык программирования, тем не менее, успешное написание контрольной работы требует определенной подготовки.

Рассмотрим несколько базовых вопросов, которые могут присутствовать в контрольной работе по языку программирования VBA.

* * *

Первое. Определить значение выражения в VBA. Вопрос может присутствовать как в варианте — оределить значение выражения, так и написать функцию, которая определяет значение выражения.

Тем не менее, и в одном и в другом случае рекомендуется написание функции, — вычисление даже кажущегося простым выражения лучше доверить программе, — она найдет решение гораздо быстрее, и, главное, не ошибётся.

Итак, если задание состоит в вычислении на VBA значения, например, 24 \ 4 ^ 2 + 18 mod 4, то необходимо:

1. Войти в редактор VBA (Сервис/Макрос/Редактор Visual Basic или сочетание клавиш Alt F11)
2. При необходимости — вставить Модуль VBA (Insert/Module) или войдите в уже имеющийся.
3. Вставить в модуль функцию VBA — ее лучше назвать test (Insert/Procedure далее установить переключатель в окне Type в положение Function и в окно Name ввести test, и, наконец нажать OK), в результате в модуле будет введено:

Public Function test()

End Function

4. Записать в теле функции, то есть после строки Public Function test() но до строки End Function строку, в которой идентификутору функции (т.е. test) присваивается упомянутое значение выражения, то есть строку test = 24 \ 4 ^ 2 + 18 mod 4, в результате функция будет выглядеть так:

Public Function test()
   test = 24 \ 4 ^ 2 + 18 Mod 4
End Function

5. Провести компиляцию функции (Debug/Compile VBAProject)
6. Перейти в Лист Excel и ввести в ячейку (например, A1), нажать кнопку f(x) для вставки функции, в окне Категория Мастера функций выбрать Определенные пользователем (эта категория в самом конце списка), затем в окне Выберите функцию — выбрать функцию test, нажать OK, а после появления окна Аргументы функции — нажать OK еще раз.
7. В результате в ячейке Excel будет выведено результирующее значение, в данном случае 3.

* * *

Если же задание состоит в том, чтобы просто вставить нужные операторы (заголовок функции и строка окончания уже введены) — задача несколько упрощается (т.е. п. 3 уже выполнен), но необходимо правильно, т.е. в соответствии с правилами приоритетов VBA, ввести выражение.

Например, если речь идет о вычислении значения выражения:

то необходимо записать следующий код:

Public Function funct1(x)
    funct1 = (1-x^2)/(2-3*x)
End Function

то есть числитель и знаменатель берутся в скобки, и также не слудует забывать про знак умножения (*).

Если же в примере идет речь о значении выражения, зависящем от параметра x, наример, если если x больше 3, то funсt2=(1-2x)/(2+x), иначе funct2=Sin(3x)-1, то необходимо задание условия с помощью операторов VBA If … Then … Else. В данном случае функция будет выглядет так:

Public Function funct2(x)
    If x > 3 Then funct2 = (1-2*x) / (2+x) Else funct2 = Sin(3*x)-1
End Function

После компиляции можно повести отладку функции и убедиться, что при задании в качестве аргумента 5 в качестве результата будет выведено -1,28571.

* * *

Второе. Более сложные задания, с которыми тем, не менее необходимо разобраться для получения положительной оценки, также относятся к условной категории «ветвление» и могут выполняться с помощью операторов VBA If … Then … Else или, в некоторых случаях, оператора Case.

В качетсве примера такого задания можно привести выбор из трех произвольных чисел минимального (максимального), нахождения минимального (максимального) произведения двух чисел при трех заданных, проверки существования треугольника при трех заданных длиннах его сторон и последующего нахождения его площади, а также проверки существования треугольника при трех заданных длиннах его сторон и вывода длины самой короткой стороны.

Public Function fun3(a, b, c)
If (a + b > c) And (a + c > b) And (b + c > a) Then
    If a > b And a > c Then
       fun3 = a
    ElseIf b > a And b > c Then fun3 = b
    Else
       fun3 = c
    End If
Else
    fun3 = "треугольник не существует"
End If
End Function

Несколько заданий предполагают использование циклов VBA (про формат операторов цикла — по ссылке), в которых число повторений известно заранее, т.е. циклов For… Next. Число повторений, в частности, может быть явно следовать из условия, например, вычисление суммы S=1+2^2+3^2+…+25^2 предполагает 25 повторений, суммы S=1-2^3+3^3-…-20^3 предполагает 20 повторений, а также число повторений может быть входным параметром функции, например, при вычисление суммы S=2/(1*3)-4/(3*5)+6/(5*7)+…+(2*n)/((2*n-1)*(2*n+1)).

Обратите внимание, что в последнем, как и в предпоследнем случае для слагаемых имеет место чередование знаков, т.е. одно из них положительное, следующее — отрицительное и т.д.

Даже в этом случае функция достаточно проста:

Public Function fun5(n)
fun5 = 0
Dim i As Single

For i = 1 To n
    fun5 = fun5 + (-1) ^ (i+1) * ((2*i) / ((2*i-1) * (2*i+1)))
Next i
End Function

Замечание. Синим цветом выделен множитель (-1) ^ (i+1), обеспечивающий знакочередование, т.е. для четных зачений i слагаемое будет иметь положительный знак, для нечетных — отрицательный, как и требуется в условии.

* * *

Не более сложны и задачи на циклы, в которых число повторений заранее неизвестно и определяется в ходе выполнения алгоритма. Таковых, вообще говоря, существует 2 вида (про формат операторов цикла — по ссылке) — с предусловием и с постусловием (цикл второго вида в любом случае будет выполнен, как минимум, один раз).

Например, если необходимо вычислить произведение четных цифр заданного числа n, то реализация данного задания на VBA такова:

Public Function pr_ch_cifr(n)
'функция определяет произведение четных цифр заданного числа n
pr_ch_cifr = 1
While n > 0
    cifra = n-(n \ 10) * 10
    n = n \ 10
    If cifra \ 2 = cifra / 2 Then pr_ch_cifr= pr_ch_cifr* cifra
Wend
End Function

 

Не представляет труда изменение данной функции для нахождения суммы (произведения) (квадратов) четных (нечетных) цифр заданного числа. Однако надо обратить внимание, что при нахождении произведения его идентификатору до цикла присваивается значение 1 (в примере — pr_ch_cifr = 1, в цикле, соответственно, выполняется умножение), тогда как при нахождении суммы ее идентификатор должен до цикла быть равным 0.

Еcли же речь идет о нахождении суммы первых n простых чисел, то можно использовать следующие функции:

Public Function prostoe(nn) As Boolean
'функция определяет, является ли число простым и выдает в этом случае значение True (Истина), иначе False (Ложь)
Dim i As Integer
prostoe = False
For i = 2 To Sqr(nn)
    If nn Mod i = 0 Then
       Exit Function
    End If
Next i
prostoe = True
End Function

т.е. во-первых, вышеприведенную функцию, определяющую, является ли число простым (или даже ее более рациональный вариант без лишних повторений цикла), а во-вторых, функцию

Public Function fun6_2(n)
'функция вычсляет сумму n первых простых чисел
fun6_2 = 0
i = 1: iii = 0
While iii < n
    If prostoe(i) Then
        fun6_2 = fun6_2 + i
        iii = iii + 1
    End If
    i = i + 1
Wend

End Function

Эту функцию можно легко измененить для вычисления n-го простoго числа.

Сумму простых чисел из отpeзкa [1;n] можно найти так:

Public Function fun6_1(n)
fun6_1 = 0
Dim i As Single

For i = 1 To n Step 1
    If prostoe(i) Then fun6_1 = fun6_1 + i
Next i
End Function

Аналогично можно найти количество простых чисел из отpeзкa — просто заменив fun6_1 + i на fun6_1 + 1.

Кроме того, следует обратить внимание на функцию, которая вычисляет сумму первых n чисел Фибоначчи (числа Фибоначчи — элементы последовательности 0, 1, 1, 2, 3, 5 … в которой каждое последующее число равно сумме двух предыдущих чисел.)

Public Function fn(n As Integer) As Variant
'Функция вычисляет сумму первых n чисел Фибоначчи

Dim пред1 As Double, пред2 As Double, посл As Double, i As Integer
Dim фибоначчи
пред1 = 1
пред2 = 1
фибоначчи = пред1
For i = 1 To (n — 1)
       фибоначчи = фибоначчи + пред2
       посл = пред1 + пред2
       пред1 = пред2
       пред2 = посл
Next i
fn = фибоначчи
End Function

которую легко изменить для нахождения n-го числа Фибоначчи.