Хитрости »
1 Май 2011 300320 просмотров
Что такое модуль? Какие бывают модули?
Любой код VBA должен где-то храниться. Для хранения кодов в VBA используются модули, которые хранятся в книге. Книга может содержать сколько угодно модулей. Каждый модуль в свою очередь может содержать множество процедур(макросов).
Все имеющиеся в книге модули можно посмотреть через редактор VBA (Alt+F11). Имеющиеся модули отображены в левой части редактора в проводнeике объектов(Project Explorer).
рис.1
Сам проводник объектов может быть не отображен по умолчанию и тогда его необходимо отобразить: нажать Ctrl+R либо в меню редактора VBA-View—Project Explorer
Модули делятся на пять основных типов:
- Стандартный модуль
- Модуль листа
- Модуль книги
- Модуль пользовательской формы
- Модуль класса
- Перенос, импорт и экспорт модуля
Вообще, если точнее, то всего-то два типа модуля — обычный и модуль класса, т.к. Модуль листа, Модуль книги, Модуль пользовательской формы и Модуль класса по своей сути являются модулями классов. Но я специально разделил их на несколько типов, т.к. именно такие типы часто употребляются при пояснениях в различных учебниках и на всевозможных форумах и в самих книгах Excel они по виду и некоторому функционалу различны.
Для того, чтобы создать новый стандартный модуль(Module), модуль класса(ClassModule) или пользовательскую форму(UserForm) надо просто в окне Проводника объектов(Project Explorer) щелкнуть правой кнопкой мыши, выбрать пункт Insert и затем тип добавляемого объекта(Module, ClassModule, UserForm). Так же добавить модуль можно и через меню: Insert -тип модуля.
Удалить тоже просто: щелкнуть правой кнопкой мыши на нужном модуле в окне проекта и выбрать Remove. Подробнее про удаление описано в конце этой статьи: Удаление модулей
СТАНДАРТНЫЙ МОДУЛЬ
на рис.1 Module1.
Самый распространенный тип модулей, который используется в большинстве случаев. Именно в них макрорекордер создает записываемые макросы. Все коды и процедуры в таких модулях пишутся вручную, либо копируются из других источников(другого модуля, с этого сайта и т.п.). В основном именно в стандартных модулях содержится большая часть кодов. Они предназначены для хранения основных процедур и Public переменных, которые могут быть доступны впоследствии из любого модуля. Как создать стандартный модуль: в окне проводника объектов щелкаем правой кнопкой мыши-Insert—Module. При записи макрорекордером модули создаются автоматически и им автоматически присваиваются имена.
Многие коды, опубликованные в статьях на сайте необходимо размещать именно в стандартных модулях. Для этого достаточно создать новый стандартный модуль, скопировать текст кода с сайта и вставить.
МОДУЛЬ ЛИСТА
Лист1 или Sheet1 — на рис.1: Лист1(Лист1),Лист2(Лист2),Лист3(Лист3).
Для каждого листа книги имеется свой отдельный модуль. Попасть в модуль листа проще, чем в остальные модули. Для этого надо просто щелкнуть правой кнопкой мыши по ярлычку листа и выбрать из контекстного меню пункт Исходный текст(View Code)
в зависимости от версии Excel этот пункт на русском может называться так же: Просмотреть код или Исходный код
:
Можно и более трудным путем пойти — через редактор VBA: Alt+F11 и в окне Проводника объектов(Project Explorer) дважды щелкнуть по объекту с именем листа или правая кнопка мыши на модуле листа —View code.
Размещая код в модуле листа следует помнить, что при копировании или переносе данного листа в другую книгу код так же будет скопирован, т.к. является частью листа. Это и плюс и минус одновременно. Плюс в том, что разместив код в модуле листа можно использовать этот лист в качестве шаблона для распространения со своими кнопками вызова этих кодов(в том числе создания книг кодом) и весь функционал будет доступен. Минус же заключается в некоторых нюансах обращения к ячейкам(подробнее можно ознакомиться в этой статье: Как обратиться к диапазону из VBA) и необходимости размещения ВСЕХ используемых процедур в этом листе, иначе при переносе в другие книги коды могут работать с ошибками.
В модуле листа содержатся встроенные событийные процедуры, каждая из которых отвечает за обработку определенного события на этом листе. Посмотреть их можно так: выбираете объект(на рисунке ниже список в левой части) Worksheet, а в правом списке выбираете событие(в этом списке все процедуры, доступные для выбранного листа):
Процедуры, события для которых уже используются, выделяются жирным шрифтом.
Названия событийных процедур носят достаточно информативные имена и большая их часть не нуждается в тщательной расшифровке. Но самые наиболее части применяемые в любом случае считаю нужным описать:
- Activate — возникает при активации самого листа(но не возникает, если произошел переход из одной книги в другую и этот лист является там активным)
- BeforeDoubleClick — возникает при двойном клике мыши на любой ячейке листа. Важно обращать внимание на передаваемые аргументы: Target и Cancel. Target — ссылка на ячейку, в которой было произведено действие; Cancel — отвечает за отмену режима редактирования
- BeforeRightClick — возникает при клике правой кнопкой мыши на любой ячейке листа. Важно обращать внимание на передаваемые аргументы: Target и Cancel. Target — ссылка на ячейку, в которой было произведено действие; Cancel — отвечает за отмену показа всплывающего меню
- Calculate — возникает при пересчете функций и формул на листе
- Change — возникает при изменении значений ячеек на листе. Важно обращать внимание на передаваемый аргумент Target. Target — ссылка на ячейку, которая была изменена. Может отличаться от активной в момент обработки ячейки
- Deactivate — возникает при переходе с этого листа на другой лист этой же книги
- FollowHyperlink — возникает при переходе по гиперссылке, созданной в этом листе
- SelectionChange — возникает при изменении адреса выделенной ячейки/области. Важно обращать внимание на передаваемый аргумент Target. Target — ссылка на диапазон ячеек, которые были выделены. Совпадает с выделенными на текущий момент ячейками
Достаточно важный момент: если захотите познакомиться поближе с событийными процедурами, всегда обращайте внимание на переменные, которые передаются в качестве аргументов в процедуру. В большинстве случаев рекомендую использовать именно эти переменные, а не выдумывать всякие возможности для вычисления объекта, который послужил причиной возникновения события. Для события листа Worksheet_Change это переменная Target. Для примера вставьте приведенный ниже код в модуль любого листа:
Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "Адрес измененной ячейки: " & Target.Address & _ "; Адрес активной ячейки: " & Selection.Address, vbInformation, "www.excel-vba.ru" End Sub
После этого запишите в ячейку A1 значение 5 и нажмите Enter. Событие Change сработает в момент завершения редактирования — т.е. в момент нажатия Enter. При этом будет произведен переход на ячейку A2(в большинстве случаев, если настройками не задано иное) и появится сообщение, которое покажет, что изменили ячейку A1, а выделена сейчас A2. Т.е. Target — это всегда ссылка именно на измененную ячейку независимо от того, что сейчас выделено. Данное событие(Worksheet_Change) не будет срабатывать при изменении значений ячеек с формулами. Только ручной ввод.
Примечание: для всех кодов, приведенных на сайте, достаточно просто открыть необходимый модуль(книги или листа) и вставить предложенный код. Корректировка может понадобиться только в случаях, когда в модуле Листа или Книги вашего файла уже имеется код в необходимой событийной процедуре.
МОДУЛЬ КНИГИ
ЭтаКнига или ThisWorkbook:
В модуль книги можно попасть только через проводник объектов(Project Explorer) редактора VBA — двойной щелчок по ЭтаКнига (ThisWorkbook) или правая кнопка мыши на модуле —View code. В модуле книги так же содержатся «встроенные» событийные процедуры. Так же как и для листа выбираем в списке объектов(вверху слева) Workbook. В правом окне выбора процедур, так же как и с модулем листа, будут все процедуры, доступные для объекта ЭтаКнига. Пример использования событийных процедур книги можно посмотреть в статье Как отследить событие(например выделение ячеек) в любой книге?
Но там применяются все те же правила — главное не забывать про аргументы, доступные из этих процедур и передаваемые им самим Excel. Например, для события Workbook_BeforeClose доступен аргумент Cancel. Это можно использовать, если не хотите, чтобы книгу закрыл пользователь, не заполнив ячейку A1. Вот пример подобного кода:
Private Sub Workbook_BeforeClose(Cancel As Boolean) If Me.Sheets("Отчет").Range("A1").Value = "" Then MsgBox "Необходимо заполнить ячейку A1 на листе 'Отчет'", vbCritical, "www.excel-vba.ru" Cancel = True 'отменяем закрытие книги End If End Sub
Из кода видно, что на листе «Отчет» должна быть не пустой ячейка A1(лист «Отчет» тоже должен существовать в этой книге). Но есть и еще одна вещь — какое-то Me. Это краткое обращение к объекту модуля класса, в данном случае это равнозначно обращению ThisWorkbook. И еще один пример кода для модуля ЭтаКнига, который запрещает сохранять исходную книгу, разрешая сохранить её только через пункт Сохранить как(SaveAs):
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If SaveAsUI = False Then 'используется простое сохранить MsgBox "Эта книга является шаблоном. Сохранять её можно только через Сохранить как", vbCritical, "www.excel-vba.ru" Cancel = True 'отменяем сохранение книги End If End Sub
Такое может потребоваться, если книга является шаблоном с полями для заполнения и необходимо предотвратить случайное сохранение исходного документа. Хотя это можно так же сделать без макросов — книгу можно сохранить с правами только на чтение.
МОДУЛИ ФОРМ
UserForm — на рис.1 UserForm1.
Содержатся внутри
Пользовательской формы(UserForm)
и её объектов. В Пользовательских формах в основном все завязано именно на событийных процедурах самой формы и на элементах этой формы(Кнопки, ТекстБоксы, КомбоБоксы(выпадающие списки) и т.д.). Очень удобно использовать Пользовательские формы в своих приложениях для общения с пользователем. Т.к. через формы очень удобно отслеживать действия пользователя и можно запретить доступ к листам с данными, путем их скрытия. Создается форма так же как и модуль: в окне проводника объектов щелкаем правой кнопкой мыши-Insert—UserForm. Примеры кодов с использованием форм можно посмотреть в статьях: Каждому пользователю свой лист/диапазон, Как оставить в ячейке только цифры или только текст?
МОДУЛЬ КЛАССА
ClassModule — на рис.1 Class1.
В большинстве случаев создается специально для отслеживания событий различных объектов. Вряд ли понадобиться начинающим изучение VBA, хотя все зависит от поставленной задачи. Но обычно начинающим изучать это кажется слишком сложным. В любом случае, перед работой с модулями классов лучше научиться хоть чуть-чуть работать с обычными модулями и самостоятельно писать процедуры. Как добавить такой модуль: в окне проводника объектов щелкаем правой кнопкой мыши-Insert—Class Module. Подробнее про модули классов и работу с ними можно почитать в этой статье: Работа с модулями классов. Там описаны все основные принципы и приложен файл примера.
Действия по удалению любого из модулей одинаковы для всех типов. Для этого необходимо перейти в проект VBA нужной книги, выбрать нужный модуль, щелкнуть по нему правой кнопкой мыши и в появившемся меню выбрать Remove (Имя модуля)…(Remove Module1, Remove UserForm1, Remove Class1 и т.п.). После этого появится окно с запросом «Do you want to export (имя модуля) before removing it?». Это означает, что VBA спрашивает: хотите ли Вы сохранить копию кодов модуля перед удалением? Как правило выбирать следует Нет. Но если Вы хотите сохранить текст кодов из удаляемого модуля в отдельном файле, то соглашаетесь, нажав Да. Будет предложено выбрать папку для сохранения модуля и можно даже задать ему отдельное имя.
Иногда нужно модуль из одной книги переместить в другую. Сделать это можно несколькими способами. Самый простой — открыть обе книги, перейти в проводник проектов -найти нужный модуль -захватить его левой кнопкой мыши и не отпуская кнопку перетащить на проект другой книги:
Следует помнить, что так можно перенести и скопировать только стандартный модуль, модуль класса и модуль
UserForm
. Коды модулей листов и книги придется переносить как обычный текст: переходим в модуль
ЭтаКнига
(откуда хотим копировать) -копируем весь код -переходим в модуль ЭтаКнига второй книги и вставляем скопированное:
Экспорт модуля(сохранение в отдельный файл)
Если же надо сохранить стандартный модуль, модуль класса или модуль формы и не переносить сразу же в другую книгу, то можно экспортировать модуль. Для чего это может быть нужно? Как правило, чтобы перенести коды из дома на работу, переслать кому-то на другой ПК(пересылка файла с макросами может быть запрещена политикой безопасности компании) и т.п. Делается это просто: щелкаем на модуле правой кнопки мыши —Export file.
У экспортируемых модулей есть разные расширения, в зависимости от типа модуля. Для стандартных модулей это
.bas
(Module1.bas), для модулей класса —
.cls
(Class1.cls). А вот для модулей форм будет создано целых два файла:
UserForm1.frm
и
UserForm1.frx
. Их важно хранить вместе — один без другого не может быть импортирован в дальнейшем в файл. В файле
.frx
хранится информация об визуальном отображении формы и её элементах, если можно так сказать. В файле
.frm
хранятся непосредственно тексты кодов для формы и служебная информация(имя и размеры формы, некоторые глобальные директивы и ссылка на файл .frx). Поэтому не рекомендуется без соответствующих навыков переименовывать эти два файла в надежде, что потом все заработает.
Импорт модуля(перенос экспортированного ранее в новую книгу)
Для переноса экспортированного модуля в другую книгу надо просто в проводнике объектов выделить нужный проект правой кнопкой мыши —Import module -выбрать в диалоговом окне нужный модуль.
Экспортировать можно любой модуль, а вот импортировать — нет. Модули листов и книг хоть и экспортируются в отдельные файлы(кстати, с расширением .cls), но импортировать их не получится в том виде, как это предполагается. Они будут импортированы как новые модули класса и только. Поэтому для переноса кодов из модулей листов и книг придется использовать все равно копирование и вставку непосредственно кодов.
И в довершение — можно переносить модули автоматически, кодами VBA: Как добавить код процедуры программно, скопировать модуль
Также см.:
Копирование модулей и форм из одной книги в другую
Что такое макрос и где его искать?
Как удалить макросы в книге?
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Знакомство с понятиями модуль, процедура, форма в VBA Excel. Модули разных типов. Создание пользовательской формы. Встроенные диалоговые окна.
Самый простой способ перейти в редактор VBA — при активном окне программы Excel нажать сочетание клавиш Alt+F11 (здесь используется левая клавиша Alt). Это сочетание работает во всех версиях программы. Если в открывшемся окне нет слева окна проводника «Project-VBAProject», вызовите его через главное меню, выбрав «View» — «Project Explorer». Внутренние окна в редакторе VBA можно перетаскивать и размещать в других местах главного окна.
Модули рабочей книги Excel представляют из себя файлы, предназначенные для создания и хранения программного кода в виде процедур (подпрограмм, функций и пользовательских свойств). Модули бывают нескольких типов: стандартные модули и модули классов (рабочих книг, рабочих листов, диаграмм, пользовательских форм).
Стандартный модуль
Стандартный модуль представляет из себя отдельный файл, встроенный в рабочую книгу Excel и принадлежащий всему проекту VBA (VBAProject) со всеми его объектами (ThisWorkbook, Worksheets, Charts, UserForms). Стандартный модуль можно экспортировать, импортировать или удалить. Его публичные процедуры с уникальными именами доступны во всех остальных модулях рабочей книги без дополнительной адресации. Для публичных процедур с неуникальными именами требуется указание имени модуля, из которого они вызываются.
Создание стандартного модуля:
- Откройте рабочую книгу Excel, в которую планируете добавить новый стандартный модуль, или создайте новую книгу в учебных целях.
- Откройте редактор VBA сочетанием клавиш Alt+F11.
- В окне редактора VBA нажмите на пункт меню «Insert» и в открывшемся списке выберите «Module».
Таким образом, вы создали новый стандартный модуль. В проводнике справа появилась папка «Modules» и в ней файл «Module1» (или «Module» с другим номером, если в вашей книге модули уже были). Такие же модули создаются при записи макросов встроенным рекордером.
Открыть или перейти в окно открытого стандартного модуля можно, дважды кликнув по его имени в проводнике, или открыв на нем правой кнопкой мыши контекстное меню и выбрав «View Code». Кроме того, все уже открытые модули доступны во вкладке «Window» главного меню.
Важное примечание: в Excel 2007-2016 книги с программными модулями сохраняются как «Книга Excel с поддержкой макросов (.xlsm)». Если вы добавили модуль в книгу «Книга Excel (.xlsx)», то, при ее сохранении или закрытии, программа Excel предложит сохранить ее как «Книга Excel с поддержкой макросов (.xlsm)», иначе изменения (созданные или импортированные модули) не сохранятся.
Модули классов
К модулям классов относятся модули книг, рабочих листов, диаграмм и пользовательских форм.
Модуль книги
Модуль книги принадлежит только объекту Workbook (Рабочая книга). Открыть или перейти в окно открытого модуля книги можно, дважды кликнув в проводнике на пункте «ЭтаКнига», или открыв на нем правой кнопкой мыши контекстное меню и выбрав «View Code». Кроме того, открытый модуль доступен во вкладке «Window» главного меню.
Модуль листа
Модуль листа принадлежит только объекту Worksheet (Рабочий лист). Открыть модуль листа можно, дважды кликнув в проводнике по его имени, или открыв на нем правой кнопкой мыши контекстное меню и выбрав «View Code». Кроме того, перейти в модуль листа можно из рабочей книги, кликнув правой кнопкой мыши по ярлыку этого листа и выбрав в контекстном меню «Просмотреть код». Открытый модуль доступен во вкладке «Window» главного меню.
Модуль диаграммы
Модуль диаграммы принадлежит только объекту Chart (Диаграмма, вынесенная на отдельный лист рабочей книги). Открыть его можно так же, как и модуль рабочего листа.
Модуль формы
Модуль формы принадлежит только объекту UserForm (Пользовательская форма). Откройте редактор VBA сочетанием клавиш Alt+F11 и нажмите на пункт меню «Insert». В открывшемся списке выберите «UserForm». Таким образом вы создадите новую пользовательскую форму «UserForm1». В проводнике справа появилась папка «Forms» и в ней файл «UserForm1». Перейти в модуль формы можно, дважды кликнув по самой форме, или кликнув по имени формы в проводнике правой кнопкой мыши и выбрав в контекстном меню «View Code». Кроме того, открытый модуль доступен во вкладке «Window» главного меню.
Стандартных модулей в одной книге можно создать любое количество, модуль книги только один, модулей листов или форм только по одному для каждого экземпляра листа или формы.
Между открытыми окнами форм и модулей можно переходить, нажав в главном меню вкладку «Window», где перечислены все открытые модули и формы (активный объект отмечен галочкой).
Процедура
Процедуры VBA Excel, размещаемые в любом модуле, подразделяются на 3 типа:
- Sub (подпрограмма),
- Function (функция),
- Property (пользовательские свойства).
Главное отличие функции от подпрограммы заключается в том, что функция возвращает результат вычислений, а подпрограмма — нет. Процедура Property предназначена для создания пользовательских свойств и управления ими (используется не часто).
В редакторе VBA Excel перейдите в стандартный модуль и нажмите на пункт меню «Insert». В открывшемся списке выберите «Procedure…». Появится окно с предложением ввести название процедуры, выбрать тип и зону видимости. Создайте пару процедур с разной зоной видимости, пусть одна будет Sub, а другая — Function. В промежутке между началом и концом процедуры пишется программный код.
Private Sub Test() ‘Здесь пишется программный код End Sub |
Зона видимости Private означает, что эту процедуру можно вызвать только из того же модуля, в котором она записана.
Зона видимости Public означает, что эту процедуру можно вызвать не только из того же модуля, в котором она записана, но и из любого другого модуля этой книги и даже из модулей других книг.
Публичная процедура (Public) может быть записана и без явного указания видимости — зона видимости Public предполагается по умолчанию.
Первая запись:
и вторая запись:
равнозначны.
Форма
Формы в VBA Excel используются для создания диалоговых окон. Процедура создания новой формы описана в параграфе «Модуль формы». Обычно, вместе с новой формой открывается панель «ToolBox» с элементами управления, которые можно добавлять на форму. Если вы закрыли панель с элементами управлениями, отобразить ее снова можно через главное меню, выбрав «View» — «ToolBox».
Стоит добавить, что в VBA Excel есть два встроенных диалоговых окна — MsgBox и InputBox.
MsgBox — это окно для вывода информации с возвратом числового значения кнопки, нажатой пользователем.
InputBox — это окно с приглашением пользователя ввести какую-либо текстовую информацию. Есть еще расширенная версия этого окна — Application.InputBox, которую можно использовать для записи адреса выделяемого диапазона ячеек и не только для этого.
Глава 1
Краткое руководство по VBA
Цель данной главы — ознакомить читателя с основами программирования на языке Visual Basic for Applications (VBA), который встроен в пакет Microsoft Office.
Эта глава по форме изложения скорее похожа на справочник. Она рассчитана на пользователей, имеющих некоторый опыт создания программ на других объектно-ориентированных языках программирования, то есть представляющих, что такое переменная, константа, оператор, цикл, массив, класс, объект и т. д. Главный упор в данной главе сделан на описание синтаксиса и особенностей использования основных конструкций VBA, которые нужно знать для понимания приведенных в тексте листингов.
Знакомство с VBA
VBA — это язык программирования, поддерживаемый большинством приложений пакета Microsoft Office. Для запуска среды программирования VBA можно использовать сочетание клавиш Alt+F11.
Возможности VBA
Благодаря высокой степени интеграции в приложения язык VBA позволяет программисту легко применять существующие возможности Microsoft Office для решения специфических задач. Не менее легко VBA позволяет добавлять в приложения этого пакета новые возможности, увеличивая функциональность приложений и удобство работы с ними.
Применительно к Excel программирование на VBA позволяет реализовывать следующие возможности (естественно, это далеко не полный список):
• добавление функций для специфических расчетов;
• ускорение ввода данных в таблицу;
• автоматизацию типичных, часто выполняемых пользователем действий;
• создание команд меню, панелей инструментов как на основе уже имеющихся, так и выполняющих совершенно новые действия;
• повышение наглядности данных (например, с помощью различной окраски ячеек);
• автоматизацию обработки больших объемов данных;
• автоматизацию создания разнообразных отчетов, бланков и прочих действий, связанных с выбором заданной информации из большого объема исходных данных.
Реализация всех этих возможностей при использовании VBA очень часто достигается написанием небольшого количества достаточно простого программного кода.
Структура проекта VBA
Внешний вид редактора VBА с открытым проектом представлен на рис. 1.1.
Рис. 1.1. Проект VBA
В редакторе открыты три окна: слева вверху — окно структуры проекта (Project), слева внизу — окно свойств (Properties) и справа — окно с текстом программы модуля. С помощью окна Project (Проект) можно просматривать структуру проекта, добавлять и удалять элементы проекта, открывать для редактирования содержимое модуля (двойным щелчком на значке соответствующего модуля). Окно Properties (Свойства) используется для задания свойств выделенных элементов проекта.
VBA-проект в Microsoft Excel может содержать следующие элементы:
• модули (стандартные модули VBA);
• модули класса;
• модули рабочей книги;
• модули рабочих листов;
• модули диаграмм;
• формы.
Стандартный модуль VBA
Стандартный модуль VBA — это элемент проекта, который содержит программный код, непосредственно используемый остальными элементами проекта (глобальные функции, переменные, константы и т. д.). В окне структуры проекта стандартные модули группируются в папку Modules.
Обычно в стандартном модуле записываются программы, которые не привязаны к конкретным объектам, таким как рабочий лист и рабочая книга. Именно в этом модуле записывается большинство примеров (трюков), рассматриваемых в последующих главах книги.
Модуль класса
Модуль класса — это модуль, в котором записывается программный код, реализующий работу пользовательских (созданных программистом) классов. В окне структуры проекта такие модули группируются в папку Class Modules.
Модуль рабочей книги
Модуль рабочей книги (ЭтаКнига в папке Microsoft Excel Objects) — это модуль класса, в котором реализуются дополнительные возможности по манипулированию рабочей книгой. Программы, записанные в этом модуле, могут напрямую обращаться к свойствам и методам объекта рабочей книги (см. описание модулей класса в конце главы). Отличием модуля рабочей книги от обычного модуля класса является то, что из программы на VBA нельзя создать экземпляр объекта рабочей книги — он создается автоматически.
Модуль рабочего листа
Модуль рабочего листа (папка Microsoft Excel Objects) — это модуль класса, в котором реализуются дополнительные возможности по манипулированию определенными рабочими листами книги. Программы, записанные в этом модуле, могут напрямую обращаться к свойствам и методам объекта рабочего листа. Из программы на VBA также нельзя создать экземпляр объекта конкретного рабочего листа — можно создать только новый рабочий лист с пустым модулем.
Модуль диаграммы
Модуль диаграммы (папка Microsoft Excel Objects) — это модуль класса, в котором реализуются дополнительные возможности по манипулированию диаграммами, вынесенными на отдельные листы рабочей книги. Особенности модуля диаграммы аналогичны особенностям модуля рабочего листа.
Форма
Форма (папка Forms) — это элемент проекта VBA, с помощью которого можно создавать диалоговые окна для взаимодействия с пользователем. Форма состоит из двух частей: модуля формы и собственно формы (диалогового окна).
Модуль формы — это модуль класса, в котором реализуется поведение формы. Использование этого модуля аналогично использованию обычного модуля класса. Для открытия модуля формы служит пункт View Code (Просмотр кода) контекстного меню, которое вызывается щелчком правой кнопки мыши на значке формы в окне Project (Проект).
Для задания внешнего вида диалогового окна используется редактор форм, который открывается с помощью пункта View Object (Просмотр объекта) контекстного меню. Форма, открытая для редактирования внешнего вида, показана на рис. 1.2.
Рис. 1.2. Редактирование формы
Для изменения свойств открытой формы используется окно Properties (Свойства). В окне ТооШох (Панель инструментов) можно выбирать элементы управления, добавляемые в форму. После добавления любого элемента управленияс помощью двойнго щелчка кнопкой мыши на нем можно перейти к редактированию соответствующего кода в модуле формы.
Структура модуля VBA
При разработке любой программы на VBA программный код записывается в одном или нескольких модулях. Код, записанный в любом модуле VBA, имеет следующую структуру.
1. Объявления переменных, директивы (с использованием ключевого слова Option), объявления API-функций.
2. Объявления и реализация процедур и функций.
Соглашения, применяемые при описании синтаксиса VBA
В данном разделе приводится описание элементов, которые используются для формального задания синтаксиса конструкций языка VBA. Сведения об этих элементах приведены в табл. 1.1.
Таблица 1.1. Элементы описания синтаксических конструкций VBA
Примечание
Кроме описанных в таблице элементов, при задании формата синтаксических конструкций и в текстах программ используется символ подчеркивания «». Он является стандартным символом VBA. Текст, который заканчивается символом подчеркивания, представляет собой одно целое с текстом на следующей строке.
Чтобы сказанное выше стало более понятным, ниже приведен пример формального задания синтаксической конструкции языка VBA. В качестве примера взят формат упрощенного объявления локальной переменной (смысл всех элементов данной конструкции будет полностью раскрыт в последующих разделах главы):
Dim Static Имя [As Имя_типа][, Имя_переменной [As Имя_типа]]…
Приведенная запись означает, что строка объявления локальной переменной должна начинаться инструкцией Dim или Static. После инструкции должен следовать идеитификатор переменной. Необязательным элементом конструкции является указание типа переменной. Но если тип указывается, то значение в квадратных скобках (первых) должно быть использовано полностью, то есть ключевое слово As не должно применяться без указания имени типа. Объявления переменных можно продолжить в этой же строке без повторного использования инструкции Dim, но разделяя их запятой (см. вторые скобки). Подобные объявления можно продолжать в строке до бесконечности (об этом говорит использование многоточия после вторых скобок).
Примеры объявлений переменных, удовлетворяющие указанному формату, приведены ниже:
Dim intPos As Integer
Dim varValue, intValue As Integer
Static strText As String
Static var1 As Variant, var2 As Variant, var3 As Variant
Комментарии в программе
В VBA предусмотрены два способа введения комментариев в программы. Первый — это использование ключевого слова Rem для обозначения начала комментария. Второй — использование вместо Rem апострофа (). Главным различием этих двух способов является то, что ключевое слово Rem должно находиться в начале строки программы. При этом вся строка является комментарием. Например:
Rem Объявление переменной
Dim intRes As Integer
Rem Присвоение значения переменной
intRes = 123
Комментарий же, вводимый с помощью апострофа, может быть расположен как в отдельной строке, так и на одной строке с другими инструкциями (в конце этой строки):
‘ Объявление переменной
Dim intRes As Integer
intRes = 123 Присвоение значения переменной
Все комментарии в VBA являются однострочными, но при необходимости их текст может быть перенесен на следующую строку с использованием символа подчеркивания:
‘ Длинный комментарий, текст которого не помещается _
в одной строке
или
Rem Длинный комментарий, текст которого не помещается _
в одной строке
Идентификаторы
Идентификаторами в VBA являются названия переменных, констант, функций, процедур, классов, типов данных и прочих элементов, не являющихся зарезервированными словами языка (названиями инструкций, операторов, встроенных функций и т. д.).
Среда разработки VBA поддерживает кодировку символов Unicode. Поддержка данной кодировки разработки означает, что программист может использовать в составе идентификаторов символы любого поддерживаемого алфавита (например, кириллицы).
При формировании идентификаторов необходимо учитывать следующее.
• Идентификатор должен состоять только из букв (любого алфавита), цифр и символа подчеркивания.
• Первым символом идентификатора должна быть буква.
Внимание!
VBA не различает регистр символов в идентификаторах. Это значит, что идентификаторы strmyText и strMyText будут представлять одну и ту же переменную. Это же справедливо и для идентификаторов процедур, функций, классов и т. д.
Рассмотрим примеры корректных идентификаторов VBA:
strText
CUSTOM_Data2
Функция_Суммы
РасчетПрибыли
Переменные
В данном разделе читатель ознакомится с основными особенностями использования переменных при написании программ на языке VBA.
Встроенные типы данных
VBA располагает множеством встроенных типов данных. Условно эти типы можно разделить на численные типы, строки, ссылки, типы для хранения даты и времени, объектные ссылки, массивы и особый тип для хранения значения любого типа, именуемый Variant.
Численные типы данных
Основные характеристики численных типов VBA приведены в табл. 1.2.
Таблица 1.2. Численные типы данных VBA
Примечание
Численный тип Decimal как самостоятельный тип на сегодняшний день не поддерживается. Однако его можно использовать в пределах типа Variant (о типе Variant будет рассказано далее).
Строки
Для хранения символьных данных в VBA реализована поддержка типа данных String (строка). В переменных этого типа могут храниться отдельные символы и большие фрагменты текста. Строки в VB А бывают двух видов: фиксированной и переменной длины. Разница между этими двумя типами строк понятна из их названий.
Строки фиксированной длины применяются, когда длина текста, который хранится в них, постоянна или не может превышать известный предел (например, для хранения отдельных символов). Строки фиксированной длины в ряде случаев обрабатываются быстрее строк переменной длины. Максимальный размер строки фиксированной длины — около 65 400 символов.
Строки переменной длины являются более гибким инструментом обработки текста в программах на VBA. Длина этих строк может динамически изменяться в зависимости от длины хранимого в них текста. Максимальная длина таких строк — около 2 млрд символов.
Дата и время
Для удобства работы со значениями даты и времени в VBA введен тип данных Date. Он позволяет задавать значения времени и даты в формате, удобном для восприятия, а также упрощает вычисления с временными интервалами. Этот тип данных, естественно, используется и в таблицах Excel.
Нужно заметить, что тип Date не является внутренним типом, используемым VBA для хранения даты и времени. Вместо него применяется тип Single (число с плавающей точкой). Целая часть этого числа — количество суток, прошедших с 30 декабря 1899 года, дробная — прошедшая часть текущих суток.
Тип данных Variant
В VBA предусмотрен один универсальный тип данных — Variant. Переменная этого типа может хранить значение любого поддерживаемого VBA типа (в том числе и ссылки на объекты, о которых будет рассказано ниже).
Однако при обработке переменных типа Variant тратится дополнительное время на определение и преобразование типа данных в этих переменных — самый универсальный тип данных VBA оказывается и самым медленным. Поэтому следует избегать слишком частого и неоправданного использования переменных этого типа (например, в качестве целочисленных итераторов, счетчиков и т. д.).
Когда переменная типа Variant пуста (ей не присвоено никакого значения), она заполняется специальным значением Empty.
Ссылки. Тип данных Object
Важно понимать, что в VBA переменные, предоставляющие доступ к объектам, являются только ссылками на эти объекты. В данном языке программирования невозможно получить сам объект (его двоичный код). Все операции по созданию, удалению объектов и манипулированию ими, осуществляются только с использованием ссылок.
Объекты, доступные из VBA, существуют, пока на них установлена хотя бы одна ссылка. Первая ссылка на объект устанавливается при его создании. В процессе работы можно как устанавливать новые ссылки на объект, так и удалять их с использованием специальной инструкции Set. Пусть objRef — ссылка на некоторый объект. Тогда операция установления новой ссылки будет иметь такой вид:
Set objNewRef = objRef
Теперь objNewRef ссылается на тот же объект, что и objRef. Операция же удаления ссылок будет выглядеть следующим образом:
Set objRef = Nothing
Set objNewRef = Nothing
Если на объект не было других ссылок, кроме этих, то он будет удален.
Для доступа к объектам в VBA предусмотрен тип данных Object. Он является универсальным, так как может быть ссылкой на объект любого типа.
Объявление переменных
Для объявления переменных элементарных типов (не массивов) в блоке объявлений модуля используется следующая инструкция:
Public Private [WithEvents] Имя_переменной [As [New] Имя_-
типа] _
[, Имя_переменной [As [New] Имя_типа]]…
Ключевые слова, записанные до первых квадратных скобок, задают область видимости переменных:
• Public — позволяет объявлять глобальные переменные и общие переменные-члены класса (о классах будет рассказано позже);
• Private — позволяет объявлять переменные, доступные только в одном модуле, и частные переменные-члены класса.
Для объявления переменных элементарных типов (не массивов) в процедурах или функциях используется такая инструкция (локальных переменных):
Dim Static [WithEvents] Имя_переменной [As [New] Имя_типа] _
[, Имя_переменной [As [New] Имя_типа]]…
Ключевые слова, записанные до первых квадратных скобок, задают время жизни переменных:
• Dim — используется для объявления локальных переменных, которые уничтожаются после выхода из процедуры;
• Static — используется для объявления локальных переменных, значения которых сохраняются между вызовами процедуры или функции.
Ключевое слово WithEvents используется для объявления переменной-обработчика событий объекта.
Имя_переменной — это идентификатор объявляемой переменной.
Имя_типа — название типа данных объявляемой переменной.
Если конструкция [As [New] Имя_типа] не используется, то типом объявляемой переменной автоматически становится тип Variant.
Если используется ключевое слово New, то создается новый объект. New нельзя использовать совместно с WithEvents, а также при объявлении переменной типа Object и если тип Имя_типа не является объектным.
Ниже приведены примеры объявления переменных на VBA:
Public intData As Integer
Private intCount As Integer, varData
Dim strText As String
Static a, b, c
Dim objRef As Object
Dim objCtrl As New Control
Внимание!
При объявлении в одной строке нескольких переменных слово As относится только к переменной, непосредственно после идентификатора которой оно следует. Например, при объявлении Dim а, Ь, с As Integer переменные а и b будут иметь тип Variant, а переменная с — тип Integer.
Инициализация переменных
После того как переменная объявлена, VBA производит ее инициализацию указанным ниже образом.
• Переменным численных типов автоматически присваивается нулевое значение.
• Строки переменной длины после объявления являются пустыми (с нулевой длиной). Строки фиксированной длины заполняются нулевыми символами.
• Данные типа Date инициализируются значением 00:00:00 30.12.1899 (это равняется нулю при представлении даты в численном формате, о котором было рассказано выше).
• Все переменные типа Object и подобные (то есть ссылки на объекты определенного типа) принимают значение Nothing, если при их объявлении не создан новый объект (не использовалось New).
Явное и неявное объявление переменных
Рассмотренное выше объявление переменных называется явным.
VBA также поддерживает неявное объявление переменных. Под неявным объявлением подразумевается возможность использования переменной без ее объявления посредством инструкции Dim, Static, Private или Public. При первом обращении к такой переменной для нее автоматически выделяется память и происходит ее инициализация. Следует отметить, что все неявно объявленные переменные имеют тип Variant.
Использование неявного объявления переменных может как упростить написание программ, так и значительно усложнить процесс их отладки.
К примеру, можно очень долго разбираться, почему же после вычисления такого выражения, как dblSalaryAccount = dblSalaryAcount * 10. 5, значение переменной dblSararyAccount стало равным нулю, если до этого оно было равно 5.37 5. Все дело в небольшой ошибке в названии идентификатора переменной, в результате которой создается новая переменная dblSalaryAcount, которая инициализируется нулевым значением. В случае использования явного объявления переменных подобных ошибок в программе быть не может, потому что каждый раз при обнаружении необъявленного идентификатора VBA выдает ошибку.
Для включения требования обязательного объявления переменных используется директива Option Explicit. Чтобы данная директива добавлялась в каждый новый модуль автоматически, нужно с помощью меню Tools → Options (Сервис → Параметры) редактора VBA открыть диалоговое окно Options (Параметры) и на вкладке Editor (Редактор) установить флажок Require Variable Declaration (Явное описание переменных).
Константы
Как и в любом другом языке программирования, в VBA можно сопоставлять с идентификаторами константные значения. Объявление констант в языке VBA во многом сходно с объявлением переменных. Синтаксис инструкции объявления константы следующий:
[Public Private] Const Имя_константы [As Имя_типа] = Значение
Два ключевых слова в первых скобках задают область видимости константы:
• Public — используется для объявления глобальных констант;
• Private — используется для объявления констант, доступных только в том модуле, где они объявлены.
По умолчанию, то есть когда не употреблены указанные ключевые слова, константа является Private.
Имя_константы — задает идентификатор константы.
Значение — константное значение (например, «Строка1», 1.245 ит. д.) либо выражение, в число аргументов которого не входят переменные и функции.
Если тип константы не задан, то он автоматически выбирается VBA исходя из ее значения. Ниже приводятся примеры объявления констант:
Const PI As Double = 3.14159265359
Public Const MyConstString = «MyConst»
Private Const НазваниеТаблицы As String = «Отчеты»
Операторы
Язык VBA содержит большое количество встроенных операторов, которые позволяют выполнять разнообразные действия над всеми встроенными в VBA типами. Операторы и их операнды по определенным правилам составляются в выражения. Данный раздел посвящен описанию операторов, предоставляемых VBA-npoграммисту.
Операторы для работы с численными значениями
Информация обо всех операторах для работы с численными значениями приведена в табл. 1.3.
Таблица 1.3. Операторы для работы с численными значениями
Примечание
Оператор «+» может использоваться и для соединения строк. Однако bVBA существует специальный оператор «&», выполняющий эту функцию. Рекомендуется использовать для соединения строк именно оператор «&», так как это способствует легкому визуальному отделению операций над строками от операций над другими типами данных, что, в свою очередь, улучшает читаемость кода.
Операторы сравнения
Результатом выполнения всех операторов сравнения является значение типа Boolean. Если операнды какого-либо оператора удовлетворяют его условию, то возвращается значение True, иначе возвращается значение False. Все операторы сравнения, поддерживаемые VBA, приведены в табл. 1.4.
Таблица 1.4. Операторы сравнения
Описанные операторы сравнения могут принимать в качестве операндов значения выражений любого типа, то есть фактически оперируют с типом данных Variant. Если один из операндов равен Empty, то результатом выполнения операторов будет специальное значение NULL. Если операнды несравнимы, то при выполнении описанных выше операторов генерируется ошибка: «Несоответствие типа».
Режим сравнения строковых значений можно задать с помощью директивы Option Compare. Для Excel работают два варианта данной директивы: Option Compare Text (текст сравнивается без учета регистра символов) и Opt ion Compare Binary (сравниваются бинарные коды символов, при этом автоматически учитывается их регистр). По умолчанию сравнение строк происходит согласно директиве Option Compare Binary.
В VBA реализованы два специфических оператора Like и Is, которые тоже относятся к операторам сравнения. Они также возвращают значение типа Boolean как результат сравнения.
Оператор I s используется для определения, являются ли две ссылки ссылками на один и тот же объект. Этот оператор допускает использование в качестве операндов только ссылки на объекты. Формат данного оператора такой:
Результат = Ссылка1 Is Ссылка2
Оператор Like используется для проверки, удовлетворяет ли текст в строке заданному шаблону. Формат этого оператора следующий:
Результат = Строка Like Шаблон
Перечень символов, которые могут употребляться в строке шаблона, приведен в табл. 1.5.
Таблица 1.5. Перечень возможных символов в строке шаблона
В качестве примера определим, является ли строка «15 26 ОА» номером автомобиля серии ОА или ОО. Значение строки-шаблона для этого случая будет равно «## ## О[AО]», а результатом применения оператора «15 26 ОА» Like «## ## О[АО]» будет значение True.
Для задания непрерывного диапазона символов в квадратных скобках можно воспользоваться знаком «минус» (-). При этом символы необходимо указывать в возрастающем порядке (по номеру в алфавите): [A-Z], а не [Z-A].
Примечание
Если нужно, чтобы в шаблоне присутствовали специальные символы, приведенные в табл. 1.5, то необходимо заключить соответствующие знаки в скобки: ([), (]), (#), (?), (*).
Логические операторы
В VBA введены операторы, которые используются в составе логических выражений (например, условие в инструкции If-Then-Else, которая будет рассмотрена позже). Формат логических операторов VBA (кроме импликации) и их описание приведены в табл. 1.6 (все выражения, используемые в операторах, — логические, принимающие значение True или False).
Таблица 1.6. Логические операторы VBA
Массивы
При создании программ часто приходится оперировать большими количествами данных одного типа и имеющих одинаковый смысл. Для хранения таких данных используются массивы. Массив — это совокупность значений одного типа, объединенных в одной переменной.
Язык VBA предоставляет широкие возможности для использования массивов. В нем работа с массивами значительно упрощена. Например, при выполнении программы автоматически контролируется выход за пределы массива. Также VBA-программисту при работе с массивами не нужно заботиться о выделении и освобождении памяти.
Объявление массива
Для объявления массивов в VBA используются инструкции, формат которых приведен ниже:
Public Private Имя_массива ([Размерность])[As Имя_типа] _
[, Имя_массива ([Размерность]) [As Имя_типа]]…
или
Dim Static Имя_массива ([Размерность])[As Имя_типа] _
[, Имя_массива ([Размерность]) [As Имя_типа]]…
Первая инструкция используется для объявления массивов на уровне модуля, вторая — для объявления массива в процедуре или функции (все аналогично объявлению переменных).
Объявление массива отличается от объявления любой другой переменной тем, что при объявлении массива после идентификатора переменной указывается размерность. Если размерность не указана, то создается динамический массив, размер которого можно изменять во время выполнения программы. Для динамического массива инструкция объявления является формальной: чтобы этот массив можно было использовать, к нему необходимо применить инструкцию ReDim (об этой инструкции будет рассказано далее).
При указании размерности массива необходимо учитывать, что элемент Размерность имеет следующий формат:
Нижняя_граница To Верхняя_граница Количество_элементов _
[,Нижняя_граница To Верхняя_граница Количество_элементов]…
В VBA разрешено создавать многомерные массивы с количеством измерений не более 60. Размерности измерений массива разделяются запятой.
При задании размерности в виде Нижняягранща То Верхняягранща нужно явно указывать нижнюю и верхнюю границы измерения массива (например, 50 То 100).
При задании размерности можно также просто указывать требуемое количество элементов в данном измерении массива. При таком задании в качестве нижней границы измерения используется значение по умолчанию (об изменении этого значения будет рассказано далее).
Ниже приведены примеры объявлений массивов (переменного размера, двух одномерных и двух многомерных):
Dim avarValues()
Dim astrValues(1 To 10) As String, astrValues2(10) As String
Dim aintValues(1 To 10, 1 To 3) As Integer, aintValues(10, 3)
As Integer
Задание нижней границы по умолчанию
Как было сказано ранее, при указании размерности измерения массива может использоваться значение нижней границы по умолчанию. Для задания нижней границы, используемой по умолчанию, предназначена директива Option Base. Существуют только два варианта данной директивы:
Option Base 0
и
Option Base 1
Первый вариант устанавливает нижнюю границу равной нулю (используется по умолчанию), а второй — единице.
Изменение размера массива
Язык VBA позволяет изменять размер динамического массива во время выполнения программы. Кроме того, VBA дает возможность изменять количество измерений такого массива. Для этого используется инструкция ReDim, формат которой следующий:
ReDim [Preserve] Имя_массива ([Размерность])[As Имя_типа] _
[, Имя_массива ([Размерность]) [As Имя_типа]]…
Назначение элементов данной инструкции полностью аналогично назначению одноименных элементов инструкции Dim (при использовании ее для объявления массивов). Тип элементов массива можно указывать только в том случае, если Имямассива — это идентификатор переменной типа Variant.
При выполнении инструкции ReDim без использования ключевого слова Preserve значения всех элементов, которые ранее были в массиве, теряются. Ниже приведены примеры таких инструкций:
ReDim astrValues(1 To 10), aintValues(10, 20)
ReDim varArray(2 To 4) As Boolean
Использование Preserve позволяет изменять размер массива, не теряя значений его элементов. Однако использование данного ключевого слова налагает некоторые ограничения на возможности манипулирования массивами:
• нельзя изменять количество измерений массива;
• нельзя изменять размерности измерений массива, кроме размерности последнего измерения;
• можно изменять только верхнюю границу последнего измерения массива.
Давайте рассмотрим пример использования инструкции ReDim с ключевым словом Preserve:
‘ Первая инструкция ReDim для динамического массива
ReDim astrValues(1 To 5, 1 To 10)
…
‘ Увеличение размера массива
ReDim Preserve astrValues(1 To 5, 1 To 25)
…
‘ Уменьшение размера массива
ReDim Preserve astrValues(1 To 5, 1 To 15)
Определение границ массива
Так как VBA позволяет задавать произвольную нижнюю границу массива, при написании программ крайне удобно наличие возможности узнать границы массива во время выполнения программы. Для этой цели в VBA введены две функции, формат которых следующий:
LBound(Имя_массива[, Номер_измерения])
RBound(Имя_массива[, Номер_измерения])
Функция LBound позволяет получить нижнюю границу массива, a RBound — верхнюю. Обе функции принимают в качестве аргументов идентификатор массива и номер измерения, границу которого нужно получить. Нумерация измерений начинается с единицы. Если параметр Номеризмерения опущен, то его значение принимается равным единице. Обе функции возвращают значение типа Long.
Ниже приведен пример получения нижней и верхней границ первого измерения массива avarValues (значения сохраняются в переменных типа Long):
lngLBound = LBound(avarValues)
lngRBound = RBound(avarValues)
Доступ к элементам массива
Для доступа к элементам массива в VBA используется указание номера этого элемента в круглых скобках после идентификатора переменной массива. При этом номера измерений массива разделяются запятыми. Например (для одномерного и трехмерного массивов):
intNum = aintValues(16)
intNum = aintValues(12, 32, 3)
Использование переменной Variant при работе с массивами
Язык VBA поддерживает универсальный тип данных Variant, которому находится применение и при работе с массивами. Переменной этого типа можно присваивать массив. В результате этой операции в переменной Variant формируется копия массива. Далее с такой переменной можно работать либо как с обычной переменной, либо как с массивом (использовать доступ к элементам), например:
Dim aintValues(1 To 3) As Integer
Dim varArray
‘ Присвоение массива переменной типа Variant
varArray = aintValues
‘ Доступ к элементам массива
varArray(1) = 1
varArray(2) = 2
varArray(3) = 3
Возможность присвоения массива переменной типа Variant на самом деле широко используется в VBA при передаче массивов в функции и процедуры, а также при возврате функциями массивов.
Для определения того, содержит ли переменная типа Variant массив, можно использовать функцию IsArray, имеющую следующий формат:
IsArray(Переменная)
Данная функция возвращает значение типа Boolean: True — если в переменной с именем Переменная содержится массив, и False — в противном случае.
Использование функции Array для заполнения массива
В VBA имеется возможность быстрого заполнения массива значениями. Эта возможность реализована в функции Array. Ее формат такой:
Array(Список_элементов)
В качестве аргументов функция принимает список значений, разделенных запятой. Возвращает она заполненный заданными значениями массив, сохраненный в переменной типа Variant. Ниже приведен пример использования функции Array:
Dim varArray
‘ Заполнение массива значениями
varArray = Array(1, 2, 3, 4, 5)
Коллекции
Коллекции (они же семейства и множества) — это объекты, которые позволяют хранить произвольное количество элементов любого типа. Элементы в коллекции идентифицируются уникальным ключом, которым может быть не только номер элемента в коллекции, но и значение строкового или другого типа. При программировании на VBA различные коллекции используются очень часто. Например, к коллекции Workbooks нужно обращаться для получения ссылки на объект Workbook нужной рабочей книги, к коллекции Worksheets — для получения ссылки на объект Worksheet нужного рабочего листа и т. д.
В VBA коллекции реализованы во встроенном классе Collection. Создание объекта Collection ничем не отличается от создания объекта другого типа:
Dim col As New Collection
или
Dim col As Collection
Set col = New Collection
Добавление элементов
Для добавления элементов в коллекции реализован метод Add, имеющий следующий формат:
Ссылка. Add Элемент [, Ключ][, Добавить_перед][, Добавить_после]
Единственным обязательным параметром метода Add является значение добавляемого элемента. Элемент может быть константой или переменной любого типа, кроме типа, определенного пользователем. При добавлении элемента можно указать ключ, который будет однозначно идентифицировать элемент в коллекции. Ключ — это любое значение типа Variant.
По умолчанию новые элементы добавляются в конец коллекции. Для изменения порядка добавления элементов используются параметры Добавить_перед и Добавить_после, с помощью которых указывается номер или ключ того элемента, перед которым или после которого нужно вставить новый элемент. Нумерация элементов в коллекции начинается с единицы.
Конец ознакомительного фрагмента.
Цитата:
Originally posted by solomija
Помогите плз начинающим.
Никак не пойму как соотносятся между собой коды, размещенные в модулях, формах и рабочих листах.
Тоесть, в каком месте в каком случае нужно писать?
(может кто-то подскажет где конкретно об этом в нете можно почитать)
И еще совсем практический вопрос: как сделать, чтобы значение, например, текстбокса первой формы было доступно при роботе второй формы?
Ооочень нужна помощь:(
Если коротко, то ситуация такая:
1. Модуль — для хранения функций, процедур, переменныx (если он объявлены как Public на верху модуля, то доступны везде). В случае с Excel’ем:
— если в модуле объявить публичную процедуру Public Sub, то он будет считать ее макросом и можно будет ее увидеть в списке доступных макросов через меню Сервис/Макросы…
— если же объявить Public функцию, то ее можно будет выбрать в меню функции в разделе: Пользовательские функции.
2. Каждая форма (в Excel’е они называются UserForm) всегда имеет свой модуль. Они неразрывно связаны. В конструкторе VB при выборе формы можно переключаться между видом самйо формы с контролами и модулем формы. Это модуль не является модулем как в пункте 1, он отличается и потому их выделяют отдельно и называют — модуль формы.
В модуле формы как и в обычном модуле можно тоже объявлять функции, процедуры и переменные, но помимо этого, именно в нем хранится код обработки СОБЫТИЙ контролов на форме и самой формы.( В верху из выпадающего списка, можно выбрать контрол, а чуть правее — событие и компиллятор автоматом добавит в модуль процедуру обработки события для данного контрола)
Вторая особенность (которая является ответом на твой второй вопрос) заключается в том, что все функции, процедуры, переменные, а также контролы формы доступны будут только в то время, когда форма — ЗАГРУЖЕНА. Если форма не загружена, ты не сможешь обратиться ни контролу на форме, ни к public переменной из модуля формы (а также функ. и процедуре)
Под словом загружена — я не имел ввиду, что форма должна быть видима. В VB есть различие между ЗАГРУЗИТЬ форму и ПОКАЗАТЬ форму.
Load UserForm1 — загрузить форму, при это форма будет висеть в памяти и к ней можно будет обращаться, но она будет НЕВИДИМА.
UserForm1.Show — показать форму.
Тонкость тут такая (которая часто путает новичков).
Если форма НЕЗАГРУЖЕНА, то строка UserForm1.Show приведет автоматом к ЗАГРУЗКЕ формы и ее ПОКАЗУ.
Если форма была предварительно ЗАГРУЖЕНА, то метод UserForm1.Show приведет соответственно только к ее показу.
Load UserForm1 удобно использовать для загрузки формы и установки нач. значений для контролов перед ее показом потом пользователю сразу во все красе. А то как-то не очень красиво выглядит, когда форма показывается, а потом на глазах у пользователя конторолы начинают быстренька заполняться новыми значениями
Кроме того, часто используют еще и такой трюк, когда заранее известно что пользователь с большое долей вероятности после первой формы откроет еще и вторую, то можно вторую форму загрузить заранее, пока пользователь наслаждается первой формой, а как только он запросит вторую форму, мы уже быстро показываем ему вторую форму, т.к. она уже была загружена но скрыта. Или наоборот делают, когда пользователь закрывают форму, ее программно просто скрывают — UserForm1.Hide и форма скрывается с глаз, НО продолжает висеть в памяти и очень быстро может быть вызвана повторно на экран.
Выгрузить форму программно можно так — Unload UserForm1
3. Модуль листа/книги представляет из себя по сути — модуль формы. Смысл такой же. Сам лист/книга имеют события на которые можно написать код и кроме того на сам лист (книги это не касается) можно разместить контрол(кнопку, поле и т.д.) обработчики которых будут доступны опять же в модуле листа.
P.S. на счет почитать про это — лучше все таки не ограничивать себя и почитать про все. Тем более что редко когда можно найти в книжках ответ ИМЕННО на твой вопрос. Да это обычно и не нужно, если человек понимает основы, все остальное всего лишь производное
Группа: Пользователи Ранг: Новичок Сообщений: 19
Замечаний: |
Доброго всем дня!
В Personal.xlsb имеется макрос для создания новой книги с одним листом, содержащим копию только данных исходного:
[vba]
Код
Sub Makros1 ()
Dim CurW As Window
Dim TempW As Window
Set CurW = ActiveWindow
Set TempW = ActiveWorkbook.NewWindow
CurW.SelectedSheets.Copy
TempW.Close
ActiveSheet.UsedRange = ActiveSheet.UsedRange.Value
End Sub
[/vba]
Как добавить в этот макрос следующий код, добавляющий расширенный фильтр с поиском по шаблону, который прописывался бы в модуль этого листа:
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range(Cells(1, 1), Cells(2, 1))) Is Nothing Then
On Error Resume Next
ActiveSheet.ShowAllData
Range(«A5»).CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range(«A1»).CurrentRegion
End If
Range(«A2»).Select
End Sub
[/vba]
Не знаю как создать модуль листа средствами VBA и прописать в него код автоматический.
Заранее благодарен за ответ.