Выполните действие после повторной активации книги - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть рабочая книга, в которой есть кнопки, открывающие другие рабочие книги через VBA.

Насколько я понимаю, эта первоначальная рабочая книга (назовем ее рабочей книгой-концентратором) является одновременно ThisWorkbook и ActiveWorkbookв нем.

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

Когда я снова нажимаю на концентратор, она снова становится ActiveWorkbook.

Я хотел бы выполнить действие, только когда Hub восстановил статус активной рабочей книги.

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

Private Sub Worksheet_Activate()
 MsgBox "Worksheet Reactivated"
End Sub

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

Любая помощь будет оценена.

Спасибо

1 Ответ

0 голосов
/ 19 декабря 2018
Модуль

A Worksheet, такой как, скажем, Sheet1, представляет собой специальный тип модуля класса, который наследует члены класса Worksheet и позволяет легко обрабатывать события, определенные для объекта Worksheet.Во время выполнения этот модуль Sheet1 представляет очень специфический экземпляр класса Worksheet, поэтому любые обработчики событий, реализованные в этом модуле, всегда вызываются только для событий, запущенных из , которые object.

Таким образом, обработчик Worksheet_Activate в выделенном коде Sheet1 будет работать только тогда, когда объект Sheet1 запускает свое событие Activate.

Если вас не интересует какой-то конкретный или определенный лист, вам нужно обрабатывать события на другом уровне: модуль ThisWorkbook - это специальный тип модуля класса, который наследует членов класса Workbook и позволяет вамлегко обрабатывать события, определенные для объекта Workbook.Этот объект рабочей книги всегда представляет определенную рабочую книгу, в которой находится проект VBA, в котором вы находитесь , и никакой другой рабочей книги.

A Workbook объект запускает событие SheetActivate всякий раз, когда любой лист (будь то лист Worksheet, лист Chart или лист любого другого типа) активирован - активированный лист вы получаете через параметр Sh соответствующего обработчика.

* 1034Объект Workbook также запускает свое собственное событие Activate всякий раз, когда он становится ActiveWorkbook.

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

Выберите Workbook в поле со списком в верхнем левом углу панели кода в ThisWorkbook, затем выберитесобытие из выпадающего списка справа, чтобы VBE автоматически генерировал прототип обработчика событий с правильной подписью:

ThisWorkbook code pane dropdowns

Если вам нужно обработать Application -В широких событиях все становится немного сложнее, но суть в том, что вам нужен модуль класса (может быть ThisWorkbook), который объявляет переменную WithEvents:

Private WithEvents App As Excel.Application

Итеперь в верхнем левом раскрывающемся списке будет отображаться App, а при его выборе верхнее правое раскрывающееся меню позволит вам выбрать Excel.Application событие для обработки ... при условии, что вы Set этой App объектной переменной получите действительное значениеExcel.Application ссылка, скажем, в обработчике Workbook_Open:

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

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

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