Vba excel конструктор класса

Обновлено: 11.05.2024

Экземпляр класса, объект, создается с помощью ключевого слова New . Задачи инициализации зачастую необходимо выполнять на новых объектах до их использования. К распространенным задачам инициализации относится открытие файлов, подключение к базам данных и чтение значений параметров реестра. Visual Basic управляет инициализацией новых объектов с помощью процедур, называемых конструкторами (специальные методы, позволяющие контролировать инициализацию).

Когда объект выходит из области, он высвобождается средой CLR. Visual Basic управляет выпуском системных ресурсов с помощью процедур, называемых деструкторами. Вместе конструкторы и деструкторы поддерживают создание надежных и предсказуемых библиотек класса.

Использование конструкторов и деструкторов

Конструкторы и деструкторы управляют созданием и уничтожением объектов. Процедуры Sub New в Visual Basic инициализации Sub Finalize и уничтожения объектов; они заменяют Class_Initialize методы, Class_Terminate используемые в Visual Basic 6.0 и более ранних версиях.

Конструктор Sub New

Конструктор Sub New может быть запущен только один раз при создании класса. Его нельзя вызвать явным образом нигде, кроме первой строки кода другого конструктора этого же класса или производного класса. Более того, код метода Sub New всегда выполняется до любого другого кода в классе. Visual Basic неявно создает Sub New конструктор во время выполнения, если явно не определена Sub New процедура для класса.

Чтобы создать конструктор класса, создайте процедуру с именем Sub New в любом месте определения класса. Чтобы создать конструктор с параметрами, укажите имена и типы данных аргументов в Sub New точно так же, как для любой процедуры. См. следующий код:

Конструкторы часто перегружены, как в следующем коде:

При вызове класса, производного от другого класса, первая строка конструктора должна представлять собой вызов конструктора базового класса (кроме случаев, когда в базовом классе есть доступный конструктор, не принимающий параметры). Вызов базового класса, содержащего указанный выше конструктор, может быть, к примеру, таким MyBase.New(s) . MyBase.New В противном случае является необязательным, а среда выполнения Visual Basic вызывает ее неявно.

После написания кода для вызова конструктора родительского объекта можно добавить дополнительный код инициализации к процедуре Sub New . Sub New может принимать аргументы при вызове в качестве конструктора с параметрами. Эти параметры передаются из процедуры, вызывающей конструктор, например, Dim AnObject As New ThisClass(X) .

Sub Finalize

Перед высвобождением объектов среда CLR автоматически вызывает метод Finalize для объектов, определяющих процедуру Sub Finalize . Метод Finalize может содержать код, который необходимо выполнить непосредственно перед уничтожением объекта, например, код для закрытия файлов и сохранения информации о состоянии. Существует небольшой спад производительности при выполнении Sub Finalize , поэтому метод Sub Finalize нужно определять только в тех случаях, когда требуется явное высвобождение объектов.

Сборщик мусора в среде CLR не удаляет неуправляемые объекты, которые операционная система выполняет напрямую за пределами среды CLR. Причина состоит в том, что разные неуправляемые объекты следует уничтожать по-разному. Эта информация не связана напрямую с неуправляемым объектом, ее необходимо найти в документации по объектам. Класс, использующий неуправляемые объекты, должен удалить их в своем методе Finalize .

Деструктор Finalize является защищенным методом, который можно вызвать только из класса, к которому он принадлежит, или из производного класса. Система автоматически вызывает Finalize при уничтожении объекта, поэтому не следует явным образом вызывать Finalize извне реализации Finalize производного класса.

Деструктор Finalize не должен создавать исключений, поскольку они не обрабатываются приложением и могут привести к завершению работы приложения.

Как методы New и Finalize работают в иерархии классов

При каждом создании экземпляра класса среда CLR пытается выполнить процедуру New , если она существует в этом объекте. New — тип процедуры, которая называется constructor и используется для инициализации новых объектов до выполнения всего остального кода в объекте. Конструктор New можно использовать для открытия файлов, подключения к базам данных, инициализации переменных и для других задач, которые необходимо выполнить перед использованием объекта.

Когда создается экземпляр производного класса, конструктор Sub New базового класса выполняется в первую очередь, а затем — конструкторы в производных классах. Это происходит, поскольку первая строка кода в конструкторе Sub New использует синтаксис MyBase.New() для вызова конструктора класса на один уровень выше себя в иерархии классов. Затем конструктор Sub New вызывается для каждого класса в иерархии вплоть до достижения базового класса. На этом этапе выполняется код в конструкторе базового класса, а затем выполняется код в каждом конструкторе всех производных классов; код в производном классе самого дальнего уровня выполняется последним.

Когда объект больше не нужен, среда CLR вызывает метод Finalize для этого объекта перед высвобождением памяти. Метод Finalize называется destructor , поскольку он выполняет задачи очистки, такие как сохранение информации о состоянии, закрытие файлов и подключений к базам данных, а также прочие задачи, которые необходимо выполнить перед высвобождением объекта.

Интерфейс IDisposable

