Я бился головой о стену пословиц в отчаянии от этой проблемы ... Я просто хочу запустить некоторый код, когда пользователь нажимает кнопку Обновить все и обновление завершено. Решение казалось достаточно простым: подключите событие QueryTable_AfterRefresh , но ни этот, ни другие обычные методы не решили мою проблему.
Некоторые заметки / подробности о том, что я делаю:
- Я использую Excel 2016, как и все пользователи рабочей книги.
- Я получаю данные из веб-API, который возвращает результаты (только) в формате JSON. После долгих поисков в VBA и JSON поисков я обнаружил, что на самом деле «Get & Trasnform», иначе Power Query, делает это легко.
- Все прекрасно работает без VBA, но мне нужно запустить код после обновления.
Это то, что я пробовал, и почему это не работает:
- Подключение к QueryTable не работает, так как у Tables / ListObjects, по-видимому, его нет. Я подтвердил это, программно перечислив все таблицы QueryTable в рабочей книге. Когда я исследовал соединения с книгой, я обнаружил, что все они перечислены как Тип: xlConnectionTypeOLEDB . Затем я проверил Tables / ListObjects, и все они SourceType: xlSrcQuery . До сих пор я не нашел объяснения, почему эти соединения не имеют QueryTable.
- Я попытался, после долгих поисков, подключиться к событию ListObject_Change , но в итоге обнаружил, что, очевидно, это доступно только через VTSO.
- Я погуглил каждый вариант «события обновления подключения Excel vba» , о котором я могу подумать; все результаты либо указывают на сайт Microsoft, который не предоставил решения (кроме вышеуказанного нерабочего момента), либо ссылаются на события QueryTable, которые, конечно, недоступны. Я пытался выяснить, пока безрезультатно, есть ли способ заставить ListObject использовать QueryTable.
На данный момент у меня не очень желательная работа; Я использую событие " Worksheet_Change " вместе с проверкой " Intersect " для диапазона Table / ListObject, чтобы увидеть, обновляется ли таблица. Это работает , но У меня также есть дополнительные столбцы (добавленные справа), которые пользователь может изменить, это, конечно, также вызывает событие, приводящее к запуску моего кода AfterRefresh, когда это не нужно. Я надеюсь, что кто-то может знать решение, но на всякий случай ниже приведен обходной код для тех, кто сталкивается с подобной проблемой. Примечание: Это относится к объектному коду "Лист", но его легко изменить, чтобы использовать в объектном коде "ThisWorkbook".
Work Around:
Private Sub Worksheet_Change(ByVal Target As Range)
Debug.Print "[Worksheet_Change] - Name: " & ActiveSheet.Name
Dim shtSheet As Worksheet
Dim lsoTable As ListObject
Set shtSheet = ThisWorkbook.Sheets("Sheet1")
Set lsoTable = shtSheet.ListObjects("Data")
If Intersect(Target, lsoTable.Range) Is Nothing Then
Debug.Print "[Worksheet_Change] - Range [" & Target.Address & "] does NOT intersect with lso [" & lsoTable.Range.Address & "]"
Else
Debug.Print "[Worksheet_Change] - Range [" & Target.Address & "] DOES intersect with lso [" & lsoTable.Range.Address & "]"
End If
End Sub