Функции VBA

Содержание

Слайд 2

Пользовательские процедуры Процедура является самостоятельной частью кода, которая имеет имя и

Пользовательские процедуры

Процедура является самостоятельной частью кода, которая имеет имя и может

содержать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов.
Синтаксис:
[Private | Public][Static] Sub Имя[(СписокАргументов)]
[Инструкции]
[Exit Sub]
[Инструкции]
End Sub
Инструкция Exit Sub приводит к немедленному выходу из процедуры
Слайд 3

Элементы описания процедуры

Элементы описания процедуры

Слайд 4

Синтаксис элемента СписокАргументов [Optional] [ByVal | ByRef] [ParamArray] имяПеременной[( )] [As тип] [= поУмолчанию]

Синтаксис элемента СписокАргументов

[Optional] [ByVal | ByRef] [ParamArray] имяПеременной[( )] [As тип]

[= поУмолчанию]
Слайд 5

Синтаксис элемента СписокАргументов

Синтаксис элемента СписокАргументов

Слайд 6

Примеры Sub Main() Calc 99, 43 ‘один из вариантов вызова Call

Примеры

Sub Main()
Calc 99, 43 ‘один из вариантов вызова
Call Calc(38, 49)

‘второй вариант вызова
End Sub
Sub Calc(x As Single, y As Single)
If x * y < 0 Then
MsgBox "Корень локализован"
Else
MsgBox "Корень не локализован"
End If
End Sub
Слайд 7

ParamArray Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant) Dim intI

ParamArray

Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant)
Dim intI As

Integer
Debug.Print strName; " Scores"
For intI = 0 To UBound(intScores())
Debug.Print " "; intScores(intI)
Next intI
End Sub
Примеры вызова:
AnyNumberArgs "Jamie", 10, 26, 32, 15, 22, 24, 16
AnyNumberArgs "Kelly", "High", "Low", "Average", "High"
Слайд 8

Конфликты имён Если в двух модулях находятся процедуры или функции с

Конфликты имён

Если в двух модулях находятся процедуры или функции с одинаковыми

именами, то во избежание конфликтов их рекомендуется вызывать с использованием имени модуля:
Sub Main()
Module1.MyProcedure
End Sub
Слайд 9

Примеры

Примеры

Слайд 10

Пользовательские функции Синтаксис инструкции Function содержит те же элементы, что и

Пользовательские функции

Синтаксис инструкции Function содержит те же элементы, что и sub.

Инструкция Exit Function приводит к немедленному выходу из процедуры Function.
Синтаксис:
[Public | Private] [Static] Function Имя [(СписокАргументов)] [As Тип]
[Инструкции]
[Имя = Выражение]
[Exit Function]
[Инструкции]
[Имя = Выражение]
End Function
Слайд 11

Подобно процедуре Sub, процедура Function является самостоятельной процедурой, которая может получать

Подобно процедуре Sub, процедура Function является самостоятельной процедурой, которая может получать

аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. В отличие от процедуры sub, когда требуется использовать возвращаемое функцией значение, Function может применяться в правой части выражения, как и любая другая встроенная функция, например, cos.
Процедура Function вызывается в выражении по своему имени, за которым следует список аргументов в скобках. Для возврата значения из функции следует присвоить значение имени функции. Любое число таких инструкций присвоения может находиться в любом месте процедуры.
Слайд 12

Рекомендации по компоновке функции При вызове функций, помимо значения функции бывает

Рекомендации по компоновке функции

При вызове функций, помимо значения функции бывает полезно

получить какую-либо информацию о ходе вычислений (достигнутая точность, возникшие ошибки и т.п.). Поэтому помимо входных переменных целесообразно заложить в заголовок одну или больше выходных переменных.
Пример организации такой функции:
Function SQRT(X As Double, flErr As Boolean) As Double
'Вычисление квадратного корня (модификация)
flErr = (X < 0) 'возвращаем флаг ошибки
SQRT = 0 'Задаём значение по умолчанию
If Not flErr Then SQRT = Sqr(X)
End Function
Слайд 13

Передача массивов, как аргументы функции Синтаксис: (ByVal | ByRef) Arrayname() As

Передача массивов, как аргументы функции

Синтаксис: (ByVal | ByRef) Arrayname() As type
Arrayname

– имя передаваемого массива
type – представляет любой допустимый тип VBA или определенный пользователем тип.
Круглые скобки являются обязательными.
Прим. Лучше передавать массивы через ByRef (по ссылке), чтобы не увеличивать объёмы задействованной памяти.
Пример:
Function Fun(ByVal A() as Byte) as Boolean
Слайд 14

