Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Программное создание модуля

    Динамическое создание стандартного программного модуля из кода VBA Excel. Запись в стандартный модуль текста процедур. Программное удаление модуля.

    Создание стандартного модуля

    Стандартный программный модуль создается как новый элемент коллекции VBComponents проекта VBA:

    Число (1) означает, что создается стандартный модуль, если заменить его на (3), будет создана форма.

    Запись текста процедуры в модуль

    Текст процедуры

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

    Программная запись текста процедуры в модуль может быть осуществлена с помощью метода CodeModule.AddFromString или метода CodeModule.InsertLines.

    Метод CodeModule.AddFromString

    Метод CodeModule.AddFromString всегда записывает текст процедуры сразу после раздела Declarations и других строк, не относящихся к процедурам (например, комментарии). То есть, если в модуле уже есть процедуры, новая будет записана перед самой первой из них.

    Пример кода VBA Excel, записывающего текст процедуры в программно созданный стандартный модуль «myModule» методом CodeModule.AddFromString:

    Метод CodeModule.InsertLines

    Метод CodeModule.InsertLines предназначен для построчной записи текста процедуры. Обычно этот метод используется для добавления строк в конце модуля. Перед вставкой новых строк можно определить с помощью свойства CodeModule.CountOfLines количество уже имеющихся строк и начать вставку следующих.

    Пример кода VBA Excel, записывающего текст процедуры в программно созданный стандартный модуль «myModule» методом CodeModule.InsertLines:

    Код с методом InsertLines выглядит несколько аккуратней из-за отсутствия амперсандов и ключевых слов переноса строки (vbNewLine), чем код с методом AddFromString.

    Вставка кнопки на рабочий лист

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

    Программная вставка кнопки из коллекции «Элементы управления формы» на активный рабочий лист Excel:

    Пример кода в сборе

    Динамическое создание стандартного модуля, программная запись в него процедуры «MyNewSub», вставка на рабочий лист кнопки из коллекции «Элементы управления формы» и назначение ей процедуры «MyNewSub»:

    Вы можете скопировать процедуру «Primer» в стандартный модуль вашего проекта VBA, запустить ее и ознакомиться с результатами ее работы. Код записан и протестирован в Excel 2016.

    Удаление стандартного модуля

    Программное удаление стандартного модуля с именем «Module4» из проекта VBA Excel:

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


    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    5 комментариев для “VBA Excel. Программное создание модуля”

    1. Здравствуйте!
      Известно, что запись вида
      Cells(1, 1) = 15
      эквивалентна записи
      Cells(1, "A") = 15
      или записи
      dim x as Byte, y as Byte
      x=1
      y=1
      Cells(x, y) = 15

      А можно ли использовать в переменной букву?
      Что-нибудь такого плана:
      dim x as Byte, y as String
      x=1
      y="A"
      Cells(x, y) = 15

      Спасибо!

      1. Евгений

        Добрый день!
        В переменной можно использовать букву и ваш пример работает правильно:

        Только я бы рекомендовал вместо Dim x As Byte использовать Dim x As Long, чтобы выделенной памяти хватило переменной на количество строк всего листа.

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

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

      1. Евгений

        Попробуйте запустить у себя процедуру Primer из параграфа «Пример кода в сборе». Там, после создания модуля и записи в него текста процедуры, создается еще кнопка. Если сработает, сравните Primer с вашим кодом.

    Обсуждение закрыто.