Экземпляры классов зачастую управляют ресурсами, которыми не управляет среда CLR, такими как дескрипторы Windows и подключения к базам данных. От этих ресурсов нужно избавляться в методе Finalize класса, поэтому они будут высвобождаться при уничтожении объекта сборщиком мусора. Тем не менее, сборщик мусора уничтожает объекты только в тех случаях, когда среде CLR нужно больше свободной памяти. Это означает, что ресурсы могут быть не высвобождены еще в течение долгого времени после того, как объект выйдет из области.

Чтобы дополнить сборку мусора, ваши классы могут предоставлять механизм активного управления системными ресурсами путем реализации интерфейса IDisposable. В IDisposable существует метод Dispose, который клиенты должны вызывать по завершении использования какого-либо объекта. Можно использовать метод Dispose для немедленного высвобождения ресурсов и выполнения таких задач как закрытие файлов и подключений к базам данных. В отличие от деструктора Finalize , метод Dispose не вызывается автоматически. Клиенты класса должны явным образом вызвать Dispose, когда нужно немедленно высвободить ресурсы.

Использование IDisposable

Класс, реализующий интерфейс IDisposable, должен включать следующие разделы кода:

Поле, чтобы отслеживать, уничтожен ли объект:

Перегрузка Dispose для высвобождения ресурсов класса. Этот метод должен вызываться методами Dispose и Finalize базового класса:

Реализация Dispose, содержащая только следующий код:

Переопределение метода Finalize , содержащее только следующий код:

Производное создание от класса, реализующего IDisposable

Классу, производному от базового класса, реализующего интерфейс IDisposable, нет необходимости переопределять какие-либо базовые методы, если только производный класс не использует дополнительные ресурсы, которые следует высвобождать. В этом случае производный класс должен переопределять метод Dispose(disposing) базового класса, чтобы удалить ресурсы производного класса. Это переопределение должно вызвать метод Dispose(disposing) базового класса.

Производный класс не должен переопределять методы Dispose и Finalize базового класса. Когда эти методы вызываются из экземпляра производного класса, реализация этих методов в базовом классе вызывает переопределение метода Dispose(disposing) производного класса.

Сбор мусора и деструктор Finalize

CLR периодически уничтожает объекты, если система определяет, что эти объекты больше не нужны. Объекты высвобождаются быстрее при нехватке системных ресурсов и медленнее в других случаях. Задержка между потерей объектом области и высвобождением объекта средой CLR означает, что в отличие от объектов в Visual Basic 6.0 и более ранних версиях, невозможно точно определить, когда объект будет уничтожен. В такой ситуации объекты, как говорят, имеют недетерминированное время существования. В большинстве случаев неопределенное время жизни не влияет на написание приложений, если помнить о том, что деструктор Finalize может быть выполнен не сразу после потери объектом области.

Еще одно отличие от систем сборки мусора заключается в использовании Nothing . Чтобы воспользоваться подсчетом ссылок в Visual Basic 6.0 и более ранних версиях, программисты часто назначали Nothing переменным объектов, чтобы высвобождать ссылки, удерживаемые этими переменными. Если переменная содержала последнюю ссылку на объект, ресурсы объекта были немедленно высвобождены. В более поздних версиях Visual Basic, хотя по-прежнему могут быть случаи, когда эта процедура еще применима, ее выполнение больше не приводит к немедленному высвобождению ресурсов объектом. Чтобы немедленно высвободить ресурсы, используйте метод объекта Dispose, если он доступен. Для переменной следует устанавливать значение Nothing лишь в тех случаях, когда ее время жизни достаточно велико по отношению ко времени, за которое сборщик мусора обнаруживает потерянные объекты.

Visual Basic обеспечивает полную поддержку объектно-ориентированного программирования, включая инкапсуляцию, наследование и полиморфизм.

Инкапсуляция означает, что группа связанных свойств, методов и других членов рассматривается как единый элемент или объект.

Наследование описывает возможность создания новых классов на основе существующих классов.

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

В этом разделе рассматриваются следующие понятия.

Классы и объекты

Термины класс и объект часто взаимозаменяемы, но в действительности классы описывают типы объектов, а объекты — это используемые экземпляры классов. Поэтому процесс создания объекта называется созданием экземпляра. Если использовать сравнение с чертежом, то класс является чертежом, а объект является зданием, построенным по нему.

Visual Basic также предоставляет облегчаемую версию классов, называемых структурами, которые полезны при создании большого массива объектов и не хотят использовать слишком много памяти для этого.

Дополнительные сведения см. в разделе:

Члены класса

Каждый класс может состоять из различных членов класса, которые содержат свойства, описывающие данные класса, методы, задающие поведение класса, и события, обеспечивающие связь между различными классами и объектами.

Свойства и поля

Поля и свойства представляют сведения, содержащиеся в объекте. Поля подобны переменным в том, что их можно прочитать или изменить напрямую.

Для работы со свойствами используются процедуры "Get" и "Set", которые расширяют возможности управления способом задания и возврата значений.

Visual Basic позволяет создать частное поле для хранения значения свойства или использовать так называемые автоматически реализуемые свойства, которые автоматически создают это поле и предоставляют базовую логику для процедур свойств.

Определение автоматически реализуемого свойства:

Если требуется выполнить дополнительные операции чтения и записи применительно к значению свойства, определите поле для хранения значения свойства и затем реализуйте базовую логику для хранения и извлечения этого значения:

У большинства свойств есть методы или процедуры для задания и возврата значения свойства. Однако можно создать свойства, доступные только для чтения или только на запись, чтобы запретить изменение или чтение значений свойств. Для этого в Visual Basic можно использовать ключевые слова ReadOnly и WriteOnly . Следует отметить, что автоматически реализуемые свойства нельзя сделать доступными только для чтения или только для записи.

Дополнительные сведения см. в разделе:

Методы

Действие, которое выполняет объект, называется методом.

В Visual Basic существует два способа создания метода: с помощью оператора Sub (если метод не возвращает значение) или с помощью оператора Function (если метод возвращает значение).

Определение метода класса:

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

Как правило, метод объявляется при определении класса. Однако Visual Basic также поддерживает методы расширения, позволяющие добавлять методы в существующий класс вне фактического определения класса.

Дополнительные сведения см. в разделе:

Конструкторы

Конструкторы — это методы классов, выполняемые автоматически при создании объекта заданного типа. Обычно конструкторы выполняют инициализацию членов данных нового объекта. Конструктор можно запустить только один раз при создании класса. Кроме того, код конструктора всегда выполняется раньше всех остальных частей кода в классе. Следует отметить, что так же, как и для других методов, можно создать несколько перегрузок конструктора.

Определение конструктора для класса:

Деструкторы

События

События позволяют классу или объекту уведомлять другие классы или объекты о возникновении каких-либо ситуаций. Класс, отправляющий (или порождающий) событие, называется издателем, а классы, принимающие (или обрабатывающие) событие, называются подписчиками. Дополнительные сведения о том, как порождаются и обрабатываются события, см. в разделе События.

Чтобы объявить события, используйте оператор Event.

Чтобы вызвать события, используйте оператор RaiseEvent.

Чтобы указать обработчики событий с помощью декларативного способа, используйте инструкцию WithEvents и предложение Handles .

Чтобы динамически добавлять, удалять и изменять обработчик событий, связанный с событием, используйте оператор AddHandler и RemoveHandler вместе с оператором AddressOf.

Вложенные классы

Класс, определенный внутри другого класса, называется вложенным. По умолчанию вложенный класс является частным.

Чтобы создать экземпляр вложенного класса, укажите имя класса контейнера и имя вложенного класса, используя в качестве разделителя точку:

Модификаторы доступа и уровни доступа

С помощью модификаторов доступа все классы и члены классов могут указывать уровни доступа, предоставляемые другим классам.

Имеющиеся модификаторы доступа указаны в следующей таблице.

Модификатор Visual Basic Определение
Public Доступ к типу или члену возможен из любого другого кода в той же сборке или другой сборке, ссылающейся на него.
Частная Доступ к типу или члену можно получить только из кода в том же классе.
Защищены Доступ к типу или члену можно получить только из кода в том же классе или в производном классе.
Друг Доступ к типу или члену возможен из любого кода в той же сборке, но не из другой сборки.
Protected Friend Доступ к типу или члену возможен из любого кода в той же сборке, или из производного класса в другой сборке.

Создание экземпляров классов

Чтобы создать объект, необходимо создать экземпляр класса.

После создания экземпляра класса можно присваивать значения свойствам и полям экземпляра и вызывать методы класса.

Чтобы назначить значения свойствам в процессе создания экземпляра класса, используйте инициализаторы объектов:

Дополнительные сведения можно найти в разделе

Общие классы и члены

Общий член класса — это свойство, процедура или поле, совместно используемое всеми экземплярами класса.

Чтобы определить общий член, выполните следующие действия.

Чтобы получить доступ к общему члену, используйте имя класса без создания объекта этого класса:

Общие модули в Visual Basic имеют только общие члены и не могут быть созданы. Общие члены также не могут получить доступ к не общим свойствам, полям или методам

Дополнительные сведения см. в разделе:

Анонимные типы

Анонимные типы позволяют создавать объекты без написания определения класса для типа данных. Вместо этого компилятор создает класс для вас. Данный класс не имеет имени и содержит свойства, которые указаны при объявлении объекта.

Создание экземпляра анонимного типа:

Дополнительные сведения можно найти в разделе Анонимные типы.

Наследование

Visual Basic не поддерживает множественное наследование. То есть можно указать только один базовый класс для производного класса.

Наследование от базового класса:

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

Указание, что класс не может использоваться в качестве базового класса:

Указание, что класс может использоваться только в качестве базового класса и нельзя создать экземпляр этого класса:

Дополнительные сведения можно найти в разделе

Переопределение элементов

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

Следующие модификаторы используются для управления переопределением свойств и методов.

Модификатор Visual Basic Определение
Overridable Разрешает переопределение члена класса в производном классе.
Переопределения Переопределяет виртуальный (переопределяемый) член в базовом классе.
NotOverridable Запрещает переопределение члена в наследующем классе.
MustOverride Требует, чтобы член класса был переопределен в производном классе.
Тени Скрывает член, наследуемый от базового класса

Интерфейсы