Операторы перехода и выбора

Операторы перехода и выбора

Слайд 15

Операторы перехода и выбора

Операторы перехода и выбора

Слайд 16

Операторы перехода и выбора

Операторы перехода и выбора

Слайд 17

IF. Примеры Использование If в качестве переключателя логической переменной можно избежать.

IF. Примеры

Использование If в качестве переключателя логической переменной можно избежать.
Обычное решение: Dim

fl as Boolean, x as Double If x>0 then fl = true else fl = false
Endif
Короткая запись: fl = (x>0)
Слайд 18

Примеры В зависимости от значения Cityname возвращает язык Matchup = Switch(CityName

Примеры

В зависимости от значения Cityname возвращает язык
Matchup = Switch(CityName =

"London", "English", CityName = "Rome", "Italian", CityName = "Paris", "French")
Если Test>10, то много, иначе, мало
IIf(Test > 10, "много", "мало")
Choose(1, "Верх", "Низ", "Бок")
Вернёт "Верх"
Слайд 19

Select Case Select Case sDayOfWeek Case "Понедельник" MsgBox "Пн" Case "Вторник"

Select Case

Select Case sDayOfWeek
Case "Понедельник"
MsgBox "Пн"
Case "Вторник"
MsgBox

"Вт"

Case Else
MsgBox "Нет такого"
End Select
Слайд 20

Операторы повтора For - Next Синтаксис: For Счётчик = Начало То

Операторы повтора For - Next

Синтаксис:
For Счётчик = Начало То Конец [Step

Шаг]
[Инструкции]
[Exit For]
[Инструкции]
Next [Счётчик]
Повторяет выполнение группы инструкций, пока Счётчик изменяется от начального значения до конечного с указанным шагом. Если Шаг не указан, то он полагается равным 1.
Альтернативный способ выхода из цикла предоставляет инструкция Exit For
Пример:
For i=1 to 10 Step 2
j=j+1
Next i
Слайд 21

Операторы повтора For Each - Next Синтаксис: For Each Элемент In

Операторы повтора For Each - Next

Синтаксис:
For Each Элемент In Группа
[Инструкции]

[Exit For]
[Инструкции]
Next [Элемент]
Повторяет выполнение группы инструкций для каждого элемента массива (array) или семейства (collection). Альтернативный способ выхода из цикла предоставляет инструкция Exit For.
Прим. Для коллекций работает быстрее, чем оператор For - Next
Слайд 22

Пример Sub TestForEachNextRange() For Each iCell In Range("A1:C5") i = i

Пример

Sub TestForEachNextRange()
For Each iCell In Range("A1:C5")
i = i

+ 1
iCell.Value = 10*Int(Rnd*10) & "_" & i
Next
MsgBox "Число ячеек : " & i
End Sub
iCell - переменная, которой присваиваются значения элементов группы (массива или семейства) Для работы с элементами массива переменная должна принадлежать к типу Variant.
Слайд 23

Пример цикла For Each - Next Примечание: Пример в презентации сделан

Пример цикла For Each - Next

Примечание: Пример в презентации
сделан с

использованием
внедрённого объекта MS Excel
Слайд 24

Операторы повтора. Do While | Until - Loop Синтаксис: Do [While

Операторы повтора. Do While | Until - Loop

Синтаксис:
Do [While | Until

Условие]
[Инструкции]
[Exit Do]
[Инструкции]
Loop
Повторяет выполнение набора инструкций, пока условие имеет значение True | False. Если условие ложно (т.е. False | True соответственно) уже при входе в цикл, то следует передача управления команде, следующей за Loop
Альтернативный способ выхода из цикла предоставляет инструкция Exit Do
Слайд 25

Синтаксис: Do [Инструкции] [Exit Do] [Инструкции] Loop [While | Until Условие]

Синтаксис:
Do
[Инструкции]
[Exit Do]
[Инструкции]
Loop [While | Until Условие]
Повторяет

выполнение набора инструкций, пока условие имеет значение True | False.
Цикл выполнится по крайней мере 1 раз.
Альтернативный способ выхода из цикла предоставляет инструкция Exit Do

Операторы повтора. Do Loop - While | Until

Слайд 26

Пример Цикла Do – Loop While Sub DoWhile() Const N =

Пример Цикла Do – Loop While

Sub DoWhile()
Const N = 1000
Dim A(N)

As String, i As Integer
i = 0
Do
i = i + 1
A(i) = InputBox(i & " Value?")
Loop While A(i) > 0
MsgBox "Read " & i & " values"
End Sub
Слайд 27

While Условие [Инструкции] Wend Выполняет последовательность инструкций пока условие истинно. В

While Условие
[Инструкции]
Wend
Выполняет последовательность инструкций пока условие истинно.
В отличие от других

циклов не имеет альтернативного выхода.
По возможности следует избегать его применения

Операторы повтора. While - Wend

Слайд 28

Встроенные функции VBA В VBA имеется большой набор встроенных функций и

Встроенные функции VBA

В VBA имеется большой набор встроенных функций и процедур,

использование которых существенно упрощает программирование. Эти функции можно разделить на следующие основные категории:
Математические функции
Функции проверки типов
Функции преобразования форматов
Функции обработки строк
Функции времени и даты
Прочие функции
Слайд 29

Математические функции

Математические функции

Слайд 30

Математические функции

Математические функции

Слайд 31

Математические функции

Математические функции

Слайд 32

Некорректные математические операции Есть минимум две математические операции, которые VBA, как

Некорректные математические операции

Есть минимум две математические операции, которые VBA, как и

многие другие языки выполняют некорректно.
1. Возведение 0 в 0 степень с математической точки зрения не определено. Однако:
Sub Pow()
Dim x As Double, i As Integer
i = 0
x = 0 ^ i
MsgBox x
End Sub
Слайд 33

Некорректные математические операции 2. Корни нечётных степеней от отрицательных чисел в

Некорректные математические операции

2. Корни нечётных степеней от отрицательных чисел в математике

определены. Однако, из-за того, что они вычисляются при помощи соответствующих дробных степеней, реализованных, как и остальные степени в машинной арифметике через логарифмы, это вызывает ошибку.
Sub SQ()
Dim x As Double
x = -9
x = x ^ (1 / 3) ‘даст ошибку
x = Sgn(x)*Abs(x) ^ (1 / 3) ‘не даст ошибку
MsgBox x
End Sub
Слайд 34

Производные функции Тригонометрические функции Sec(X) = 1/Cos(X) Cosec(X) = 1/Sin(X) Cotan(X)

Производные функции Тригонометрические функции

Sec(X) = 1/Cos(X)
Cosec(X) = 1/Sin(X)
Cotan(X) = 1/Tan(X)
Arcsin(X) = Atn(X/Sqr(-X

* X + 1))
Arccos(X) = Atn(-X/Sqr(-X * X + 1)) +
+ 2 * Atn(1)
Arcsec(X) = Atn(X/Sqr(X * X – 1)) +
Sgn((X) – 1) * (2 * Atn(1))
Arccosec(X) = Atn(X/Sqr(X * X - 1)) +
+ (Sgn(X) – 1) * (2 * Atn(1))
Arccotan(X) = Atn(X) + 2 * Atn(1)
Слайд 35

Гиперболические функции Sinh(X) = (Exp(X) – Exp(-X)) / 2 Cosh(X) =

Гиперболические функции

Sinh(X) = (Exp(X) – Exp(-X)) / 2
Cosh(X) = (Exp(X)

+ Exp(-X)) / 2
Tanh(X) = (Exp(X) – Exp(-X)) / (Exp(X) + Exp(-X))
Sech(X) = 2 / (Exp(X) + Exp(-X))
Cosech(X) = 2 / (Exp(X) – Exp(-X))
Cotanh(X) = (Exp(X) + Exp(-X)) / (Exp(X) – Exp(-X))
Arcsinh(X) = Log(X + Sqr(X * X + 1))
Arccosh(X) = Log(X + Sqr(X * X – 1))
Arctanh(X) = Log((1 + X) / (1 – X)) / 2
Arcsech(X) = Log((Sqr(-X * X + 1) + 1) / X)
Arccosech(X) = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X)
Arccotanh(X) = Log((X + 1) / (X – 1)) / 2
LogN(X) = Log(X) / Log(N) ‘Логарифм по основанию N
Слайд 36

Функции даты и времени

Функции даты и времени

Слайд 37

Функции даты и времени

Функции даты и времени

Слайд 38

Функции даты и времени

Функции даты и времени

Слайд 39

Функции даты и времени (продолжение)

Функции даты и времени (продолжение)

Слайд 40

Функции даты и времени (продолжение)

Функции даты и времени (продолжение)