Как я могу настроить выполнение макроса из моего PERSONAL.XLSB всякий раз, когда открывается любая рабочая книга Excel с определённым текстом в имени файла?

Вопрос или проблема

Я пытаюсь создать решение на VBA в Excel, которое будет запрашивать меня о запуске определенной макроса каждый раз, когда я открываю рабочую книгу, содержащую “Action Items” в имени файла. В частности, если имя файла включает “Action Items”, я хотел бы, чтобы Excel спросил меня, хочу ли я запустить макрос под названием ActionItemReportPro. Если я нажимаю “Да”, он должен запустить этот макрос; если “Нет”, он просто должен открыть файл как обычно.

Я хочу, чтобы эта функциональность была доступна для любой рабочей книги, которую я открываю, так как PERSONAL.XLSB будет открываться всякий раз, когда открывается другая электронная таблица Excel, а не только когда я открываю сам Excel. Я поместил свой код в PERSONAL.XLSB, чтобы он был доступен во всех рабочих книгах. Надеюсь, что Excel не должен запускаться в фоновом режиме заранее, так как в большинстве случаев он будет закрыт и будет открыт только при открытии нового файла.

Код ниже работает хорошо, если я запускаю его вручную. Сначала я попробовал использовать событие Workbook_Open в PERSONAL.XLSB, но мне нужно, чтобы оно срабатывало, когда открывается любая рабочая книга, а не только моя личная рабочая книга.

Я также рассматривал возможность использования макроса Auto_Open в PERSONAL.XLSB, но он выполняется только один раз при запуске Excel и не отслеживает последующие открытия рабочих книг.

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

Вот что у меня есть в модуле класса (EventClassModule) для обработки событий на уровне приложения:

Public WithEvents App As Application

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
    Dim fileName As String
    fileName = Wb.Name
    
    ' Проверка, есть ли "Action Items" в имени файла
    If InStr(1, fileName, "Action Items", vbTextCompare) > 0 Then
        Dim userResponse As VbMsgBoxResult
        userResponse = MsgBox("Хотите запустить макрос AIR?", vbYesNo + vbQuestion, "Запустить макрос AIR")
        
        If userResponse = vbYes Then
            Application.Run "PERSONAL.XLSB!ActionItemReportPro"
        End If
    End If
End Sub

А вот как я инициализирую его в ThisWorkbook PERSONAL.XLSB:

Dim AppEvents As New EventClassModule

Private Sub Workbook_Open()
    Set AppEvents.App = Application
End Sub

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

Я пропускаю шаг для правильной инициализации события в PERSONAL.XLSB? Или есть альтернативный подход, чтобы гарантировать, что этот код проверяет каждую новую открытую рабочую книгу после запуска Excel? Буду признателен за любую помощь! Спасибо.

Ответ или решение

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

Шаги для реализации

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

  2. Настройка класса в PERSONAL.XLSB: В вашем основном модуле ThisWorkbook вы правильно инициализируете класс событий. Однако вам следует убедиться, что инициализация действительно выполняется.

  3. Инициализация класса событий в ThisWorkbook: Убедитесь, что код инициализации класса событий запускается при открытии PERSONAL.XLSB. Если ваш код в Workbook_Open не срабатывает, попробуйте добавить дополнительный вывод или отладку, чтобы убедиться, что этот код действительно исполнен.

Полный пример кода

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

В классе EventClassModule:

Public WithEvents App As Application

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
    Dim fileName As String
    fileName = Wb.Name

    ' Проверка, есть ли "Action Items" в названии файла
    If InStr(1, fileName, "Action Items", vbTextCompare) > 0 Then
        Dim userResponse As VbMsgBoxResult
        userResponse = MsgBox("Хотите запустить макрос 'ActionItemReportPro'?", vbYesNo + vbQuestion, "Запуск макроса")

        If userResponse = vbYes Then
            Application.Run "PERSONAL.XLSB!ActionItemReportPro"
        End If
    End If
End Sub

В модуле ThisWorkbook:

Dim AppEvents As EventClassModule

Private Sub Workbook_Open()
    Set AppEvents = New EventClassModule
    Set AppEvents.App = Application
End Sub

Проверка настроек безопасности макросов

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

  • Файл -> Параметры -> Центр управления безопасностью -> Параметры центра управления безопасностью -> Параметры макросов.

Запуск Excel и PERSONAL.XLSB

Ваше предположение насчёт нагрузки Excel важно. При открытии другого документа параметр PERSONAL.XLSB автоматически открывается в фоновом режиме. Но тем не менее, если код инициализации не будет выполнен, то события не сработают. Поэтому всегда полезно проверять, активен ли ваш макрос.

Советы по отладке

  • Используйте Debug.Print или MsgBox для отладки, чтобы удостовериться, что код действительно исполняется.
  • Периодически сохраняйте и перезапускайте Excel для проверки работоспособности изменений.

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

Оцените материал
Добавить комментарий

Капча загружается...