Интерфейсы, как и классы, определяют набор свойств, методов и событий. Но, в отличие от классов, интерфейсы не предоставляют реализацию. Они реализуются классами, но определяются как отдельные от классов сущности. Интерфейс представляет собой контракт, в котором класс, реализующий интерфейс, должен реализовывать каждый аспект этого интерфейса в точном соответствии с его определением.

Реализация интерфейса в классе:

Дополнительные сведения см. в разделе:

Универсальные шаблоны

Определение универсального класса:

Создание экземпляра универсального класса:

Дополнительные сведения можно найти в разделе

Делегаты

Делегат — это тип, который определяет сигнатуру метода и может обеспечивать связь с любым методом с совместимой сигнатурой. Метод можно запустить (или вызвать) с помощью делегата. Делегаты используются для передачи методов в качестве аргументов к другим методам.

Обработчики событий — это ничто иное, как методы, вызываемые с помощью делегатов. Дополнительные сведения об использовании делегатов при обработке событий см. в разделе События.

Создание ссылки на метод, сигнатура которого соответствует сигнатуре, указанной делегатом:

В этом пошаговом руководстве показано, как определить классы, которые затем можно использовать для создания объектов. Здесь также показано, как добавить свойства и методы в новый класс, а также как инициализировать объект.

Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Персонализация среды IDE.

Определение класса

Создайте проект, щелкнув "Создать Project" в меню "Файл". Откроется диалоговое окно Создание проекта .

Выберите Windows приложение из списка шаблонов проектов Visual Basic, чтобы отобразить новый проект.

Добавьте новый класс в проект, нажав кнопку "Добавить класс" в меню Project. Откроется диалоговое окно Добавление нового элемента.

Выберите шаблон класса .

Присвойте новому классу UserNameInfo.vb имя и нажмите кнопку "Добавить ", чтобы отобразить код для нового класса.

Редактор кода Visual Basic можно использовать для добавления класса в форму запуска, введя ключевое Class слово, за которым следует имя нового класса. Редактор кода предоставляет для вас соответствующую End Class инструкцию.

Определите частное поле для класса, добавив следующий код между Class операторами и End Class операторами:

Объявление поля как Private означает, что его можно использовать только в классе. Поля можно сделать доступными из-за пределов класса с помощью модификаторов доступа, таких как Public предоставление большего доступа. Дополнительные сведения см. в разделе "Уровни доступа" в Visual Basic.

Определите свойство для класса, добавив следующий код:

Определите метод для класса, добавив следующий код:

Определите параметризованный конструктор для нового класса, добавив процедуру с именем Sub New :

Sub New Конструктор вызывается автоматически при создании объекта на основе этого класса. Этот конструктор задает значение поля, которое содержит имя пользователя.

Создание кнопки для тестирования класса

Измените форму запуска на режим конструктора, щелкнув правой кнопкой мыши его имя в Обозреватель решений и выбрав конструктор представлений. По умолчанию форма запуска для проектов приложений Windows называется Form1.vb. Затем появится основная форма.

Добавьте кнопку в основную форму и дважды щелкните ее, чтобы отобразить код обработчика Button1_Click событий. Добавьте следующий код для вызова процедуры тестирования:

Запуск приложения

Всем нам приходится - кому реже, кому чаще - повторять одни и те же действия и операции в Excel. Любая офисная работа предполагает некую "рутинную составляющую" - одни и те же еженедельные отчеты, одни и те же действия по обработке поступивших данных, заполнение однообразных таблиц или бланков и т.д. Использование макросов и пользовательских функций позволяет автоматизировать эти операции, перекладывая монотонную однообразную работу на плечи Excel. Другим поводом для использования макросов в вашей работе может стать необходимость добавить в Microsoft Excel недостающие, но нужные вам функции. Например функцию сборки данных с разных листов на один итоговый лист, разнесения данных обратно, вывод суммы прописью и т.д.

Макрос - это запрограммированная последовательность действий (программа, процедура), записанная на языке программирования Visual Basic for Applications (VBA). Мы можем запускать макрос сколько угодно раз, заставляя Excel выполнять последовательность любых нужных нам действий, которые нам не хочется выполнять вручную.

Способ 1. Создание макросов в редакторе Visual Basic

Для ввода команд и формирования программы, т.е. создания макроса необходимо открыть специальное окно - редактор программ на VBA, встроенный в Microsoft Excel.

macro1.jpg

  • В старых версиях (Excel 2003 и старше) для этого идем в меню Сервис - Макрос - Редактор Visual Basic(Toos - Macro - Visual Basic Editor).
  • В новых версиях (Excel 2007 и новее) для этого нужно сначала отобразить вкладку Разработчик (Developer) . Выбираем Файл - Параметры - Настройка ленты (File - Options - Customize Ribbon) и включаем в правой части окна флажок Разработчик (Developer) . Теперь на появившейся вкладке нам будут доступны основные инструменты для работы с макросами, в том числе и нужная нам кнопка Редактор Visual Basic(Visual Basic Editor)

    :

К сожалению, интерфейс редактора VBA и файлы справки не переводятся компанией Microsoft на русский язык, поэтому с английскими командами в меню и окнах придется смириться:

macro2.jpg

