Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
КАФЕДРА ИНФОРМАТИКИ
А.М. ВЛАСОВЕЦ
ВВЕДЕНИЕ В VBA
УЧЕБНОЕ ПОСОБИЕ
ИЗДАТЕЛЬСТВО
САНКТ-ПЕТЕРБУРГСКОГО ГОСУДАРСТВЕННОГО УНИВЕРСИТЕТА
ЭКОНОМИКИ И ФИНАНСОВ
2010
2
ББК 32.81
В 58
Власовец А.М.
1
Сигнатура метода – это сокращенная форма записи параметров метода и типов
возвращаемого значения.
6
1
Элемент, заключённый в квадратные скобки, не обязателен, а угловые скобки озна-
чают понятие.
8
мер, As, Dim, For, Integer и т.п., VBA выделяет синим цветом и первую
букву делает прописной.
Текст программы на языке VBA состоит из последовательности
предложений, каждое из которых представляет собой комбинацию ключе-
вых слов и идентификаторов.
Строка – произвольная последовательность символов алфавита,
заключенная в двойные кавычки (“”). Если строка включает символ кавыч-
ки, перед ним ставится еще один такой же символ, чтобы отличить его от
символа конца строки, например “ОАО ““Океан””.
Число используется для представления дробных и целых чисел. Це-
лое число записывается в виде последовательности цифр. Для записи де-
сятичных чисел в качестве разделителя десятичных знаков используется
точка “.”. Для записи чисел можно использовать экспоненциальную форму.
Строка – произвольная последовательность символов алфавита,
заключенная в двойные кавычки (“”). Если строка включает символ кавыч-
ки, перед ним ставится еще один такой же символ, чтобы отличить его от
символа конца строки, например “ОАО ““Океан””.
2.2. Переменные
Переменные предназначены для хранения данных в оперативной
памяти. В программе перед использованием переменные нужно объяв-
лять. При объявлении переменной надо задаётся её имя и тип. Тип ука-
зывает способ представления переменной. В переменных можно хранить
11
Объектные типы
Object Рисунок или 4 байта Ссылка на объект
ссылка на любой
другой объект
Типы Variant
12
Примечание
Инструкция присваивания и функция MsgBox будут подробно рас-
смотрены ниже.
Для изменения начала нумерации индексов массива можно посту-
пить одним из следующих способов.
1. Использовать инструкцию Option Base 1. При этом инструк-
ция Option Base 1 должна находиться в самом начале модуля
VBA, перед первой процедурой модуля, например,
Option Base 1
Sub ОбъявлениеМассива2()
'
Dim Товар(3) As String * 15
Товар(1) = "Стул мягкий"
MsgBox Товар(1)
'
End Sub
По умолчанию инструкция Option Base имеет значение 0 (ноль).
2. Выполнить явное указание номера первого элемента в каждой
размерности массива, например,
Sub ОбъявлениеМассива3()
'
Dim Товар(1 To 3) As String * 15
Товар(1) = "Стул мягкий"
MsgBox Товар(1)
'
End Sub
Примечания
1. Наличие инструкции Option Base 1 не влияет на индексацию эле-
ментов массива, если в его объявлении используется конструкция
<нижняя граница> To <верхняя граница>
Массив Продажи можно объявить так:
Dim Продажи(1 To 5, 1 To 10) As String
2. Элементы массива Продажи имеют тип строковая переменная
неопределённой длины.
Выше рассмотрено объявление массивов, связанных с обработкой
только статических данных, т.е. таких, память под которые выделяется во
время компиляции и сохраняется в течение всей работы программы.
В VBA существует другой способ выделения памяти под массивы, ко-
торый называется динамическим, в котором память под массивы отводит-
ся и может быть перераспределена во время выполнения программы. Та-
кие массивы называются динамическими.
Использование динамических величин предоставляет возможность
подключать память динамически, что позволяет:
− увеличить объем обрабатываемых данных;
− если потребность в каких-то данных отпала до окончания про-
граммы, то занятую ими память можно освободить для другой ин-
формации;
− определять динамически изменяющееся количество реально су-
ществующих элементов массива.
Динамический массив объявляется следующим образом:
[Public | Private] Dim ИмяМассива() [As ТипДанных]
т.е. размерность динамического массива в его объявлении не указывает-
ся.
Пример
Dim Товар() As String * 15
Перед использованием динамического массива необходимо переопреде-
лить его размеры. Это выполняется при помощи инструкции ReDim, ис-
пользуемой на уровне процедуры:
ReDim [Preserve] ИмяМассива(Индексы) [As ТипДанных]
Параметр Preserve используется для сохранения данных в сущест-
вующем массиве при изменении размерности. В противном случае все
старые значения элементов массива будут удалены. Однако если новый
размер массива меньше, чем количество помещенных в него элементов,
часть данных будет потеряна.
Примеры
ReDim Товар(1 To 3) As String * 15
ReDim Preserve Товар(1 To 10) As String * 15
18
Логические операции
[Операнд1] And [Операнд2] Логическое умножение
[Операнд1] Or [Операнд2] Логическое сложение
[Операнд1] Хог [Операнд2] Исключающее or (или)
[Операнд1] Not [Операнд2] Логическое отрицание
Строковые операции
[Строка1] & [Строка2] Сложение (объединение) строк
Приоритеты операций
Приоритет Операция
1 Вызов функции и скобки
2 ^
3 – (смена знака)
4 *, /
5 \
6 Mod
7 +, –
8 >, <, >=, <=, =
9 Not
10 And
11 Or
12 Xor
− Application (Приложение)
− WorkBook (Рабочая книга)
− Worksheet (Рабочий лист)
− Range (Диапазон)
− Chart (Диаграмма)
Объект Application представляет саму программу Excel.
Объект WorkBook представляет рабочую книгу Excel, т.е. файл Excel.
Объект Worksheet (Рабочий лист) – отдельная страница в рабочей
книге, имеющая индивидуальное имя и предназначенная для хранения
данных и выполнения вычислений.
Рабочий лист в свою очередь состоит из ячеек. Ячейки представляет
объект Range, который может состоять из одной или нескольких ячеек.
Одним из часто используемых объектов является объект Chart (Диа-
грамма). Все, действия, которые можно выполнить с диаграммами в Excel,
можно запрограммировать в VBA.
2.8.2.1. Иерархия объектной модели
На вершине объектная модель Excel находится объект Application.
Под этим объектом расположены другие объекты, среди которых находит-
ся WorkBook. В терминологии объектно-ориентированного программиро-
вания такое подчинение одного объекта другому называется вложением,
т.е. объект WorkBook вложен в объект Application, а объект Worksheet –
в объект WorkBook.
2.8.2.2. Ссылка на объекты в коде VBA
Концепция вложения объектов широко используется при создании
ссылок на объекты в коде VBA. Для полного определения объекта необхо-
димо указать последовательно все уровни иерархии объектной модели.
Например, чтобы сослаться на ячейку А1 на рабочем листе Лист1 рабочей
книги Книга1, надо применить следующий код:
Application.Workbooks("Книга1").Worksheets("Лист1").Range("A1")
Если в программе нет ссылки на другое активное приложение, то
объект Application можно не указывать, и предыдущая ссылка может быть
представлена так:
Workbooks("Книга1").Worksheets("Лист1").Range("A1")
Если активной является Книга1, то объект Книга1 можно не указы-
вать, и предыдущая ссылка может быть представлена так:
Worksheets("Лист1").Range("A1")
Аналогично, если активным листом является Лист1, то ссылка может
быть записана так:
Range("A1")
25
Range("A1").Value = 10
Range("B1").Value = “Товар”
2.8.3.4. Коллекции
Коллекцией называется группа подобных объектов. Рассмотрим сле-
дующее полное имя объекта:
Workbooks("Финансы ").Worksheets("Лист1").Range("A2:D2")
28
Инструкция
Range("A1:B2").Activate
выделяет диапазон A1:B2 рабочего листа Лист1 при помощи метода
Activate (рис. 3).
чить справку: имя объекта, его свойства, метода или события, ключевое
слово инструкции VBA и т.п.
В качестве примера рассмотрим получения сведений о функции
Array.
1. Войти в редактор Visual Basic. Это можно сделать двумя способами:
− щёлкнуть по кнопке Редактор Visual Basic
или
− одновременно нажать на клавиши Alt и F11.
2. Если в окне Project – VBAProject нет ни одного модуля, вставить мо-
дуль в текущую рабочую книгу. Для этого в окне Microsoft Visual Basic
выбрать пункт меню Insert и в выпадающем окне – пункт Module
.
3. В окне кода редактора Visual Basic ввести символ Одиночная кавыч-
ка (‘), а за ней – слово array.
4. Установить текстовый курсор внутри слова 'Array (рис.7).
vbOKOnly 0
VbOKCancel 1
VbAbortRetrylgnore 2
VbYesNoCancel 3
VbYesNo 4
VbRetryCancel 5
VbQuestion 32
VbExclamation 48
VbInformation 64
Sub ФункцияMsgBox()
Dim Структура As String
Dim Кнопка As Integer
'
' В переменной Структура задается структура диалогового окна
Структура = vbYesNoCancel + vbQuestion + vbDefaultButton1
' В переменную Кнопка вводится целое число, возвращаемое MsgBox
'при нажатии кнопки Да, Нет или Отмена в окне сообщения функции
MsgBox
'
Кнопка = MsgBox("Выбрать Да, Нет или Отмена?", Структура, "Примеры
функции MsgBox")
'
' На экране отображается соответствующее сообщение '
' в зависимости от значения переменной Кнопка
‘
MsgBox "Равно " & Кнопка, , "Возвращаемое значение"
If Кнопка = vbYes Then MsgBox "Выбрано Да", vbExclamation, "ПРИМЕР 1"
If Кнопка = vbNo Then MsgBox "Выбрано Нет", vbExclamation, "ПРИМЕР 2"
If Кнопка = vbCancel Then MsgBox "Выбрано Отмена",
vbExclamation,"ПРИМЕР 3"
End Sub
Ниже приведены диалоговые окна, выведенные на экран в процессе
выполнения процедуры ФункцияMsgBox(). Окна ПРИМЕР 1, ПРИМЕР 2 и
ПРИМЕР 3 появляются при нажатии кнопок, соответственно, Да, Нет и
Отмена. В окне Возвращаемое значение выводится число 6 при выполне-
нии инструкции MsgBox "Равно " & Кнопка, , "Возвращаемое значение", ес-
ли нажата кнопка Да.
42
Пример
Следующая процедура выполняется при щелчке правой кнопкой
мыши на рабочем листе. Она используется, если необходимо отключить
появление контекстного меню на рабочем листе. В ней устанавливается
значение аргумента Cancel равным True, что приводит к отмене обработки
52
Клавиша-модификатор Код
Shift +
Ctrl ^
Alt %
Пример
В следующем примере для вызова процедуры Пример1 назначена клави-
ша F1, а для процедуры Пример2 – комбинация клавиш Ctrl и Стрелка
вверх ( ). Назначение клавиш этим процедурам производится в процедуре
Setup_OnKey, которая автоматически вызывается процедурой автозапуска
Auto_Open при загрузке рабочей книги Excel. Это необходимо для назна-
чения клавишей процедурам.
Sub Auto_Open()
Call Setup_OnKey
'MsgBox "AUTO_EXEC"
End Sub
Sub Setup_OnKey()
Application.OnKey "{F1}", "Пример1"
Application.OnKey "{UP}", "Пример2"
End Sub
Sub Пример1()
d = "Дата " & Date
MsgBox "Переназначение клавиш_1" & Chr(13) & "Дата " & Date & Chr(13) &
"Клавиша F1"
54
End Sub
Sub Пример2()
MsgBox "Переназначение клавиш_2" & Chr(13) & "Клавиши Ctrl и Стрелка
вверх"
End Sub
Ниже приведены диалоговые окна, выводимые в рассматриваемом при-
мере.
Sub Заполнение_ComboBox()
' Заполнение элемента управления ComboBox
ShouКвартал.КВАРТАЛЫ.RowSource = “”
ShouКвартал.КВАРТАЛЫ.AddItem “КВ1”
ShouКвартал.КВАРТАЛЫ.AddItem “КВ2”
ShouКвартал.КВАРТАЛЫ.AddItem “КВ3”
ShouКвартал.КВАРТАЛЫ.AddItem “КВ4”
ShouКвартал.Show
MsgBox “R=” & R
End Sub
Кроме создания значений элемента управления ComboBox, в этой
процедуре осуществляется вывод на экран формы ShouКвартал (исполь-
зуется метод Show) и значения переменной R. Переменная R получает
значение в процедуре Ok_Click формы обработки события нажатия кнопки.
Переменная R должна быть объявлена как Public перед самой первой
стандартной процедурой. На рис.22 приведёна форма ShouКвартал, в
которой значения элемента ComboBox получены любым из приведённых
выше способов.
66
Public r As Variant
Sub Поле_со_списком()
Месяцы.Show
68
1
При разработке примера использованы материалы из кн.: Гарнаев А.Ю. MS Excel
2002: разработка приложений. – СПб.: БХВ-Петербург, 2003. – C. 391–392.
72
Пример1
В приведённой ниже процедуре TestFor подсчитывается сумма не-
чётных чисел в заданном диапазоне, причём числа формируются в цикле с
нарастанием на 1.
Option Explicit_________________________________________________
Sub TestFor()
'Подсчёт суммы нечётных чисел в заданном диапазоне
Dim i As Integer
Dim n As Integer
Dim Sum As Integer
Dim r As Integer
n = InputBox("Ведите количество чисел", "Количество нечётных чисел")
r=0
For i = 1 To n Step 2 '(сумма нечётных чисел от 1 до n)
Sum = Sum + i
r=r+1
79
Next i
MsgBox Prompt:="Сумма " & r & " нечётных чисел в диапазоне от 1 до " &
n & _" равна " & Sum, Buttons:=vbExclamation, _
Title:="Количество нечётных чисел"
End Sub
Ниже приведены диалоговые окна, появляющиеся при выполнении мак-
роса TestFor.
Пример2
В приведённой ниже процедуре TestFor1 подсчитывается сумма нечётных
чисел в диапазоне A1:J10 таблицы Excel.
For j = 1 To m Step 1
Sum = Sum + Cells(i, j)
r=r+1
Next j
Next i
MsgBox Prompt:="Сумма " & r & " нечётных чисел в диапазоне" _
& Chr(13) + Chr(10) _
& " от 1 до " & n * m & " равна " & Sum, Buttons:=vbExclamation
End Sub
В процедуре TestFor2 реализован алгоритм ввода данных с клавиа-
туры в ячейки рабочего листа; заполнение производится последовательно
столбец за столбцом двумя циклами.
Sub TestFor2()
Dim i As Integer
Dim j As Integer
Dim m As Integer
Dim n As Integer
m = InputBox("Ведите количество чисел в столбце", _
"Количество нечётных чисел")
n = InputBox("Ведите количество чисел в строке", _
"Количество нечётных чисел")
For i = 1 To n Step 1 '(сумма нечётных чисел от 1 до n)
For j = 1 To m Step 1
Cells(j, i) = InputBox("Ведите значение в ячейку " & Chr(64 + i) & j, _
"Ввод данных в таблицу")
Next j
Next i
End Sub
В процедуре TestFor2 функция Chr(64 + i) возвращает (выдаёт значе-
ние) строку, содержащую символ, код которого указан в качестве аргумен-
та. Код 65 соответствует латинской букве A, 66 – букве B и т.д. Ниже пока-
зано диалоговое окно, соответствующее функции InputBox во вложенном
цикле цикле процедуры TestFor2.
While Условие
[Инструкции]
Wend
Формат инструкции While…Wend содержит следующие элементы:
Элемент инструкции Описание элемента
Условие Обязательный. Числовое или строковое выражение, резуль-
татом вычисления которого являются значения True или
False
Инструкции Необязательный. Одна или более инструкций, выполняе-
мых, если условие равно значению True
Option Base 1
Option Explicit
––––––––––––––––––––––––––––––––––––––––––––––––––––––
Sub ForEach()
Dim Мас() As Single
Dim L As Integer, i As Integer, k As Integer
Dim n As Variant
L = Int(Rnd * 10)
If L = 0 Then
MsgBox "Количество элементов массива равно " & L
Exit Sub
End If
MsgBox "Количество элементов массива равно " & L
ReDim Мас(L) ' Устанавливается размер динамического массива
For i = 1 To L
Мас(i) = Rnd
MsgBox "Мас(" & i & ")=" & Мас(i)
Next i
k=0
For Each n In Мас
k=k+1
Cells(1, k) = n
Next n
End Sub
В процедуре РабочиеЛисты, приведенной ниже, применена конст-
рукция For Each - Next коллекции Sheets активной рабочей книги.
Sub РабочиеЛисты()
Dim ЛИСТ As Worksheet
Dim s As String
86
s=" "
For Each ЛИСТ In ActiveWorkbook.Worksheets
s = s & " " & Item.Name
Next ЛИСТ
MsgBox "Рабочие Листы:" & vbCrLf & s
End Sub
При выполнении этой процедуры функция MsgBox отображает строку, со-
стоящую из свойств Name (Имя листа) каждого рабочего листа:
Однострочный формат:
If условие Then инструкции
Первый блоковый формат:
If условие Then [инструкции] [Else инструкции]
[Else
[инструкции_Else]]
End If
Второй блоковый формат:
If условие Then
[инструкции]
[ElseIf условие Then
[инструкции_elseIf]]…
[Else
[инструкции_else]]
End If
При этом ElseIf …Тhen может повторяться несколько раз.
В основу этой инструкции положен следующий принцип: если условие вы-
полняется, то выполняются инструкция, находящиеся после Then.
Формат инструкции If...Then...Else содержит следующие элементы:
Элемент инструкции Описание элемента
Условие Обязательный. Одно или более выражений следующих двух
типов: численное или строковое выражение, которое приво-
дится к значениям True или False.
Инструкции Необязательный в блочной форме, но обязательный в од-
нострочной форме, которая не имеет ветви Else. Один или
несколько операторов; выполняются, если Условие имеет
значение True.
Однострочная форма допускает выполнение нескольких инструкций в ре-
зультате проверки одного условия If…Then. При этом все инструкции долж-
ны находиться на одной строке и разделяться двоеточием, как показано в
приведенном ниже примере:
Sub IfThenElse ()
Dim a As Single
Dim b As Single
Dim c As Single
a = Range("A1").Value
b = Range("A2").Value
If b = 0 Then MsgBox "Деление невозможно!" Else c = a / b: MsgBox "c=" & c
End Sub
Dim b As Single
Dim c As Single
a = Range("A1").Value
b = Range("A2").Value
If b=0 Then
MsgBox "Деление на ноль невозможно!"
Else
c=a/b
MsgBox "c=" & c
End If
End Sub
Инструкция If…Then... Else применяется в следующих случаях:
1. Нужно проверить на соответствие одному или нескольким ус-
ловиям и в случае соответствия сделать какое-то действие:
Option Compare Text
––––––––––––––––––––––––––––––––––––––––––––––––––
Sub IfThenElse2()
Dim КурсРаб As String
If Range("a5").Value = "Неуд" Or Range("a5").Value = "" Then
MsgBox "Небходимо защитить курсовую работу "
End If
End Sub
2. Нужно проверить на соответствие одному или нескольким ус-
ловиям и в случае соответствия сделать какое-то действие, а в
случае несоответствия выполнить другое действие:
Sub IfThenElse3()
Dim КурсРаб As String
If Range("a5").Value = "Неуд" Or Range("a5").Value = "" Then
MsgBox "Необходимо защитить курсовую работу"
Else
MsgBox "К экзамену по информатике допущен"
End If
End Sub
Примечание
На уровне стандартного модуля, в котором находится процедура
IfThenElse2, помещена инструкция Option Compare Text. Инструкция Option
Compare применяется на уровне модуля перед первой процедурой модуля
для задания используемого по умолчанию способа сравнения строковых
данных.
Формат инструкции:
Option Compare Binary | Text | Database
Инструкция Option Compare указывает способ сравнения строк Bi-
nary, Text или Database для модуля. Если модуль не содержит инструк-
89
Exit Sub
m20:
MsgBox "m20"
End Sub
Использование GoTo удобно в очень редких случаях, например, ко-
гда нам нужно добиваться от пользователя ввода правильного значения
неизвестное число раз. Однако использование GoTo считается признаком
плохого тона и категорически не рекомендуется, потому что код становит-
ся трудночитаемым. Инструкцию GoTo можно заменить инструкцией орга-
низации циклов, используя инструкцию If или Select Case, как это сделано
в приведённой ниже процедуре УслОператор, реализующий тот же алго-
ритм, что и процедура БезУслПереход:
Sub УслОператор()
Dim r
r = InputBox("Иллюстрация инструкции условного перехода")
If r = 1 Then MsgBox 10 Else MsgBox "m20"
End Sub
2.12.4.4. Инструкции перехода к обработчику ошибок On Error
Инструкция On Error делает доступным обработчик ошибок и опре-
деляет его положение внутри процедуры и используется также для запре-
та обработки ошибок. Она имеет следующий формат:
On Error GoTo строка
On Error Resume Next
On Error GoTo 0
Инструкция On Error имеет следующие формы:
On Error GoTo стро- Делает доступным обработчик ошибок, который начинается
ка со строки, определённой аргументом строка. Этот аргумент
может быть числом или буквенно-числовым. При возникно-
вении ошибки управление выполнением программы переда-
ётся на строку кода с меткой строка. Таким образом проис-
ходит активизация обработчика ошибок. Метка строка долж-
на находиться в той же процедуре, что и инструкция On
Error.
On Error Resume Указывает на то, что при возникновении ошибки управление
Next выполнением программы передаётся на инструкцию, сле-
дующую непосредственно за тем, в котором произошла
ошибка. Эта инструкция позволяет продолжить выполнение
программы, несмотря на возникновение ошибки времени вы-
полнения (run-time).
On Error Goto 0 Отключает пользовательский обработчик ошибок в данной
процедуре. Эта инструкция не указывает метку 0 в качестве
начала обработчика ошибки, даже если в процедуре дейст-
вительно имеется такая метка.
Пользовательские обработчики ошибок позволяют реагировать на
ошибки во время работы пользователя, например, когда вместо числа
пользователь вводит текстовое данное или вообще не вводит данное.
93
Sub ПримерOnErrorGoto_0()
Dim Num As Single
On Error GoTo 0
Num = InputBox("Введите число")
MsgBox "Введено число " & Num
Resume
End Sub
При возникновении ошибки ввода выводится следующее диалоговое окно,
сообщающее о несоответствии типа данного введённому значению (“Пус-
то” или “Не число”).
94
Если выражение то
Равняется 0 Управление передается инструкции, следующей за
On...GoSub или On...GoTo
Превышает число Управление передается инструкции, следующей за
элементов списка On...GoSub или On...GoTo
Отрицательное Возникает ошибка
Больше 255 Возникает ошибка
В одном списке допускается совместное использование номеров и
меток строк. Не существует практического ограничения на число меток и
номеров строк, используемых с инструкциями On...GoSub... и On...GoTo.
Однако при использовании большего число меток или номеров, чем может
уместиться на одной строке, необходимо применять символ продолжения
строки для распространения логической строки на несколько физических
строк. Инструкция Select Case обеспечивает более структурированный и
гибкий способ выполнения множественных ветвлений.
Пример
В данном примере инструкции On...GoSub и On...GoTo используются
для перехода к подпрограммам и строкам с указанными метками.
Sub OnGosubGoto()
Dim №_стр, Строка, n
Ввод:
№_стр = InputBox("Введите номер метки/строки")
If №_стр = "" Then GoTo Ввод
On №_стр GoSub М1, М2 ' Управление возвращается сюда
' после выполнения On...GoSub
On №_стр GoTo 1, 2 ' Управление не возвращается сюда
' после выполнения On...GoTo.
Exit Sub
М1:
MsgBox "Выполнен переход на метку М1": Return
М2:
MsgBox "Выполнен переход на метку М2": Return
97
1:
MsgBox "Выполнен переход на строку 1"
2:
MsgBox "Выполнен переход на строку 2"
End Sub
2.13. Функции VBA
Функция – это подпрограмма, которая выполняет действия и воз-
вращает единственное значение. В VBA различают следующие виды
функций:
− встроенные функции,
− функции, определённые пользователем.
2.13.1. Встроенные функции
Ниже представлены таблицы с кратким описанием наиболее часто
используемых функций VBA.
2.13.1.1. Математические функции
N означает любое численное выражение. Все аргументы функций
являются обязательными, если не указано иначе.
Функция(аргумент) Действие
Abs(N) Возвращает абсолютное значение аргумента N
Atn(N) Возвращает арктангенс N (радиан)
Cos(N) Возвращает косинус N (радиан)
Возвращает целую часть N. Не округляет число, а отбрасывает лю-
Fix(N) бую дробную часть. Если N отрицательное число, то возвращается
ближайшее отрицательное целое большее, чем или равное N
Возвращает случайное число: аргумент является необязательным.
Rnd(N) Используется только после инициализации генератора случайных
чисел (оператор Randomize)
Возвращает знак числа: -1, если N – отрицательное; 1, если N – по-
Sgn(N)
ложительное; 0, если N равно 0
Sin(N) Возвращает синус N (радиан)
Возвращает корень квадратный из N. Если N является отрицатель-
Sqr(N)
ным числом – возвращается ошибка времени исполнения
Tan(N) Возвращает тангенс N (радиан)
Функция(аргумент) Действие
Возвращает строку из одного символа, соответствующего коду сим-
Chr(N) вола N, который должен быть числом между 0 и 255 (обратна пре-
дыдущей)
Возвращает строку, содержащую значение, представленное выра-
Format(E,S) жением Е, в формате в соответствии с инструкциями, содержащим-
ся в S
Возвращает целое типа Long, представляющее значение основных
RGB(N,N,N) цветов изображения. N для каждого аргумента должно быть целым и
лежать в пределах от 0 до 255
Str(N) Возвращает строку, эквивалентную численному выражению N
Возвращает численное значение, соответствующее числу, пред-
Val(S) ставленному строкой S, которая должна содержать только цифры и
одну десятичную точку, иначе возвращается 0
Возвращает значение типа Date. E может быть любым допустимым
CDate(E) выражением (строкой или числом), представляющим дату в диапа-
зоне 1/1/100 - 12/31/9999
Возвращает численное значение типа Integer. Е – любое допустимое
CInt(E) численное или строковое выражение, которое может быть преобра-
зовано в число
Возвращает численное значение типа String. Е – любое допустимое
CStr(E) численное или строковое выражение, которое может быть преобра-
зовано в число
Функция(аргумент) Действие
Date Возвращает системную дату
Time Возвращает системное время
Now Возвращает системные дату и время
Возвращает целое, являющееся частью выражения типа Date и со-
Year(D)
держащее год. Год возвращается как число между 100 и 9999
Возвращает целое, являющееся частью выражения типа Date и со-
Month(D)
держащее месяц. Месяц возвращается как число между 1 и 12
Возвращает целое, являющееся частью выражения типа Date и со-
Day(D)
держащее день. День возвращается как число между 1 и 31
Возвращает целое, содержащее часы как часть времени, содержа-
щегося в выражении типа Date. Часы возвращаются как число меж-
Hour(D)
ду 0 и 23. Если аргумент не содержит значения времени, то возвра-
щается 0
Возвращает целое, содержащее минуты как часть времени, содер-
жащегося в выражении типа Date. Минуты возвращаются как число
Minute(D)
между 0 и 59. Если аргумент не содержит значения времени, то воз-
вращается 0
Возвращает значение типа Date, эквивалентное дате, заданной ар-
DateValue(E) гументом Е, который может быть строкой, числом или константой,
представляющей время
Возвращает значение типа Date, содержащее время, заданное ар-
TimeValue(E) гументом Е, который может быть строкой, числом или константой,
представляющей время
99
2.13.1.4. Строковые функции
Функция(аргумент) Действие
Возвращает положение S2 в S1. N1 – начальное положение для поис-
InStr(N1,S1,S2,N2) ка. N2 определяет, следует ли выполнять поиск с учетом регистра.
N1, N2 – необязательные аргументы
Возвращает строку (тип String), содержащую копию S со всеми сим-
Lcase(S) волами верхнего регистра, преобразованными в символы нижнего
регистра
Возвращает строку: копирует N символов из S, начиная с левого
Left(S,N)
крайнего символа S
Возвращает число символов в S, включая начальные и конечные про-
Len(S)
белы
Возвращает копию строки S после удаления символов пробела из ле-
Ltrim(S)
вой части строки (начальные пробелы)
Возвращает строку: копирует N2 символов из S, начиная с позиции
символа в S, заданной аргументом N1. N2 – необязательный аргу-
Mid(S,N1,N2)
мент, если он опущен, то возвращаются все символы в строке S от
позиции N1 до конца строки
Возвращает значение типа String: копирует N символов из S, начиная
Right(S,N)
с правого крайнего символа S
Возвращает копию строки S после удаления символов пробела из
Rtrim(S)
правой части строки (конечные пробелы)
Space(N) Возвращает строку пробелов длиной N символов
Сравнивает S1 с S2 и возвращает число, обозначающее результат
сравнения: -1, если S1<S2; 0 - S1=S2; 1 - S1>S2. N является необяза-
StrComp(S1,S2,N)
тельным аргументом и указывает следует ли выполнять сравнение с
учетом регистра
Возвращает строку, преобразованную в новую форму в зависимости
от числового кода, заданного аргументом N. VBA предоставляет внут-
ренние константы для использования с функцией StrConv. Наиболее
StrConv(S,N) полезными являются: vbProperCase (преобразует строку так, что каж-
дая буква, начинающая слово, становится заглавной), vbLowerCase
(преобразует строку в буквы нижнего регистра) и vbUpperCase (пре-
образует строку в буквы верхнего регистра)
Возвращает строку длиной N символов, состоящую из символа, за-
String(N,S)
данного первым символом в S
Возвращает копию строки S после удаления начальных и конечных
Trim(S)
символов пробела из этой строки
Возвращает S со всеми символами нижнего регистра, преобразован-
Ucase(S)
ными в символы верхнего регистра
100
2.13.1.5. Примеры использования функций VBA
Стр0 = "Строка"
Стр1 = Len(Trim(Стр0))
MsgBox "Стр1=" & Стр1
2.13.1.5.3. Сравнение и поиск строк
В VBA имеются две функции, помогающих сравнивать строки:
StrComp и InStr.
Функция StrComp
Формат функции:
StrComp (String1, String2 [, Compare])
где String1, String2 – любые два строковых выражения, которые необходи-
мо сравнивать. Compare – необязательный аргумент, может быть любой
из следующих предопределенных констант:
− vbBinaryCompare – бинарное сравнение двух строк;
− vbTextCompare – текстовое сравнение двух строк.
При бинарном сравнении коды символов упорядочены в соотвествии
с их двоичным значением, и коды строчных и прописных букв раразлича-
ются при сравнении. При текстовом сравнении VBA прописные и строчные
буквы не различает. Если аргумент Compare опускается, то используется
текущая установка Option Compare.
Если аргумент Compare опускается, то используется текущая установка
инструкции Option Compare (см. Примечание к п. Инструкция условного
перехода If…Then…Else).
102
Пример
В данном примере инструкция Option Compare используется для за-
дания метода сравнения строковых данных, используемого по умолчанию.
Option compare Binary ' т.е. "AAA" < "aaa"
' Устанавливает метод сравнения строковых данных Binary.
Option compare Text ' т. е. "AAA" = "aaa".
' Устанавливает метод сравнения строковых данных Text.
При выполнении процедуры StrComp возвращает следующее значене:
− -1, если String1 меньше String2;
− 0, если String1 и String2 равны;
− 1, если String1 больше String2.
Пример
Sub Встр_функции_5()
Dim R1 As String, R2 As String, R3 As String
R1 = StrComp("Строка1", "Строка2", vbTextCompare)
R2 = StrComp("Строка1", "Строка1", vbTextCompare)
R3 = StrComp("Строка2", "Строка1", vbTextCompare)
MsgBox "R1=" & R1 & " " & "R2=" & R2 & " " & "R3=" & R3
End Sub
В первой инструкции присваивания текстовое выражение Строка1
меньше, чем Строка2, и поэтому значение R1=–1, во втором они равны
(R2=0) и в третьем Строка2 больше, чем Строка1 (R3=1).
Функция InStr
Функция InStr дает возможность определить, содержит ли одна стро-
ка другую строку.
Формат функции:
InStr ([Start,] String1, String2 [, Compare])
String1, String2 – любые допустимые строковые выражения. Функция про-
веряет, содержится ли String1 в String2.
Start – необязательный аргумент, является численным выражением и ука-
зывает положение символа в String1, с которого должна начинаться про-
верка. Аргумент Start является обязательным, если указывается аргумент
Compare.
Compare имеет тот же смысл, что и в функции StrComp.
InStr возвращает число, обозначающее положение символа в String1, где
было обнаружено String2. Если InStr не находит String2 в String1, то воз-
вращается 0. Если String1 (или String2) имеет значение Null (“Пусто”), то
функция также возвращает Null.
Пример
Sub Встр_функции_6()
Dim R1 As String, R2 As String
R1 = "Строка ввода"
R2 = "Ввод"
MsgBox "R2 входит в R1 с позиции " & _
103
InStr(1, R1, R2, vbTextCompare)
End Sub
Функция Right
Формат функции:
Right (String, Length)
String – любое допустимое строковое выражение;
Length – любое численное значение.
Функция возвращает копию String, начиная с последнего символа и
включая справа налево количество символов, заданных с помощью
Length. Если Length является числом, большим, чем фактическая длина
String, то возвращается все строковое выражение String. Функция Right
всегда копирует символы от конца строки к ее началу.
Функция Mid
Формат функции:
Mid (String, Start, [, Length])
String – любое допустимое строковое выражение;
Length, Star t – любые численные значения.
Функция Mid возвращает копию String, начиная с положения символа
в String, задаваемого с помощью аргумента Start . Необязательный аргу-
104
Sub Расчёт_Комиссионных()
Sheets("Лист1").Select
Dim i As Integer
i=3
While Cells(i, 1) <> ""
Cells(i, 3) = Комиссионные(Cells(i, 2))
Cells(i, 4) = Cells(i, 2) + Cells(i, 3)
i=i+1
Wend
End Sub
Open
Разрешает выполнение операций ввода/вывода при работе с файлом.
Формат инструкции:
Open Путь For Режим [Access Доступ] [Блокировка] As [ # ] НомерФайла
[Lеn=Длина]
− Путь – строковое выражение, указывающее имя файла
− Режим – устанавливает режим работы с файлом. Допустимые Зна-
чения: Append, Binary, Input, Output или Random
− Доступ – устанавливает операции, разрешенные с открытым фай-
лом. Допустимые значения: Read, Write или Read Write
− Блокировка – устанавливает операции, разрешенные с открытым
файлом другим процессам. Допустимые значения: Shared, Lock
Read, Lock Write и Lock Read Write
− Номер-файла – допустимый номер файла. Число в интервале от 1 до
255.
− Длина – число, меньшее либо равное 32 767 (байт).
Close
Завершает операции ввода/вывода с файлом, открытым с помощью инст-
рукции Open.
Формат инструкции:
Close [СписокНомеровФайлов]
Аргумент СписокНомеровФайлов может представлять один или несколько
номеров файлов. При этом используется следующий синтаксис, где но-
мерФайла представляет любой допустимый номер файла: [[#] номерФай-
ла] [, [#] номерФайла] ...
Если СписокНомеровФайлов не указан, инструкция Close закрывает все
активные файлы, открытые инструкцией Open.
Reset
Закрывает все активные файлы, открытые с помощью инструкции Open, и
записывает содержимое всех буферов файлов на диск, открытых с помо-
щью инструкции Open.
Формат инструкции:
Reset
FreeFile
Функция возвращает доступный номер, который может использоваться в
инструкции Open.
109
'
Close #1
End Sub
Sub ПримерИспользованияWrite()
Open "ЕщеПример" For Output As #1
Write #1, "Пример"; "использования"
Write #1, "инструкции"
Write #1, "Write"
x=1
Write #1, "Число";
Close #1
End Sub
Результатом описанных выше инструкций будет файл со следующим со-
держимым:
"Пример","использования" "инструкции","Write" "Число",1
Следует обратить внимание на автоматическое размещение в файле
разделителей – запятых и то, что строковая информация берется в кавыч-
ки. В процедуре ПримерИспользованияWrite вторая инструкция Write спе-
циально заканчивается знаком ";". Это обеспечивает вывод данных треть-
ей инструкцией Write в ту же строку файла, в которую выводила вторая
инструкция.
Put
Записывает содержимое переменной в файл произвольного доступа.
Формат инструкции:
Put [#] НомерФайла, [НомерЗаписи] , ИмяПеременной
− НомерФайла – номер файла
− НомерЗаписи – номер записи (режим Random) или номер байта
(режим Binary), с которого следует начать запись. Если аргумент
НомерЗаписи опущен, то записывается на то место, где был уста-
новлен указатель после выполнения последней инструкции Get
или Put, либо куда он переведен с помощью функции Seek
− ИмяПеременной – имя переменной, содержащей данные, которые
следует записать в файл
Get
Читает данные из открытого файла произвольного доступа в переменную.
Формат инструкции:
Get [#] НомерФайла, [НомерЗаписи] , ИмяПеременной
− НомерФайла – номер файла
− НомерЗаписи – номер записи (для файлов в режиме Random) или
номер байта (для файлов в режиме Binary), с которого следует на-
чать чтение
113
LOF
Функция возвращает значение типа Long, представляющее размер файла
в байтах, открытого с помощью инструкции Оpen . Для определения раз-
мера закрытого файла следует использовать функции FileLen.
Формат функции:
LOF (НомерФайла)
FileLen
Функция возвращает значение типа Long, содержащее размер файла в
байтах.
Формат функции:
FileLen (Путь )
Как видно из приведенного в предыдущем разделе примера для счи-
тывания информации при помощи инструкции Input #, файл последова-
тельного доступа иногда удобно задавать как последовательность запи-
сей, причем каждая из записей формируется из группы полей. В файле
последовательного доступа существует только одна внутренняя структура,
образованная разделителями: запятыми или специальными символами,
обозначающими переход на новую строку.
В противоположность файлам последовательного доступа, в файлах
произвольного доступа запись является встроенным элементом. Файл
произвольного доступа – это файл, упорядоченный по номерам записей,
что позволяет быстро переместиться на любую запись, минуя предыду-
щие.
При создании файла произвольного доступа указывается макси-
мальная длина каждой записи. Само собой разумеется, что в любую за-
пись можно вводить данные, занимающие не всё место, выделенное для
записи, но нельзя ввести данные, требующие больше места, чем допусти-
мая длина записи. Лишняя информация будет просто усекаться.
Отметим, что при открытии файла произвольного доступа, в отличие
от файла последовательного доступа, не надо специально указывать, от-
крывается он для ввода или вывода информации. Ввод и вывод информа-
ции определяют команды Put и Get.
Приведем пример работы с файлом произвольного доступа Ведо-
мость. Файл создается с помощью процедуры ЗаписьВФайлПД, которая
114
Sub ЗаписьВФайлПД()
Dim Студент As Студент
Dim i As Integer
Open "Список" For Random As #1 Len = Len(Студент)
For i = 2 To 4
With Студент
.Фамилия = Cells(i, 1).Value
.Оценка = Cells(i, 2).Value
End With
Put #1, i, Студент
Next i
Close #1
End Sub
Sub СчитываниеИзФайлаПД()
Dim Студент As Студент
Dim i As Integer
Dim n As Integer
Open "Список" For Random As #1 Len = Len(Студент)
n = LOF(1) / Len(Студент) + 1
For i = 2 To n
Get #1, i, Студент
With Студент
Cells(i, 3).Value = .Фамилия
Cells(i, 4).Value = .Оценка
End With
115
Next i
Close #1
End Sub
Sub ВЕДОМОСТЬ_1()
'
' ВЕДОМОСТЬ_1 Макрос
' Макрос записан 15.06.2009 (VAM)
'
Range("A1:D1").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
Range("A1:D1").Select
ActiveCell.FormulaR1C1 = "ВЕДОМОСТЬ"
With ActiveCell.Characters(Start:=1, Length:=9).Font
.Name = "Arial Cyr"
.FontStyle = "полужирный"
.Size = 12
.Strikethrough = False
121
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("A2").Select
ActiveCell.FormulaR1C1 = "Фамилия И.О."
Range("B2").Select
ActiveCell.FormulaR1C1 = "№зач.кн."
Range("C2").Select
ActiveCell.FormulaR1C1 = "Дисциплина"
Range("D2").Select
ActiveCell.FormulaR1C1 = "Оценка"
Range("A2:D2").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
End Sub
122
Библиографический список
Оглавление
Учебное издание
ВВЕДЕНИЕ В VBA
Учебное пособие