Выполнение действия в надстройке Excel (xlam) при открытии файла

#excel #vba

#excel #vba

Вопрос:

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

Итак, вопросы:

  1. Возможно ли, чтобы надстройка xlam знала, когда файл открыт, и затем выполняла некоторые функции
  2. Возможно ли, чтобы надстройка xlam выполняла какую-либо функцию каждые 10 секунд с момента открытия Excel? (менее привлекательное решение)

Комментарии:

1. Да, это потребует некоторой модификации. Вам нужно будет посмотреть на событие приложения _WorkbookOpen(ByVal Wb As Workbook) . Вы могли бы просто добавить, If activeworkbook.name<>"Sheet_not_to_work_on" then....you sub....

Ответ №1:

Да, это возможно. Вы можете сделать что-то вроде следующего:

В новом модуле класса под названием AppEvents поместите следующий код:

 Option Explicit
Public WithEvents App As Application

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
    MsgBox "Hello new workbook!"
    'do whatever else you'd rather do here
End Sub

Private Sub Class_Terminate()
    Set App = Nothing
End Sub
  

Если вы хотите обнаруживать новые книги, а также открывать те, которые уже были созданы, вам также нужно добавить это:

 Private Sub App_NewWorkbook(ByVal Wb As Workbook)
    MsgBox "Hello new workbook!"
    'do whatever else you'd rather do here
End Sub
  

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

 Option Explicit

Dim EventHandler As AppEvents

Sub InitHandler()
    Set EventHandler = New AppEvents
    Set EventHandler.App = Application
End Sub
  

Наконец, нам нужно добавить функцию в thisworkbook раздел надстройки XLAM:

 Private Sub Workbook_Open()
    Call InitHandler
End Sub
  

Объяснение

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

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

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

Комментарии:

1. Харви, ты легенда — спасибо тебе за хорошо написанное, хорошо объясненное и функционирующее решение моей проблемы!