- •2.1. Алфавит и словарь языка
- •2.2. Переменные
- •2.3. Константы
- •2.4. Строковые переменные
- •2.5. Массивы
- •2.6. Пользовательские типы данных
- •2.7. Операции VBA
- •2.8. Объектная модель Excel
- •2.8.1. Свойства и методы объектов
- •2.8.2. Отображение объектной модели Excel
- •2.8.2.1. Иерархия объектной модели
- •2.8.2.2. Ссылка на объекты в коде VBA
- •2.8.3. Работа с объектами
- •2.8.3.1. Задание свойств объекта
- •2.8.3.2. Использование методов объекта
- •2.8.3.3. Переменные-объекты
- •2.8.3.4. Коллекции
- •2.8.3.5. Метод Add
- •2.8.3.6. Свойство Count
- •2.8.4. Свойства и методы основных объектов Excel
- •2.8.4.1. Объект Application
- •2.8.4.2. Объект Worksheet
- •2.8.4.3. Объект Range
- •2.8.5. Просмотр объектов
- •2.8.6. Использование справочной системы
- •2.8.6.1. Использование функциональной клавиши F1
- •2.8.6.2. Использование помощника
- •2.9. Ввод и вывод данных
- •2.9.3. Метод InputBox
- •2.9.4. Объединение текстовых строк
- •2.10. Концепция событий Excel
- •2.10.1. Типы событий Excel
- •2.10.2. События объекта Workbook
- •2.10.3. События объекта Worksheet
- •2.10.4. События объекта Application
- •2.10.5. События объекта UserForm
- •2.10.6. События, не связанные с конкретными объектами
- •2.10.6.1. Метод OnKey
- •2.10.6.2. Событие OnTime
- •2.11. Формы пользователя
- •2.11.1. Свойства, методы и события экранных форм
- •2.11.1.1. Некоторые свойства форм
- •2.11.1.2. Некоторые методы форм
- •2.11.1.3. Некоторые события форм
- •2.11.2. Элементы управления
- •2.11.2.1. Элемент управления Label (Надпись)
- •2.11.2.1.1. Окно свойств формы
- •2.11.2.2. Элемент управления CommandButton (Кнопка)
- •2.11.2.3. Элемент управления TextBox (Текстовое поле)
- •2.11.2.4. Элемент управления ComboBox (комбинированный список)
- •2.11.2.5. Элемент управления ListBox (список)
- •2.11.2.6. Элемент управления CheckBox (Флажок)
- •2.11.2.7. Элемент управления ToggleButton (Выключатель)
- •2.11.2.8. Элемент управления OptionButton (Переключатель)
- •2.11.2.9. Элемент управления Image (Рисунок)
- •2.11.2.12. Элемент управления RefEdit (Поле со свёртыванием)
- •2.11.2.13. Элементы управления на рабочем листе
- •2.12. Инструкции VBA
- •2.12.1. Оператор присваивания
- •2.12.2. Инструкция Set
- •2.12.3. Циклы
- •2.12.3.1. Инструкция For… Next
- •2.12.3.2. Инструкция While…Wend
- •2.12.3.3. Инструкция Do... Loop
- •2.12.3.4. Инструкция For Each…Next
- •2.12.4. Инструкции перехода
- •2.12.4.1. Инструкция условного перехода If…Then…Else
- •2.12.4.2. Инструкция Select…Case
- •2.12.4.3. Инструкция безусловного перехода GoTo
- •2.12.4.4. Инструкции перехода к обработчику ошибок On Error
- •2.12.4.5. Инструкции прерывания выполнения блока Exit
- •2.13. Функции VBA
- •2.13.1. Встроенные функции
- •2.13.1.1. Математические функции
- •2.13.1.2. Функции преобразования данных
- •2.13.1.3. Функции даты и времени
- •2.13.1.4. Строковые функции
- •2.13.1.5. Примеры использования функций VBA
- •2.13.1.5.1. Удаление ненужных символов
- •2.13.1.5.2. Определение длины строки
- •2.13.1.5.3. Сравнение и поиск строк
- •2.13.1.5.4. Выделение части строки
- •2.13.1.5.5. Форматирование значений данных
- •2.13.2. Функции, определённые пользователем
- •2.14. Файлы VBA
- •2.14.1. Типы файлов в VBA
- •2.14.2. Открытие и закрытие файла
- •2.14.3. Ввод данных в файл последовательного доступа
- •2.14.4. Вывод данных из файла последовательного доступа
- •2.14.5. Работа с файлом произвольного доступа
- •2.15. Создание процедуры
- •2.16. Выполнение процедуры
- •2.17. Сохранение процедуры
- •2.18. Запись последовательности действий пользователя
- •2.19. Просмотр кода макроса
- •3.1. Тестирование и отладка как этап разработки приложений
- •3.1.1. Отладка
- •3.1.1.1. Режим останова
- •3.1.1.2. Использование окна Immediate
- •3.1.1.2.1. Просмотр значений в окне Immediate
- •3.1.1.3. Пошаговое выполнение программ
- •3.1.2. Исправление ошибок
- •Библиографический список
- •Оглавление
107
If Продажи > 15000 Then
Надбавка = 0.03 * (Продажи - 15000) РасчётКом = РасчётКом + Надбавка
End If
Комиссионные = РасчётКом
End Function
Подсчёт оплаты выполняется при помощи инструкции
Cells(i, 4) = Cells(i, 2) + Cells(i, 3)
в процедуре Расчёт_Комиссионных.
Ниже приведена таблица с результатом решения задачи.
VBA передает все аргументы в функцию-процедуру как типы Variant. Можно объявлять определенные типы данных для каждого аргумента в списке аргументов. Определение типов аргументов для функциипроцедуры помогает пользователю при вызове функции вводить аргументы правильного типа в правильном порядке.
2.14. Файлы VBA
2.14.1.Типы файлов в VBA
ВVBA допустима работа с тремя типами текстовых файлов.
Файл |
последователь- |
Последовательность строк произвольной длины, |
ного доступа |
разделенных специальными символами. Чтение |
|
|
|
и запись в файл производится построчно |
Файл |
произвольногоСостоит из записей фиксированной длины и раз- |
|
доступа |
мер записи указывается при его открытии. Это |
|
|
|
позволяет локализовать любую запись в файле |
|
|
по ее номеру |
Бинарный файл |
Является частным случаем файла произвольного |
|
|
|
доступа. Размер записи в бинарном файле счи- |
|
|
тается равным 1 байту |
108
2.14.2. Открытие и закрытие файла
Обсудим инструкции, связанные с открытием файла для операций ввода/вывода, а также с закрытием файла по завершению работы с ним.
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
Приведем пример инструкции, открывающей для записи бинарный файл Первый из рабочей папки, и затем инструкции, закрывающей этот бинарный файл.
Open "Первый" For Binary Access Write As #1
Close #1
2.14.3. Ввод данных в файл последовательного доступа
Записывает форматированные данные в файл последовательного доступа. Формат инструкции:
Print # НомерФайла, [СписокВывода]
Номерфайла – любой допустимый файловый номер
СписокВывода – выражение или список выражений, записываемое в файл. В аргументе СписокВывода разделителем списка выводимых выражений является ";" (данные выводятся подряд) или "," (данные выводятся по зонам).
Write#
Записывает неформатированные данные в файл последовательного доступа. В отличие от инструкции Print, инструкция write вставляет запятые между элементами и заключает строки в кавычки по мере записи их в файл.
Формат инструкции:
Write #НомерФайла, [СписокВывода]
НомерФайла – любой допустимый файловый номер
СписокВывода – выражение или список выражений, записываемых в файл Данные, записанные с помощью инструкции Write, обычно считываются из файла с помощью инструкции Input.
Приведем две процедуры, использующие инструкции Print и Write для создания файлов последовательного доступа.
Sub ПримерИспользованияPrint() Open "Новый" For Output As #1
'
Print #1, "Тест"
'Печатает текст в файл
Print #1,
'Печатает пустую строку в файл
Print #1, "Зона 1"; Tab; "Зона 2"; Spc(3); "3 пробела"
'Печатает в двух зонах печати
110
'
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 в ту же строку файла, в которую выводила вторая инструкция.
2.14.4. Вывод данных из файла последовательного доступа
Input #
Считывает данные из открытого файла последовательного доступа и присваивает их переменным. Данные, считываемые с помощью инструкции Input #, обычно записываются в файл с помощью инструкции Write #.
Формат инструкции:
Input # НомерФайла, СписокПеременных
Номерфайла – любой допустимый файловый номер
СписокПеременных – список разделённых запятыми переменных, которым следует присвоить значения, считанные из файла
Line Input #
Считывает одну строку из открытого файла последовательного доступа и присваивает ее переменной типа String. Данные, считываемые с помощью инструкции Line input #, как правило, записываются в файл с помощью инструкции Print #.
Формат инструкции:
Line Input #НомерФайла, ИмяПеременной
111
Синтаксис инструкции Line Input # содержит следующие элементы:
НомерФайла – номер файла
ИмяПеременной – имя переменной типа Variant или String
Функция Input
Возвращает значение типа String, содержащее символы из файла, открытого в режиме Input или Binary. Функция input считывает данные, записываемые в файл с помощью инструкции Print # или Put.
Формат инструкции:
Input (Число, [#] НомерФайла)
Число задает число возвращаемых символов. Если аргумент Число равен 1, то производится посимвольное считывание данных.
Функция EOF
Функция возвращает значение True при достижении конца файла.
Формат инструкции:
EOF (НомерФайла)
При последовательном считывании информации из файла часто используется следующий цикл:
Do While Not EOF(l) Loop или While Not EOF (I) Wend.
Пример
Ниже приведены две процедуры: ЗаписьПоследоватФайла и ЧтениеПоследоватФайла,– в которых создаётся, а затем читается файл Ведомость, размещаемый в папке E:\VBA_INTERNET. При чтении файла, созданного процедурой ЗаписьПоследоватФайла, отличие действия инструкций Input и Line Input в процедуре ЧтениеПоследоватФайла проявятся при чтении записи, созданной инструкцией Write #1, "Алексеев С.С.", 206709, "Информатика", "Отлично". Инструкция Line Input #1, Ввод счи-
тает ее целиком в переменную Ввод, в то время, как инструкция Input #1, Ввод считывает записи последовательно, и для чтения всей строки должен выполниться четыре раза.
Sub ЗаписьПоследоватФайла()
Open "e:\VBA_INTERNET\Ведомость" For Output As #1 Print #1, "Алексеев С.С.", 206709
Print #1, "Информатика" Write #1, "Отлично"
Write #1, "Алексеев С.С.", 206709, "Информатика", "Отлично" Close #1
End Sub
Sub ЧтениеПоследоватФайла()
Dim Ввод
Open "e:\VBA_INTERNET\Ведомость" For Input As #1
Input #1, Ввод: MsgBox Ввод
Input #1, Ввод: MsgBox Ввод