Руководство и примеры модуля класса VBA

В этом руководстве вы узнаете о модулях классов в VBA. Вы узнаете, что это такое и как их использовать.

Модули классов VBA - Введение

Когда вы вставляете модули в редактор Visual Basic (VBE), чтобы ввести свой код, вы могли заметить, что вы также можете вставить так называемый «модуль класса».

Модули класса против модулей

Модули классов работают совершенно иначе, чем обычные модули, поскольку они облегчают создание модели компонентных объектов (COM), которую затем можно использовать в обычном коде VBA.

Фактически, вы создаете объект, который работает так же, как встроенный объект Excel, такой как «Рабочие листы». В объекте Worksheets у вас есть ряд свойств и методов, которые позволяют получить количество рабочих листов в рабочей книге или каждое отдельное имя рабочего листа или множество другой информации.

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

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

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

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

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

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

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

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

Преимущества использования модулей классов

  1. Вы можете разработать надежный строительный блок, который можно использовать в любом количестве различных приложений Excel.
  2. После того, как он будет тщательно протестирован, можно положиться на то, что он всегда будет давать правильные результаты так же, как встроенные объекты Excel.
  3. Если в код в другом месте приложения внесены обновления, новый объект по-прежнему будет работать таким же образом.
  4. Вы можете использовать свой новый объект в других приложениях Excel в качестве надстройки.
  5. Объекты могут быть повторно использованы в других приложениях и помогают в отладке.

Недостатки использования модулей классов

  1. Их бывает сложно создать и понять.
  2. Соглашения об именах очень важны, потому что это то, что вы увидите, когда используете свой объект в обычном модуле.
  3. Если вы раньше не создавали модуль класса, его может быть трудно понять, и вам придется изучить его.
  4. Невозможно внести изменения во время выполнения - необходимо заново настроить проект.
  5. Если свойства и частные переменные имеют одинаковое имя, могут возникать бесконечные циклы, приводящие к ошибкам.

Вставка модуля класса

Выберите Вставить | Модуль класса из меню VBE (редактор Visual Basic). Новый модуль класса будет автоматически называться «Класс 1», но его необходимо немедленно изменить на имя, которое вы собираетесь использовать для своего объекта.

Вы меняете имя в окне «Свойства», на которое указывает стрелка. Вы просто вводите свое новое имя, и оно изменится в коллекции модулей классов.

Если окно «Свойства» не отображается, выберите «Просмотр» | Свойства в меню VBE или нажмите F4

Вызовите новый модуль класса MyItem и дважды щелкните имя в древовидной структуре в Project Explorer, чтобы отобразить окно кода для него.

Создание предмета

В этом примере будет создан объект верхнего уровня под названием «MyItems» с объектом-членом под ним под названием «MyItem», который будет содержать индивидуальные данные для каждого элемента. После создания он будет работать так же, как встроенный объект Excel. Например, есть объект под названием «Рабочие листы», который представляет собой набор всех рабочих листов в вашей книге. Существует также объект под названием «Лист», который представляет каждый отдельный рабочий лист в вашей книге и содержит все свойства и методы для каждого рабочего листа. Этот объект относится к объекту коллекции «Рабочие листы».

Вы можете перемещаться по коллекции «Рабочие листы», просматривая каждый «Лист» по очереди. Таким же образом вы сможете перебирать коллекцию «MyItems», просматривая свойства, созданные вами в элементе «MyItems».

Первое, что нужно сделать, - это создать подобъект для уровня члена, который будет содержать фактические элементы в коллекции объекта верхнего уровня. Это эквивалент элементов (например, name, visible, count) в объекте Sheet в Excel. Этот код вводится в модуль класса под названием «MyItem».

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

В подобъекте мы собираемся создать два свойства для объекта - Item и Detail.

Первоначально необходимо объявить две строковые переменные для хранения значений свойств:

12 Частный mItem как строкаЧастный mDetail как строка

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

Им нужно дать уникальные имена, чтобы они отличались от свойств, которые мы собираемся создать, поэтому перед каждым именем стоит буква «m» (для члена).

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

