In this Article
- Accessing the VBE Editor
- Recording a Macro
- Opening the VBE Editor directly from Excel
- The VBA Project
- Inserting a Module or Form into the VBA Project
- Adding a Reference to a VBA Project
- VBA Project Properties
- Renaming a Project
- Adding Project Security
This tutorial will explain what a VBA Project is and how to edit a VBA Project in Excel.
When we record a macro in Excel using the Macro Recorder, a VBA project file is created in the file that we are working in or in a file called the Personal Macro Workbook. The Project File stores any modules or forms that are created either by using the record macro function in Excel, or by writing the VBA code within a module directly. To view the VBA Project, we need to access the Visual Basic Editor (VBE).
Accessing the VBE Editor
There are 2 ways to access the VBE Editor in Excel. You can either record a macro and then edit the macro, or open the Editor directly from the Excel Developer Ribbon.
Recording a Macro
Excel gives us the ability to record macros, and then to edit the macros in the Visual Basic Editor (VBE) should we need to do so.
In the Ribbon, select View > Macros > Record Macro.
OR
Developer > Visual Basic > Record Macro
Note: If you don’t see the Developer Ribbon, you’ll need to enable it. You can learn how to do that here.
1) Type in the name for your macro, and then 2) select where to store the macro. This can be in the Personal Macro workbook, the workbook you are currently editing or a new workbook entirely.
Once you have clicked OK, you can follow the steps that you want in your macro (for example bolding a cell, changing the color of the text, etc.), and then click the stop button at the bottom of the screen to stop recording the macro.
To run or view your macro, in the Ribbon, select View > Macros > View Macros.
OR
Developer > Visual Basic >Macros
Click on the Macro in the Macro name list, and then click on Edit.
This will open the VBE and jump you into the VBA Code.
A VBA Project has now automatically been created for your workbook, and within this project, a module (Module 1) has also been created. The macro is contained within this new module on the right hand side.
Opening the VBE Editor directly from Excel
To open the VBE Editor from Excel directly, in the Ribbon, select Developer > Visual Basic.
The VBA Project
The VBA Project is where the modules and forms are stored when you write VBA code in Excel. As we recorded the above macro, a Module was automatically created for us within the VBA Project for the workbook we selected (in this case we selected This Workbook). Had we selected the Personal Macro Workbook to store the macro in, a module would have been created in the Perseonal.xlsb file.
NOTE: if you choose to save macros in the Personal Macro workbook, when you exit Excel you will get a prompt asking you to save this workbook. The Personal Macro workbook is a hidden workbook not visible in the Excel screen but visible in the VBE window.It is used to store modules and forms that can then be used across a multitude of Excel files. Modules and Forms that are stored in each individual workbook can only be used within that workbook.
If we had opened the VBE Editor directly from Excel without recording a macro, our workbook would have a blank VBA Project file that does not contain any modules or forms.
Each Excel file can only contain 1 VBA project, but can have multiple modules and forms. It is good practice when programming in VBA to group your procedures logically into relevant modules and often you will end up with a multitude of modules and forms.
In the Book1 VBA Project in the graphic above, we have 2 forms (frmInvoice and frmCustomers), 3 Modules (modCustomerRoutines, modGlobalVariables and modInvoiceRoutines) and 1 class module (clsCustomers).
Inserting a Module or Form into the VBA Project
To insert a new module into your code, click on the Insert option on the menu bar, and click Module.
Or, click on the Insert Module button which you will find on the standard ribbon.
To insert a new user form into your code, select the UserForm option.
A new UserForm will appear in the Project Explorer and will be shown in the Code Window on the right.
You can also insert a Class Module
A class module is used to insert objects into your VBA project.
Adding a Reference to a VBA Project
You VBA project can also contain references to other VBA projects, or to other applications such as Word or Access. To view the references that are referred to in your VBA Project, click on the Tools menu, and then click on References.
Should we need to add a new reference, we can select the object library in the References dialog box, or if the object library is not in the list, we can click the Browse button to find the relevant object library file on our PC.
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More
VBA Project Properties
Each VBA Project has a number of properties associated with it. These can be customized to suit your needs.
In the Menu, select Tools and then select VBAProject Properties.
Renaming a Project
In the General Tab, change the name of the project to something more relevant than VBAProject , and add a description to describe your project. If you click the OK button, you will notice that the name of the VBA Project will change to reflect the new project name in the VBE Project Explorer.
Adding Project Security
We can also password protect our VBA Project. This will prevent other users from being able to see any of your code and is most useful to protect intellectual property rights!
In the Protection tab, 1) make sure the check is on in the ‘Lock project for viewing’ and then 2) type in your password and confirm the password.
Now if you were to save your workbook, when you reopen the workbook and try to access the VBAProject, it will ask you for a password.
NOTE: when you save an Excel file that contains a VBA Project, it has to be saved as a macro enabled workbook (xlsm) to keep the VBA project. It cannot just be saved as an ordinary xlsx file.
Глава 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.
По умолчанию новые элементы добавляются в конец коллекции. Для изменения порядка добавления элементов используются параметры Добавить_перед и Добавить_после, с помощью которых указывается номер или ключ того элемента, перед которым или после которого нужно вставить новый элемент. Нумерация элементов в коллекции начинается с единицы.
Конец ознакомительного фрагмента.
Внешний вид редактора 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 (Свойства). В окне ТооШох (Панель инструментов) можно выбирать элементы управления, добавляемые в форму. После добавления любого элемента управленияс помощью двойнго щелчка кнопкой мыши на нем можно перейти к редактированию соответствующего кода в модуле формы.
Visual
Basic для приложений (VBA — Visual Basic for
Applications) — это инструмент разработки
приложений. VBA является приложением,
встраиваемым в другие приложения, причем
это не просто стандартный язык приложений
Office 97, но средство, позволяющее расширять
функциональные возможности этих
приложений.
Основные
возможности VBA: создание собственных
диалоговых окон; создание макросов;
изменение меню приложения; управление
другим приложением или принадлежащими
ему данными; объединение данных из
нескольких приложений в одном документе;
автоматическое создание или изменение
страницы Web — World Wide Web (WWW) распределенная
сетевая система, обеспечивающая
непосредственный доступ к приложениям
Internet; возможность использования VBA IDE в
приложениях, которые не входят в Microsoft
Office.
Основные
инструменты и средства VBA:
отладка
приложений без предварительной
компиляции;
средства
Win32 API — набор функций, позволяющих
обращаться ко всем функциям Windows,
управлять памятью, внешними устройствами,
обрабатывать события, рисовать на экране
диалоговые окна, поддерживать связь
одного приложения с другим;
SQL
и объекты доступа к данным для управления
ими и извлечения из внешних источников,
таких как Microsoft SQL Server 6.5 — сервер баз
данных SQL, обеспечивающий доступ к данным
в локальных и глобальных сетях и
работающий под управлением операционной
системы на базе Windows NT Server;
построение
и проверка элементов интерфейса
непосредственно в среде VBA IDE (Integradet
Development Environment) — это набор инструментов
разработки программного обеспечения
таких как редактор, средства отладки,
средства управления проектом и т.д.
При
решении задач с помощью VBA требуется
создать проект. Проекты VBA выполняются
совместно с другими приложениями.
Приложение, в котором разрабатывается
сам проект VBA, называется основным,
например это может быть Excel.
VBA
имеет собственную среду разработки —
интегрированную среду IDE. VBA IDE — это окно,
содержащее меню, другие окна и элементы.
Все приложения, поддерживающие VBA,
работают с одним IDE. После разработки
проекта VBA в IDE необходимо перейти в
нужное приложение.
VBA
является производным от Visual Basic (VB).
Назначение VBA — совместная работа с
прикладными программами, а с помощью
VB можно разрабатывать самостоятельные
приложения. В то же время синтаксис и
среда разработки VBA и VB во многом схожи.
Например, коды для перемножения двух
произвольных чисел:
1)
в VB
Private
Sub Command1_Click()
Text3.Text
= Val(Text1.text) * Val(Text2.Text)
End
Sub
2)
в
VBA
Private
Sub Worksheet_ Activate()
frmDemo.Show
End
Sub
Private
Sub bthMultiply_Click()
ActiveCell.Value
= Val(txtValue1.Text) * Val(txtValue2.Text)
End
Sub
Для
выполнения приложения VB достаточно
только разработать форму и разместить
в ней поля для задания значений
перемножаемых чисел, а также кнопку,
при нажатии который производится
умножение и выводится результат.
Проект
VBA необходимо связать с основным
приложением, в данном случае, с Excel,
следует создать форму, которая похожа
на форму для приложения VB, и написать
требуемые подпрограммы. Первая
подпрограмма — это процедура обработки
события, запускаемая при активизации
текущего рабочего листа; она отображает
форму frmDemo. Вторая подпрограмма также
является процедурой обработки события
и выполняется при нажатии кнопки
bthMultiply; она преобразовывает число в
текст, отображаемый в в текстовых полях,
перемножает числа и выводит результат
в активном рабочем листе.
Новая
версия Visual Basic — Visual Basic Script (VBScript) позволяет
строить небольшие приложения, встроенные
непосредственно в Web-страницу.
Программы
VBA не компилируются, а интерпретируются,
т.е. перевод команд в машинные коды
осуществляется в процессе выполнения
программы.
Синтаксис
VBA похож на синтаксис Visual Basic (VB), однако,
в VB больше возможностей по созданию
самостоятельных программ. Для выполнения
программ VB не требуется загрузки
основного приложения. В качестве
дополнения к VBA можно также использовать
язык С++, оформляя созданные на нем
средства в виде библиотек DLL, элементов
управления VBX и OCX. Для работы с VBA можно
использовать и другие компиляторы,
например, Fortran, Cobol и др.
Для
создания проекта VBA используется один
из следующих методов:
1)
автоматическая запись макроса, а затем
его редактирование); 2) создание макроса
или проекта в редакторе VBA.
В
окне проекта выводятся все элементы
проекта в виде иерархической структуры,
включающей формы, модули кода и объекты
основного приложения: рабочие листы,
шаблоны, документы, базы данных и т.д.
Окно проекта можно открыть (View-Project
Exploter), скрыть (Hide), закрепить (Dockable),
переместить или изменить его размеры.
Для
выбора и редактирования объекта,
выведенного в окне проекта надо дважды
щелкнуть по имени объекта, или щелкнуть
по нему правой кнопкой и выбрать команду
ОБЪЕКТ (View Object) или ПРОГРАММА (View Code).
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Время на прочтение
7 мин
Количество просмотров 312K
Приветствую всех.
В этом посте я расскажу, что такое VBA и как с ним работать в Microsoft Excel 2007/2010 (для более старых версий изменяется лишь интерфейс — код, скорее всего, будет таким же) для автоматизации различной рутины.
VBA (Visual Basic for Applications) — это упрощенная версия Visual Basic, встроенная в множество продуктов линейки Microsoft Office. Она позволяет писать программы прямо в файле конкретного документа. Вам не требуется устанавливать различные IDE — всё, включая отладчик, уже есть в Excel.
Еще при помощи Visual Studio Tools for Office можно писать макросы на C# и также встраивать их. Спасибо, FireStorm.
Сразу скажу — писать на других языках (C++/Delphi/PHP) также возможно, но требуется научится читать, изменять и писать файлы офиса — встраивать в документы не получится. А интерфейсы Microsoft работают через COM. Чтобы вы поняли весь ужас, вот Hello World с использованием COM.
Поэтому, увы, будем учить Visual Basic.
Чуть-чуть подготовки и постановка задачи
Итак, поехали. Открываем Excel.
Для начала давайте добавим в Ribbon панель «Разработчик». В ней находятся кнопки, текстовые поля и пр. элементы для конструирования форм.
Появилась вкладка.
Теперь давайте подумаем, на каком примере мы будем изучать VBA. Недавно мне потребовалось красиво оформить прайс-лист, выглядевший, как таблица. Идём в гугл, набираем «прайс-лист» и качаем любой, который оформлен примерно так (не сочтите за рекламу, пожалуйста):
То есть требуется, чтобы было как минимум две группы, по которым можно объединить товары (в нашем случае это будут Тип и Производитель — в таком порядке). Для того, чтобы предложенный мною алгоритм работал корректно, отсортируйте товары так, чтобы товары из одной группы стояли подряд (сначала по Типу, потом по Производителю).
Результат, которого хотим добиться, выглядит примерно так:
Разумеется, если смотреть прайс только на компьютере, то можно добавить фильтры и будет гораздо удобнее искать нужный товар. Однако мы хотим научится кодить и задача вполне подходящая, не так ли?
Кодим
Для начала требуется создать кнопку, при нажатии на которую будет вызываться наша програма. Кнопки находятся в панели «Разработчик» и появляются по кнопке «Вставить». Вам нужен компонент формы «Кнопка». Нажали, поставили на любое место в листе. Далее, если не появилось окно назначения макроса, надо нажать правой кнопкой и выбрать пункт «Назначить макрос». Назовём его FormatPrice. Важно, чтобы перед именем макроса ничего не было — иначе он создастся в отдельном модуле, а не в пространстве имен книги. В этому случае вам будет недоступно быстрое обращение к выделенному листу. Нажимаем кнопку «Новый».
И вот мы в среде разработки VB. Также её можно вызвать из контекстного меню командой «Исходный текст»/«View code».
Перед вами окно с заглушкой процедуры. Можете его развернуть. Код должен выглядеть примерно так:
Sub FormatPrice()End Sub
Напишем Hello World:
Sub FormatPrice()
MsgBox "Hello World!"
End Sub
И запустим либо щелкнув по кнопке (предварительно сняв с неё выделение), либо клавишей F5 прямо из редактора.
Тут, пожалуй, следует отвлечься на небольшой ликбез по поводу синтаксиса VB. Кто его знает — может смело пропустить этот раздел до конца. Основное отличие Visual Basic от Pascal/C/Java в том, что команды разделяются не ;, а переносом строки или двоеточием (:), если очень хочется написать несколько команд в одну строку. Чтобы понять основные правила синтаксиса, приведу абстрактный код.
Примеры синтаксиса
' Процедура. Ничего не возвращает
' Перегрузка в VBA отсутствует
Sub foo(a As String, b As String)
' Exit Sub ' Это значит "выйти из процедуры"
MsgBox a + ";" + b
End Sub' Функция. Вовращает Integer
Function LengthSqr(x As Integer, y As Integer) As Integer
' Exit Function
LengthSqr = x * x + y * y
End FunctionSub FormatPrice()
Dim s1 As String, s2 As String
s1 = "str1"
s2 = "str2"
If s1 <> s2 Then
foo "123", "456" ' Скобки при вызове процедур запрещены
End IfDim res As sTRING ' Регистр в VB не важен. Впрочем, редактор Вас поправит
Dim i As Integer
' Цикл всегда состоит из нескольких строк
For i = 1 To 10
res = res + CStr(i) ' Конвертация чего угодно в String
If i = 5 Then Exit For
Next iDim x As Double
x = Val("1.234") ' Парсинг чисел
x = x + 10
MsgBox xOn Error Resume Next ' Обработка ошибок - игнорировать все ошибки
x = 5 / 0
MsgBox xOn Error GoTo Err ' При ошибке перейти к метке Err
x = 5 / 0
MsgBox "OK!"
GoTo ne
Err:
MsgBox
"Err!"
ne:
On Error GoTo 0 ' Отключаем обработку ошибок
' Циклы бывает, какие захотите
Do While True
Exit DoLoop 'While True
Do 'Until False
Exit Do
Loop Until False
' А вот при вызове функций, от которых хотим получить значение, скобки нужны.
' Val также умеет возвращать Integer
Select Case LengthSqr(Len("abc"), Val("4"))
Case 24
MsgBox "0"
Case 25
MsgBox "1"
Case 26
MsgBox "2"
End Select' Двухмерный массив.
' Можно также менять размеры командой ReDim (Preserve) - см. google
Dim arr(1 to 10, 5 to 6) As Integer
arr(1, 6) = 8Dim coll As New Collection
Dim coll2 As Collection
coll.Add "item", "key"
Set coll2 = coll ' Все присваивания объектов должны производится командой Set
MsgBox coll2("key")
Set coll2 = New Collection
MsgBox coll2.Count
End Sub
Грабли-1. При копировании кода из IDE (в английском Excel) есь текст конвертируется в 1252 Latin-1. Поэтому, если хотите сохранить русские комментарии — надо сохранить крокозябры как Latin-1, а потом открыть в 1251.
Грабли-2. Т.к. VB позволяет использовать необъявленные переменные, я всегда в начале кода (перед всеми процедурами) ставлю строчку Option Explicit. Эта директива запрещает интерпретатору заводить переменные самостоятельно.
Грабли-3. Глобальные переменные можно объявлять только до первой функции/процедуры. Локальные — в любом месте процедуры/функции.
Еще немного дополнительных функций, которые могут пригодится: InPos, Mid, Trim, LBound, UBound. Также ответы на все вопросы по поводу работы функций/их параметров можно получить в MSDN.
Надеюсь, что этого Вам хватит, чтобы не пугаться кода и самостоятельно написать какое-нибудь домашнее задание по информатике. По ходу поста я буду ненавязчиво знакомить Вас с новыми конструкциями.
Кодим много и под Excel
В этой части мы уже начнём кодить нечто, что умеет работать с нашими листами в Excel. Для начала создадим отдельный лист с именем result (лист с данными назовём data). Теперь, наверное, нужно этот лист очистить от того, что на нём есть. Также мы «выделим» лист с данными, чтобы каждый раз не писать длинное обращение к массиву с листами.
Sub FormatPrice()
Sheets("result").Cells.Clear
Sheets("data").Activate
End Sub
Работа с диапазонами ячеек
Вся работа в Excel VBA производится с диапазонами ячеек. Они создаются функцией Range и возвращают объект типа Range. У него есть всё необходимое для работы с данными и/или оформлением. Кстати сказать, свойство Cells листа — это тоже Range.
Примеры работы с Range
Sheets("result").Activate
Dim r As Range
Set r = Range("A1")
r.Value = "123"
Set r = Range("A3,A5")
r.Font.Color = vbRed
r.Value = "456"
Set r = Range("A6:A7")
r.Value = "=A1+A3"
Теперь давайте поймем алгоритм работы нашего кода. Итак, у каждой строчки листа data, начиная со второй, есть некоторые данные, которые нас не интересуют (ID, название и цена) и есть две вложенные группы, к которым она принадлежит (тип и производитель). Более того, эти строки отсортированы. Пока мы забудем про пропуски перед началом новой группы — так будет проще. Я предлагаю такой алгоритм:
- Считали группы из очередной строки.
- Пробегаемся по всем группам в порядке приоритета (вначале более крупные)
- Если текущая группа не совпадает, вызываем процедуру AddGroup(i, name), где i — номер группы (от номера текущей до максимума), name — её имя. Несколько вызовов необходимы, чтобы создать не только наш заголовок, но и всё более мелкие.
- После отрисовки всех необходимых заголовков делаем еще одну строку и заполняем её данными.
Для упрощения работы рекомендую определить следующие функции-сокращения:
Function GetCol(Col As Integer) As String
GetCol = Chr(Asc("A") + Col)
End FunctionFunction GetCellS(Sheet As String, Col As Integer, Row As Integer) As Range
Set GetCellS = Sheets(Sheet).Range(GetCol(Col) + CStr(Row))
End FunctionFunction GetCell(Col As Integer, Row As Integer) As Range
Set GetCell = Range(GetCol(Col) + CStr(Row))
End Function
Далее определим глобальную переменную «текущая строчка»: Dim CurRow As Integer. В начале процедуры её следует сделать равной единице. Еще нам потребуется переменная-«текущая строка в data», массив с именами групп текущей предыдущей строк. Потом можно написать цикл «пока первая ячейка в строке непуста».
Глобальные переменные
Option Explicit ' про эту строчку я уже рассказывал
Dim CurRow As Integer
Const GroupsCount As Integer = 2
Const DataCount As Integer = 3
FormatPrice
Sub FormatPrice()
Dim I As Integer ' строка в data
CurRow = 1
Dim Groups(1 To GroupsCount) As String
Dim PrGroups(1 To GroupsCount) As String
Sheets(
"data").Activate
I = 2
Do While True
If GetCell(0, I).Value = "" Then Exit Do
' ...
I = I + 1
Loop
End Sub
Теперь надо заполнить массив Groups:
На месте многоточия
Dim I2 As Integer
For I2 = 1 To GroupsCount
Groups(I2) = GetCell(I2, I)
Next I2
' ...
For I2 = 1 To GroupsCount ' VB не умеет копировать массивы
PrGroups(I2) = Groups(I2)
Next I2
I = I + 1
И создать заголовки:
На месте многоточия в предыдущем куске
For I2 = 1 To GroupsCount
If Groups(I2) <> PrGroups(I2) Then
Dim I3 As Integer
For I3 = I2 To GroupsCount
AddHeader I3, Groups(I3)
Next I3
Exit For
End If
Next I2
Не забудем про процедуру AddHeader:
Перед FormatPrice
Sub AddHeader(Ty As Integer, Name As String)
GetCellS("result", 1, CurRow).Value = Name
CurRow = CurRow + 1
End Sub
Теперь надо перенести всякую информацию в result
For I2 = 0 To DataCount - 1
GetCellS("result", I2, CurRow).Value = GetCell(I2, I)
Next I2
Подогнать столбцы по ширине и выбрать лист result для показа результата
После цикла в конце FormatPrice
Sheets("Result").Activate
Columns.AutoFit
Всё. Можно любоваться первой версией.
Некрасиво, но похоже. Давайте разбираться с форматированием. Сначала изменим процедуру AddHeader:
Sub AddHeader(Ty As Integer, Name As String)
Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow)).Merge
' Чтобы не заводить переменную и не писать каждый раз длинный вызов
' можно воспользоваться блоком With
With GetCellS("result", 0, CurRow)
.Value = Name
.Font.Italic = True
.Font.Name = "Cambria"
Select Case Ty
Case 1 ' Тип
.Font.Bold = True
.Font.Size = 16
Case 2 ' Производитель
.Font.Size = 12
End Select
.HorizontalAlignment = xlCenter
End With
CurRow = CurRow + 1
End Sub
Уже лучше:
Осталось только сделать границы. Тут уже нам требуется работать со всеми объединёнными ячейками, иначе бордюр будет только у одной:
Поэтому чуть-чуть меняем код с добавлением стиля границ:
Sub AddHeader(Ty As Integer, Name As String)
With Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow))
.Merge
.Value = Name
.Font.Italic = True
.Font.Name = "Cambria"
.HorizontalAlignment = xlCenterSelect Case Ty
Case 1 ' Тип
.Font.Bold = True
.Font.Size = 16
.Borders(xlTop).Weight = xlThick
Case 2 ' Производитель
.Font.Size = 12
.Borders(xlTop).Weight = xlMedium
End Select
.Borders(xlBottom).Weight = xlMedium ' По убыванию: xlThick, xlMedium, xlThin, xlHairline
End With
CurRow = CurRow + 1
End Sub
Осталось лишь добится пропусков перед началом новой группы. Это легко:
В начале FormatPrice
Dim I As Integer ' строка в data
CurRow = 0 ' чтобы не было пропуска в самом начале
Dim Groups(1 To GroupsCount) As String
В цикле расстановки заголовков
If Groups(I2) <> PrGroups(I2) Then
CurRow = CurRow + 1
Dim I3 As Integer
В точности то, что и хотели.
Надеюсь, что эта статья помогла вам немного освоится с программированием для Excel на VBA. Домашнее задание — добавить заголовки «ID, Название, Цена» в результат. Подсказка: CurRow = 0 CurRow = 1.
Файл можно скачать тут (min.us) или тут (Dropbox). Не забудьте разрешить исполнение макросов. Если кто-нибудь подскажет человеческих файлохостинг, залью туда.
Спасибо за внимание.
Буду рад конструктивной критике в комментариях.
UPD: Перезалил пример на Dropbox и min.us.
UPD2: На самом деле, при вызове процедуры с одним параметром скобки можно поставить. Либо использовать конструкцию Call Foo(«bar», 1, 2, 3) — тут скобки нужны постоянно.
��������� ������� 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 (��������). � ���� ������ (������ ������������) ����� �������� �������� ����������, ����������� � �����. ����� ���������� ������ �������� ����������� ������� ������� ������ ������� ���� �� ��� ����� ������� � �������������� ���������������� ���� � ������ �����.