Слушайте, чтобы обновить события в 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 были успешно обновлены.

Другие вопросы по тегам