Следующим шагом является настройка кода для предоставления доступа к двум свойствам. Это делается с помощью операторов Property Let и Property Get для каждого свойства. Они должны быть общедоступными, иначе объект верхнего уровня не будет иметь никаких видимых свойств.

123456789101112131415 Публичное свойство Let Item (vdata As String)mItem = vdataКонечная собственностьОбщедоступное свойство Get Item () As StringItem = mItemКонечная собственностьСведения о публичной собственности (vdata как строка)mDetail = vdataКонечная собственностьПубличное свойство Получить детали () в виде строкиДеталь = mDetailКонечная собственность

Этот код создает средства для чтения и записи значений двух свойств (Item и Detail) с использованием двух частных переменных, которые были определены в разделе объявлений модуля.

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

Важно, чтобы каждое свойство имело инструкции «Let» и «Get» и чтобы имя свойства было одинаковым в каждом случае. При неправильном написании вы можете получить два разных свойства - одно, из которого можно читать, и другое, в которое можно писать!

Чтобы помочь с созданием этого кода, вы можете использовать Insert | Процедура в меню VBE для создания скелета кода, который будет создавать начальный код для свойств «Get» и «Let» для данного имени свойства.

Появится всплывающее окно, в котором вы вводите имя свойства и выбираете «Свойство» на переключателях:

Нажмите «ОК», и скелетный код будет добавлен в модуль класса:

1234567 Публичное свойство Get MyProperty () как вариантКонечная собственностьПубличное свойство Let MyProperty (ByVal vNewValue как вариант)Конечная собственность

Это предотвращает любые ошибки в названиях свойств. Вы просто добавляете свой код между операторами Public Property и End Property.

Теперь у вас есть объект MyItem, который будет содержать все данные для этого упражнения.

Устали искать примеры кода VBA? Попробуйте AutoMacro!

Создание коллекции

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

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

1 Частные предметы как коллекция

Опять же, это должно иметь уникальное имя, поэтому перед именем стоит «m» (объект-член), и оно также объявлено как «Private», чтобы оно не появлялось при создании нового объекта. использовал

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

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

12345678910 Частный подкласс_Initialize ()Dim objItem как MyItemУстановить mItems = New CollectionДля n = от 1 до 3Установить objItem = New MyItemobjItem.Item = Worksheets ("Sheet1"). Range ("a" & n) .ValueobjItem.Detail = Worksheets ("Sheet1"). Range ("b" & n) .ValuemItems.Add objItemСледующий nКонец подписки

Код устанавливает объект с именем «objItem», используя определение «MyItem», которое мы создали ранее как модуль класса.

Затем он создает новую коллекцию на основе объекта mItems, определенного ранее.

Он перебирает значения, хранящиеся на Sheet1 книги, и помещает их в свойства, которые мы создали для объекта MyItem. Обратите внимание, что при использовании «objitem» появляется раскрывающийся список с двумя свойствами, как если бы вы использовали встроенный объект Excel.

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

Входные данные не обязательно должны быть взяты с рабочего листа. Это могут быть статические значения, или они могут поступать из подключения к базе данных, такой как Microsoft Access или SQL Server, или могут поступать из другого рабочего листа.

Затем вам нужно добавить общедоступную функцию под названием «Item».

123 Элемент публичной функции (индекс как целое число) как MyItemУстановить Item = mItems.Item (index)Конечная функция

Это позволяет вам ссылаться на отдельные объекты в объекте коллекции по их порядковому номеру. Эта функция обеспечивает «зеркало» того, что происходит в коллекции «mMyItems» в фоновом режиме.

Вам также потребуется добавить свойство под названием «Count», чтобы ваш код мог определить, сколько объектов «MyItem» находится в коллекции «MyItems», если вы захотите выполнить итерацию по нему.

123 Публичная собственность получает счет () до тех пор, покаCount = mItems.CountКонечная собственность

В этом случае вам нужно только свойство «Get», потому что оно доступно только для чтения. Он использует коллекцию mItems, потому что в нее уже встроено свойство count.

Теперь у вас есть объект (MyItems) с полной иерархией, определяемой объектом MyItem.