Макросы (т.е. наборы команд на языке VBA) хранятся в программных модулях. В любой книге Excel мы можем создать любое количество программных модулей и разместить там наши макросы. Один модуль может содержать любое количество макросов. Доступ ко всем модулям осуществляется с помощью окна Project Explorer в левом верхнем углу редактора (если его не видно, нажмите CTRL+R). Программные модули бывают нескольких типов для разных ситуаций:

    Обычные модули - используются в большинстве случаев, когда речь идет о макросах. Для создания такого модуля выберите в меню Insert - Module. В появившееся окно нового пустого модуля можно вводить команды на VBA, набирая их с клавиатуры или копируя их из другого модуля, с этого сайта или еще откуда нибудь:

macro3.jpg

macro4.jpg

macro5.jpg

Обычный макрос, введенный в стандартный модуль выглядит примерно так:

macro6.jpg

Давайте разберем приведенный выше в качестве примера макрос Zamena:

С ходу ясно, что вот так сразу, без предварительной подготовки и опыта в программировании вообще и на VBA в частности, сложновато будет сообразить какие именно команды и как надо вводить, чтобы макрос автоматически выполнял все действия, которые, например, Вы делаете для создания еженедельного отчета для руководства компании. Поэтому мы переходим ко второму способу создания макросов, а именно.

Способ 2. Запись макросов макрорекордером

Макрорекордер - это небольшая программа, встроенная в Excel, которая переводит любое действие пользователя на язык программирования VBA и записывает получившуюся команду в программный модуль. Если мы включим макрорекордер на запись, а затем начнем создавать свой еженедельный отчет, то макрорекордер начнет записывать команды вслед за каждым нашим действием и, в итоге, мы получим макрос создающий отчет как если бы он был написан программистом. Такой способ создания макросов не требует знаний пользователя о программировании и VBA и позволяет пользоваться макросами как неким аналогом видеозаписи: включил запись, выполнил операци, перемотал пленку и запустил выполнение тех же действий еще раз. Естественно у такого способа есть свои плюсы и минусы:

  • Макрорекордер записывает только те действия, которые выполняются в пределах окна Microsoft Excel. Как только вы закрываете Excel или переключаетесь в другую программу - запись останавливается.
  • Макрорекордер может записать только те действия, для которых есть команды меню или кнопки в Excel. Программист же может написать макрос, который делает то, что Excel никогда не умел (сортировку по цвету, например или что-то подобное).
  • Если во время записи макроса макрорекордером вы ошиблись - ошибка будет записана. Однако смело можете давить на кнопку отмены последнего действия (Undo) - во время записи макроса макрорекордером она не просто возрвращает Вас в предыдущее состояние, но и стирает последнюю записанную команду на VBA.

Чтобы включить запись необходимо:

  • в Excel 2003 и старше - выбрать в меню Сервис - Макрос - Начать запись(Tools - Macro - Record New Macro)
  • в Excel 2007 и новее - нажать кнопку Запись макроса (Record macro) на вкладке Разработчик (Developer)

Затем необходимо настроить параметры записываемого макроса в окне Запись макроса:

macro7.jpg

  • Имя макроса - подойдет любое имя на русском или английском языке. Имя должно начинаться с буквы и не содержать пробелов и знаков препинания.
  • Сочетание клавиш - будет потом использоваться для быстрого запуска макроса. Если забудете сочетание или вообще его не введете, то макрос можно будет запустить через меню Сервис - Макрос - Макросы - Выполнить(Tools - Macro - Macros - Run) или с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или нажав ALT+F8.
  • Сохранить в. - здесь задается место, куда будет сохранен текст макроса, т.е. набор команд на VBA из которых и состоит макрос.:
    • Эта книга - макрос сохраняется в модуль текущей книги и, как следствие, будет выполнятся только пока эта книга открыта в Excel
    • Новая книга - макрос сохраняется в шаблон, на основе которого создается любая новая пустая книга в Excel, т.е. макрос будет содержаться во всех новых книгах, создаваемых на данном компьютере начиная с текущего момента
    • Личная книга макросов - это специальная книга Excel с именем Personal.xls, которая используется как хранилище макросов. Все макросы из Personal.xls загружаются в память при старте Excel и могут быть запущены в любой момент и в любой книге.

    После включения записи и выполнения действий, которые необходимо записать, запись можно остановить командой Остановить запись (Stop Recording) .

    Запуск и редактирование макросов

    Управление всеми доступными макросами производится в окне, которое можно открыть с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или - в старых версиях Excel - через меню Сервис - Макрос - Макросы (Tools - Macro - Macros) :

    macro8.jpg

    • Любой выделенный в списке макрос можно запустить кнопкой Выполнить(Run) .
    • Кнопка Параметры(Options) позволяет посмотреть и отредактировать сочетание клавиш для быстрого запуска макроса.
    • Кнопка Изменить(Edit) открывает редактор Visual Basic (см. выше) и позволяет просмотреть и отредактировать текст макроса на VBA.

    Создание кнопки для запуска макросов

    Чтобы не запоминать сочетание клавиш для запуска макроса, лучше создать кнопку и назначить ей нужный макрос. Кнопка может быть нескольких типов:

    Кнопка на панели инструментов в Excel 2003 и старше

    Откройте меню Сервис - Настройка (Tools - Customize) и перейдите на вкладку Команды (Commands) . В категории Макросы легко найти веселый желтый "колобок" - Настраиваемую кнопку (Custom button) :

    Перетащите ее к себе на панель инструментов и затем щелкните по ней правой кнопкой мыши. В контекстом меню можно назначить кнопке макрос, выбрать другой значок и имя:

    Кнопка на панели быстрого доступа в Excel 2007 и новее

    Щелкните правой кнопкой мыши по панели быстрого доступа в левом верхнем углу окна Excel и выберите команду Настройка панели быстрого доступа (Customise Quick Access Toolbar) :

    macro11.jpg

    Затем в открывшемся окне выберите категорию Макросы и при помощи кнопки Добавить (Add) перенесите выбранный макрос в правую половину окна, т.е. на панель быстрого доступа:

    macro12.jpg

    Кнопка на листе

    Этот способ подходит для любой версии Excel. Мы добавим кнопку запуска макроса прямо на рабочий лист, как графический объект. Для этого:

    • В Excel 2003 и старше - откройте панель инструментов Формы через меню Вид - Панели инструментов - Формы (View - Toolbars - Forms)
    • В Excel 2007 и новее - откройте выпадающий список Вставить (Insert) на вкладке Разработчик (Developer)

    Выберите объект Кнопка (Button) :

    macro13.jpg

    Затем нарисуйте кнопку на листе, удерживая левую кнопку мыши. Автоматически появится окно, где нужно выбрать макрос, который должен запускаться при щелчке по нарисованной кнопке.

    Создание пользовательских функций на VBA

    Создание пользовательских функций или, как их иногда еще называют, UDF-функций (User Defined Functions) принципиально не отличается от создания макроса в обычном программном модуле. Разница только в том, что макрос выполняет последовательность действий с объектами книги (ячейками, формулами и значениями, листами, диаграммами и т.д.), а пользовательская функция - только с теми значениями, которые мы передадим ей как аргументы (исходные данные для расчета).

    Чтобы создать пользовательскую функцию для расчета, например, налога на добавленную стоимость (НДС) откроем редактор VBA, добавим новый модуль через меню Insert - Module и введем туда текст нашей функции:

    macro14.jpg

    Обратите внимание, что в отличие от макросов функции имеют заголовок Function вместо Sub и непустой список аргументов (в нашем случае это Summa). После ввода кода наша функция становится доступна в обычном окне Мастера функций (Вставка - Функция) в категории Определенные пользователем (User Defined) :

    macro15.jpg

    После выбора функции выделяем ячейки с аргументами (с суммой, для которой надо посчитать НДС) как в случае с обычной функцией:

    Объект представляет собой сочетание кода и данных, которое рассматривается как единое целое. Объект может быть частью приложения, как, например, элемент управления или форма. Также объектом может являться само приложение в целом.

    При создании приложения в Visual Basic вы постоянно работаете с объектами. Объекты, предоставляемые Visual Basic, такие как элементы управления, формы и объекты доступа к данным. Вы также можете использовать объекты из других приложений в приложении Visual Basic. Вы даже можете создать собственные объекты и определить для них дополнительные свойства и методы. Объекты выполняют функцию готовых блоков для создания программ — вы можете один раз написать фрагмент кода и использовать его многократно.

    В этой статье мы подробно расскажем вам про объекты.

    Объекты и классы

    Каждый объект в Visual Basic определяется классом. Класс описывает переменные, свойства, процедуры и события объекта. Объекты являются экземплярами классов. Определив класс, вы можете создать из него любое количество объектов.

    Взаимосвязь между объектом и его классом можно проиллюстрировать на примере печенья и формочки для печенья. Форма для печенья — это класс. Она определяет характеристики каждого печенья, то есть размер и форму. Класс используется для создания объектов. Отдельные печенья — это и есть объекты.

    Прежде чем получить доступ к его членам, необходимо создать объект, за исключением Shared членов, к которым можно получить доступ без объекта класса.

    Создание объекта из класса

    Определите, из какого класса вы хотите создать объект или определите собственный класс. Например:

    Напишите оператор Dim для создания переменной, значением которой будет новый экземпляр класса. Переменная должна иметь тип, соответствующий нужному классу.

    Добавьте ключевое слово New Operator, сохранить новый экземпляр класса в переменную.

    Теперь члены класса будут доступны через переменную объекта.

    Всегда, если это возможно, следует объявлять переменную с типом того класса, который будет в ней храниться. Этот принцип называется раннее связывание. Если во время компиляции тип класса не известен, можно использовать позднее связывание, объявив переменную с типом данных объекта. Но помните, что позднее связывание может снижать производительность и ограничивать доступ к членам объекта во время выполнения. Дополнительные сведения см. в статье Object Variable Declaration (Объявление объектной переменной).

    Несколько экземпляров

    Обычно все только что созданные из класса объекты идентичны друг другу. Но с того момента, когда они возникают как отдельные объекты, их переменные и свойства изменяются независимо от других экземпляров объекта. Например, если вы добавляете в форму три флажка, каждый из объектов флажков является экземпляром класса CheckBox. Отдельные объекты CheckBox имеют одинаковый набор характеристик и возможностей (свойства, переменные, процедуры и события), которые определены в этом классе. Но каждый из объектов имеет собственное имя, каждый можно отдельно включать и отключать, а также перемещать в другое место на форме.

    Члены объекта

    Объект является элементом приложения и представляет собой экземпляр некоторого класса. Поля, свойства, методы и события являются составными частями объекта, и совокупно именуются членами объекта.

    Доступ к членам

    Чтобы обратиться к члену объекта, нужно указать имя соответствующей переменной объекта и имя нужного члена, отделив его точкой ( . ). В следующем примере задается свойство Text объекта Label.

    Список членов IntelliSense

    Технология IntelliSense перечисляет члены класса, когда вы обращаетесь к функции списка членов, например вводите точку ( . ) в контексте доступа к члену. Если точка ставится после имени переменной, объявленной как экземпляр некоторого класса, IntelliSense перечисляет все члены экземпляра, но опускает общие члены. Если точка ставится после имени класса, то IntelliSense перечисляет все общие члены, но опускает члены экземпляра. Дополнительные сведения см. в разделе Using IntelliSense.

    Поля и свойства

    Поля и свойства представляют сведения, содержащиеся в объекте. Их значения можно задавать и получать с помощью инструкций присваивания, так же как для локальных переменных в процедуре. В следующем примере мы получаем значение свойства Width и устанавливаем значение свойства ForeColor для объекта Label.

    Поле можно также называть переменная-член.

    Процедуры свойств удобно использовать в следующих случаях.

    Вы хотите контролировать, когда и как значения будут задаваться и извлекаться.

    Свойство имеет строго определенный набор значений, которые требуется проверять.

    Изменение значения приводит к существенному изменению состояния объекта (как, например, значение свойства IsVisible ).

    Изменение значения свойства изменяет другие внутренние переменные или значения других свойств.

    Перед установкой или получением свойства необходимо выполнить определенный набор действий.

    Если выполняются следующие условия, можно использовать поля.

    Значение имеет тип, для которого существует встроенная проверка. Например, если присвоить переменной типа Boolean любое значение, кроме True или False , создается ошибка или выполняется автоматическое преобразование данных.

    Допустимым является любое значение из диапазона, поддерживаемого для этого типа данных. Это справедливо для многих свойств с типами Single или Double .

    Свойство имеет тип данных String и не имеет ограничений на размер или значение строки.

    Дополнительные сведения см. в статье Property Procedures (Visual Basic) (Процедуры свойств в Visual Basic).

    Всегда сохраняйте закрытые неконстантные поля. Если вы хотите сделать его общедоступным, используйте свойство.

    Методы

    Действие, которое выполняет объект, называется методом. Например, Add — это метод объекта ComboBox, который добавляет новую запись в поле со списком.

    В следующем примере иллюстрируется использование метода Start объекта Timer.

    По сути метод — это просто процедура, предоставляемая объектом.

    Дополнительные сведения см. в разделе Procedures in Visual Basic (Процедуры в Visual Basic).

    События

    Событие — это действие, распознаваемое объектом, например, щелчок мышью или нажатие клавиши. Вы можете написать код для реагирования на эти события. События могут происходить в результате действий пользователя, выполнения программного кода или изменения состояния системы. Принято говорить, что код, который объявляет о наступлении события, создает это событие, а код, который реагирует на него, обрабатывает событие.

    Вы можете разработать собственные события, которые будут создаваться и обрабатываться созданными вами объектами. Дополнительные сведения см. в статье Events (Visual Basic) (События в Visual Basic).

    Члены экземпляров и общие члены

    Когда вы создаете объект на основе класса, вы получаете экземпляр этого класса. Члены, которые объявлены без ключевого слова Shared, являются членами экземпляра, то есть принадлежат исключительно одному определенному экземпляру. Член экземпляра в одном экземпляре никак не зависит от такого же члена в другом экземпляре того же класса. Например, переменная-член экземпляра может иметь разные значения в разных экземплярах.

    Члены, объявленные с ключевым словом Shared , являются общими членами, то есть относятся к классу в целом, а не к отдельному экземпляру. Существует только одна копия каждого общего члена, независимо от количества созданных экземпляров. Общий член определен даже в том случае, если не создано ни одного экземпляра. Например, общая переменная-член имеет только одно значение, которое можно получить из любого фрагмента кода, имеющего доступ к соответствующему классу.

    Доступ к не общим членам

    Убедитесь, что объект уже создан на основе нужного класса и сохранен в объектной переменной.

    В инструкции, которая обращается к члену, следуйте имени объектной переменной с помощью оператора доступа к члену ( . ), а затем имени члена.

    Доступ к общим членам

    Следуйте имени класса с помощью оператора доступа к члену ( . ), а затем имени члена. К члену объекта, объявленному с ключевым словом Shared , нужно всегда обращаться напрямую через имя класса.

    Если вы уже создали из этого класса объект, вы можете обращаться к члену, объявленному с ключевым словом Shared , и через переменную этого объекта.

    Различия между классами и модулями

    Основное различие между классами и модулями заключается в том, что для классов можно создавать экземпляры в качестве объектов. Модули таким свойством не обладают. Поскольку все данные стандартного модуля существуют только в одной копии, любые изменения общей переменной стандартного модуля, выполненные в любой части программы, будут влиять на все остальные обращения к значению этой переменной. Данные объекта, наоборот, существуют отдельно для каждого созданного экземпляра объекта. Еще одно важное различие состоит в том, что классы могут реализовывать интерфейсы, а модули — нет. Если класс помечен модификатором MustInherit , его нельзя создать напрямую. Однако он по-прежнему отличается от модуля, так как его можно наследовать, пока модули не могут наследоваться.

    Если к члену класса применяется модификатор Shared , он устанавливается для класса в целом, а не для конкретного экземпляра класса. Прямой доступ к члену осуществляется через имя класса, так же как и к членам модуля.

    Также классы и модули используют разные области действия для своих членов. Члены, определенные внутри класса, относятся к определенному экземпляру класса и существуют только в то время, когда существует этот объект. Для обращения к членам класса из кода за пределами этого класса следует использовать полные имена в формате Объект.Член.

    С другой стороны, все объявленные в модуле члены по умолчанию свободно используются из любого места в коде, откуда есть доступ к этому модулю. Это означает, что переменные стандартного модуля являются фактически глобальными переменными. Они видимы из любой точки проекта и существуют в течение всего времени жизни программы.

    Повторное использование классов и объектов

    Объекты позволяют один раз объявить переменную или процедуру, а затем использовать ее везде, где потребуется. Например, если в приложении вам нужно средство проверки орфографии, то для него потребуется определить все необходимые переменные и служебные функции. Создав специальный класс для средства проверки орфографии, вы сможете использовать его снова в других приложениях, просто добавив ссылку на скомпилированную сборку. Более того, вы можете сэкономить время и силы, взяв готовый класс проверки орфографии, созданный ранее кем-то другим.

    В предыдущем примере первый оператор Dim объявляет переменную объекта типа TimeZone и присваивает ей объект TimeZone, который возвращается свойством CurrentTimeZone.

    Отношения между объектами

    Между объектами могут существовать связи нескольких видов. В первую очередь эти связи подразделяются на иерархию и вложенность.

    Иерархические связи

    Если классы являются производным от других, более фундаментальных классов, такие отношения именуются иерархической связью. Иерархии классов удобны при описании объектов, являющихся подтипами более общих классов.

    Для следующего примера предположим, что нам нужен особый вид объекта Button, который действует как обычная кнопка Button, но в дополнение имеет метод, меняющий местами цвет фона и цвет переднего плана.

    Определение класса, производного от уже существующего класса

    С помощью инструкции Class определите класс, из которого вы будете создавать нужный объект.

    Код определения класса должен завершаться строкой End Class . По умолчанию интегрированная среда разработки (IDE) автоматически создает End Class при вводе инструкции Class .

    Сразу за инструкцией Class создайте инструкцию Inherits. Укажите класс, производным от которого будет этот новый класс.

    Новый класс наследует все члены, определенные в базовом классе.

    Добавьте код для дополнительных элементов, которые будет предоставлять производный класс. Например, вы можете добавить метод ReverseColors , тогда определение производного класса будет выглядеть примерно так:

    При создании объекта из ReversibleButton класса он может получить доступ ко всем членам Button класса, а также ReverseColors к методу и другим новым членам, которые вы определяете. ReversibleButton

    Производные классы наследуют члены класса, на котором они основаны, что позволяет постепенно повышать сложность при продвижении по иерархии классов. Дополнительные сведения см. в статье Inheritance Basics (Visual Basic) (Основная информация о наследовании в Visual Basic).

    Компиляция кода

    Убедитесь, что компилятор сможет получить доступ к классу, на основе которого вы намерены создать новый класс. Возможно, для этого придется указать его полное имя, как в предыдущем примере, или определить его пространства имен в операторе Imports. Если класс находится в другом проекте, может потребоваться ссылка на этот проект. Дополнительные сведения см. в статье Управление ссылками в проекте.

    Отношение вложения

    Также объекты могут быть связаны отношением вложения. Объекты-контейнеры на логическом уровне содержат в себе другие объекты. Например, объект OperatingSystem логически содержит объект Version, который он возвращает с помощью свойства Version. Важно понимать, что физически объект-контейнер не содержит в себе других объектов.

    Коллекции

    В качестве примера объектов-контейнеров можно привести коллекции. Коллекции представляют собой группы однотипных перечисляемых объектов. Visual Basic поддерживает определенный синтаксис в for Each. Следующая инструкция, позволяющая выполнять итерацию элементов коллекции. Кроме того, коллекции часто позволяют использовать свойство Item[] для обращения к элементам по индексу или по уникальной строке. Коллекции иногда проще в использовании, чем массивы, поскольку они позволяют добавлять или удалять элементы без использования индексов. Благодаря простоте использования коллекции часто применяются для хранения форм и элементов управления.

    Связанные темы

    Основы наследования
    Описание модификаторов наследования, переопределения методов и свойств, MyClass и MyBase.

    Анонимные типы
    Описание создания и использования анонимных типов, которые позволяют создавать объекты без определения класса для типа данных.

    Инициализаторы объектов: именованные и анонимные типы
    Описание инициализаторов объектов, которые позволяют создавать экземпляры именованных и анонимных типов с помощью одного выражения.

    Читайте также: