Автоматическое обновление запроса питания в Excel 2016

В Excel 2013 я использовал следующую подпрограмму VBA для автоматического обновления таблицы, загруженной с помощью запроса мощности:

Public Sub RefreshData()
    Sheet1.Range("my_data_table").ListObject.TableObject.Refresh
End Sub

После миграции в Excel 2016 один и тот же код ведет себя по-другому, а это означает, что после загрузки данных он меняет представление на новую таблицу данных.

Есть ли способ вернуть прежнее поведение?

Изменить: я сделал модель, которая более точно описывает проблему, ее можно скачать: здесь


person Sorin GFS    schedule 20.03.2018    source источник
comment
Не могли бы вы объяснить, что вы имеете в виду под изменением взгляда. Возможно скриншот мог бы помочь.   -  person Pᴇʜ    schedule 20.03.2018
comment
У меня есть кнопка на другом листе, которая запускает обновление. В Excel 2016 после обновления представление изменяется на таблицу данных, больше не работает в автоматическом режиме.   -  person Sorin GFS    schedule 20.03.2018


Ответы (1)


Вероятно, вы можете только отключить обновление экрана и вернуться к исходному листу.

Public Sub RefreshData()
    Application.ScreenUpdating = False
    Sheet1.Range("my_data_table").ListObject.TableObject.Refresh
    DoEvents 'let refresh finish first
    Worksheets("SheetNameWhereRefershButtonIs").Activate 'switch back to a specific sheet
    Application.ScreenUpdating = True
End Sub

Или, как указал @Chronocidal:

Public Sub RefreshData()
    Application.ScreenUpdating = False
    With ActiveSheet
        Sheet1.Range("my_data_table").ListObject.TableObject.Refresh
        DoEvents 'let refresh finish first
        .Activate 'switch back to original sheet
    End With
    Application.ScreenUpdating = True
End Sub
person Pᴇʜ    schedule 20.03.2018
comment
На самом деле это 1 случай, когда я бы выступил за ActiveSheet, потому что конструктор With не переоценивается при изменении объекта: With ActiveSheet: Sheet1.Range("my_data_table").ListObject.TableObject.Refresh: .Activate: End With - person Chronocidal; 20.03.2018
comment
@Chronocidal, вы правы, это действительно может быть вариант здесь. Тем не менее, я стараюсь избегать ActiveSheet при объяснении вещей, потому что это часто используется неправильно. Но я включил ваше предложение. Спасибо, что указали. - person Pᴇʜ; 20.03.2018
comment
Спасибо, ребята, но я думаю, что это могло бы быть более чистым решением. Подождем немного, если никто не найдет, отмечу твой как ответ. - person Sorin GFS; 20.03.2018
comment
В качестве объяснения я стараюсь избегать как можно большего Application.ScreenUpdating = False, потому что, если код не работает посередине, это не принесет Application.ScreenUpdating = True очков. - person Sorin GFS; 20.03.2018
comment
@SorinGFS Нет причин избегать ScreenUpdating, его можно легко избежать с помощью хорошей обработки ошибок (которая в любом случае должна быть включена), когда вы снова включаете ее, как только возникает ошибка. - person Pᴇʜ; 20.03.2018
comment
@ Pᴇʜ решение, которое вы написали для Chronocidal, не работает - person Sorin GFS; 20.03.2018
comment
@ Pᴇʜ из решения, которое вы написали для Chronocidal, я вижу, что Sheet1.Range("my_data_table").ListObject.TableObject.Refresh фактически изменяет активный лист! - person Sorin GFS; 20.03.2018
comment
@SorinGFS вам, вероятно, понадобится DoEvents сразу после обновления, чтобы оно закончилось первым. Смотрите мою правку. - person Pᴇʜ; 20.03.2018
comment
@ Pᴇʜ нет. Выдает исключение: Exception from HRESULT: 0x800A03EC - person Sorin GFS; 20.03.2018
comment
@SorinGFS Этого не должно произойти, если просто добавить DoEvents. Понятия не имею, почему это не работает. - person Pᴇʜ; 20.03.2018