Чтобы все это работало, теперь вам нужно заполнить рабочий лист (Sheet1) данными, чтобы процедура инициализации класса могла собрать их в объект.

Ваша таблица должна выглядеть так:

Использование вашего нового объекта

Теперь вы можете использовать свой объект Collection (MyItems) в стандартном модуле Excel VBA. Введите следующий код:

12345678 Sub test_object ()Dim MyClass как новые объекты MyItems, n как целое числоMsgBox MyClass.CountДля n = 1 в MyClass.CountMsgBox MyClass.Item (n) .ItemMsgBox MyClass.Item (n) .DetailСледующий nКонец подписки

Этот код создает объект под названием «MyClass» на основе созданного вами объекта коллекции под названием «MyItems». Это запускает процедуру «Initialize», которая извлекает все данные из рабочего листа в объект.

Он отображает количество элементов в коллекции, а затем выполняет итерацию по коллекции, показывая текст «Элемент» и текст «Подробности». Вы заметите, что когда вы ссылаетесь на объект «MyClass» в своем коде, вы увидите список двух свойств-членов, который помогает добавить правильное свойство.

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

Если вы используете слово «Static» вместо «Dim», процедура инициализации не запускается, а старые значения сохраняются, пока код выполняется непрерывно. Если данные в электронной таблице изменятся, это не отразится на объекте.

1234567 Sub Test_Static ()Статический Myclass как новые MyItems, n как целое числоДля n = 1 в Myclass.CountMsgBox Myclass.Item (n) .ItemMsgBox Myclass.Item (n) .DetailСледующий nКонец подписки

Резюме создания объекта с использованием модуля класса

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

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

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

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

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

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

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

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

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

Чтобы создать репозиторий, вам нужно вставить новый модуль класса. Вы делаете это с помощью Insert | Модуль класса из меню редактора VB

Измените имя на «MyVariables», используя ту же методологию, что и ранее в этой статье.

Введите следующий код:

12345678910111213141516 Частный мВ как вариантОбщедоступное свойство Get Variable1 () As VariantПеременная1 = мВКонечная собственностьОткрытое свойство Let Variable1 (ByVal vNewValue как вариант)mV = vNewValueКонечная собственностьОбщедоступное свойство Get Variable2 () As VariantПеременная1 = мВКонечная собственностьОткрытое свойство Let Variable2 (ByVal vNewValue как вариант)mV = vNewValueКонечная собственность

Этот код устанавливает свойства «Let» и «Get» для двух переменных («Variable1» и «Variable2»). Свойства Let и Get требуются для каждой из ваших переменных, чтобы они были доступны для чтения / записи.

Вы можете использовать свои собственные имена для переменных вместо примеров в этом коде, и вы можете добавить другие переменные, убедившись, что каждая новая переменная имеет инструкции «Let» и «Get».

Частное объявление переменной «mV» предназначено для создания рабочей переменной, которая используется только в модуле класса для передачи значений.

Чтобы использовать репозиторий переменных, введите следующий код в стандартный модуль:

123456 Global VarRepo как новые переменные MyVariablesSub TestVariableRepository ()MsgBox VarRepo.Variable1VarRepo.Variable1 = 10MsgBox VarRepo.Variable1Конец подписки

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

Код сначала отображает значение «Variable1», чтобы показать, что оно пустое.

Значение 10 присваивается «Variable1», и затем отображается новое значение в объекте, чтобы показать, что это свойство теперь содержит это значение.

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

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

Превращение вашего объекта в надстройку

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

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

В раскрывающемся списке типов файлов выберите тип файла «Надстройка (.xlam)» и нажмите «ОК». По умолчанию файл будет сохранен в папке надстройки, но вы можете изменить его местоположение.

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

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

Нажмите «Надстройки» на левой панели в появившемся всплывающем окне. Внизу окна находится кнопка с надписью «Go».

Нажмите на нее, и появится всплывающее окно «Надстройка». Нажмите «Обзор» и найдите файл надстройки. После этого вы сможете ссылаться на свой объект в своем коде.

Вы поможете развитию сайта, поделившись страницей с друзьями

wave wave wave wave wave