#excel #vba
#excel #vba
Вопрос:
Я создаю надстройку для работы с одним очень, очень раздражающим файлом, предоставленным извне. При открытии этого файла он делает много раздражающих вещей, среди которых скрывается лента. Я бы хотел заблокировать это поведение. Да, это можно сделать другими способами, но я бы хотел, чтобы это было интегрировано в надстройку — пользователи, взаимодействующие с листом, очень неискушенные — такие вещи, как нажатие shift при открытии файла, слишком сложны, а также мы хотим, чтобы другие макросы в файле выполнялись нормально.
Итак, вопросы:
- Возможно ли, чтобы надстройка xlam знала, когда файл открыт, и затем выполняла некоторые функции
- Возможно ли, чтобы надстройка 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. Харви, ты легенда — спасибо тебе за хорошо написанное, хорошо объясненное и функционирующее решение моей проблемы!