- •Работа с данными таблиц ms Excel и данными документа ms Word. Вложенные циклы; Работа с двумерными массивами;
- •1.1Примеры обращения к данным в документах и таблицах:
- •1.1.1Программа устанавливает полужирный шрифт Arial 12 пт. В выделенных ячейках.
- •1.2.2Вычислить суммы элементов над главной, над побочной, под главной и под побочной диагоналями и на диагоналях.
- •2Процедуры и функции.
- •2.1Процедура
- •2.2Функция
- •2.3Переход в подпрограмму и возвращение из подпрограммы
- •2.4Вызов процедуры
- •2.5Рекурсивные процедуры и функции
- •2.6Область определения переменной
- •2.7Время жизни переменной
- •2.8Использование функций пользователя на листе Excel
- •3Задания
2.5Рекурсивные процедуры и функции
В VBA возможно создание рекурсивных процедур, т. е. процедур, вызывающих самих себя. Стандартным примером рекурсивной процедуры является процедура вычисления факториала, т. е. функции, возвращающей результат произведения первых п натуральных чисел, где п — аргумент функции. Для этой функции имеется стандартное обозначение:
Fact(n) =n!, где Fact (0) =1.
Ясно, что
Fact(n) = n Fact (n - 1}
Основываясь на данном соотношении, приводимая ниже рекурсивная функция вычисляет значение факториала.
Function Fact(n As Integer) As Integer
If n<l Then
Fact = 1 Else
Fact = Fact(n - 1) n
End If
End Function
Другим стандартным примером применения рекурсивных функций является нахождение наибольшего общего делителя двух целых чисел по алгоритму Евклида. Наибольший общий делитель (нод) двух целых чисел — это наибольшее целое, на которое делятся оба числа. Например, HOД(10, 14} = 2 и НОД (15, 31} = 1.
Алгоритм Евклида состоит в следующем:
Если а делится на b, то НОД(а, b) = b
В противном случае — НОД(а, b) = НОД(b, a Mod b) Приводимая ниже рекурсивная функция программирует алгоритм Евклида.
Function НОД(Целое1 As Long, Целое2 As Long) As Long
If Целое2 Mod Целое1 = 0 Then
НОД = Целое1 Else
НОД = НОД(Целое2, Целое1 Mod Целое2)
End If
End Function
Несмотря на элегантность рекурсивных процедур, применять их надо с осторожностью, т. к. неаккуратное использование может привести к проблемам с памятью — многократный вызов такой процедуры быстро исчерпывает стековую память.
2.6Область определения переменной
Область определения переменной задает область, в которой может быть использована переменная. В VBA имеется три соответствующих уровня переменных:
Переменные уровня процедуры используются только в процедуре, в которой они описаны при помощи инструкции Dim, размещенной в процедуре.
Переменные уровня модуля используются только в модуле, в котором они описаны при помощи инструкции Dim, размещенной в области описания модуля, т. е. перед описанием процедур.
Общие переменные, используемые во всех модулях данного проекта. Описываются при помощи инструкции Public, размещенной в области описания модуля.
2.7Время жизни переменной
Личная (private) переменная сохраняет свое значение только пока выполняется процедура, в которой эта переменная описана. При завершении процедуры значение переменной теряется, и при повторном запуске процедуры его надо заново инициализировать. Переменные, описанные при помощи инструкции Static, сохраняют свое значение по выходу из процедуры, но пока работает программа.
2.8Использование функций пользователя на листе Excel
Вызов функции осуществляется по имени так же, как и любой другой встроенной функции Excel.
Function Ad() As String
Ad = Selection.Address
End Function
Запись в ячейке =Ad() приведёт к отображению адреса этой ячейки.
Если после заголовка указать инструкцию Application.Volatile, значение функции будет автоматически пересчитываться при каждом изменении данных листа. Эта функция будет отображать то, что и положено – последнюю изменённую ячейку или диапазон.
Function SumMas(Mas() As Integer) As Integer
M = LBound(Mas)
n = UBound(Mas)
s = 0
For i = M To n
s = s + Mas(i)
Next i
SumMas = s
End Function
Sub sss()
Dim M(1 To 20) As Integer
For i = 1 To 20
M(i) = Rnd * 100
Next i
s = SumMas(M)
MsgBox (s)
s = 0
For i = 1 To 20
s = s + M(i)
Next i
MsgBox (s)
End Sub