Слушайте, чтобы обновить события в Excel
Когда пользователь нажимает кнопку "Обновить" / "Обновить все", Excel, кажется, просто вызывает метод обновления для каждого (или выбранного) QueryTable(ов) в Рабочей книге. Однако прослушивание событий BeforeRefresh и AfterRefresh для QueryTable в действительности мне здесь не поможет, потому что мне нужно выполнить некоторые вещи после того, как все QueryTables в Рабочей книге (соответственно после всех выбранных QueryTables) обновлены.
Есть ли способ сделать это? Может быть, можно как-то послушать щелчок мышью по этой кнопке обновления?
2 ответа
На самом деле это то, как я собирался сделать это в первую очередь. Но здесь есть проблема. Допустим, общее количество QueryTables равно 10. И скажем, пользователь просто выбрал один QueryTable, а затем нажал "Обновить все". Итак, мой алгоритм сначала проверит количество выбранных таблиц QueryTable, равное 1. В результате мои вычисления начнутся только после 1 обновления, что неверно.
Тем временем я пытался получить доступ к этой кнопке "Обновить" на ленте. Но это не сработало. По какой-то причине мой код ничего не делает...
Public Class ThisAddIn
Private Sub ThisAddIn_Startup() Handles Me.Startup
AddHandler Globals.ThisAddIn.Application.WorkbookActivate, AddressOf OnWorkbookOpened
End Sub
Private refrBtn As Office.CommandBarButton
Private Sub OnClick(ByVal Ctrl As Office.CommandBarButton, _
ByRef CancelDefault As Boolean)
MsgBox("PLS WORK!")
End Sub
Private Sub OnWorkbookOpened(wb As Excel.Workbook)
Try
refrBtn = CType(wb.Application.CommandBars.FindControl(Id:=459), Office.CommandBarButton)
AddHandler refrBtn.Click, AddressOf OnClick
Catch ex As Exception
MsgBox(ex.Message)
MsgBox(ex.GetType)
MsgBox(ex.StackTrace.ToString)
End Try
End Sub
End Class
Изменить: я забыл свои данные для входа, поэтому я создал новую учетную запись
Я не использую VSTO, но я бы расследовал:
- Создайте глобальную переменную (или свойство книги) со значением 0
- В каждом
AfterRefresh
событие вызов процедуры - Эта процедура увеличивает счетчик
- Когда счетчик достигнет общего количества QueryTables (или общего выбранного числа), сделайте то, что вам нужно, и сбросьте счетчик до 0.
Вы также можете проверить Success
аргумент каждый раз, чтобы ваш код мог работать только в том случае, если все выбранные QT были успешно обновлены.