Excel vba обновить все подключения


October 06, 2020/



Chris Newman

Refresh Excel Data Connections VBA

With the release of integrated stock pricing in Microsoft Excel, it was unfortunate there wasn’t any sort of setting that allowed for automatic updating of the stock data while the file was open.

Even worse, there is currently no way to ensure the data refreshes when you initially open your Excel file. This becomes vitally important if you are relying on your stock data to be up-to-date before making any trading decisions.

Let’s look at a few ways we can incorporate VBA code to help remedy the lack of this feature.

In this article, I’ll cover how to:

  • Refresh your query data manually

  • Refresh your data automatically when the file opens

  • Refresh your data automatically when you select a specific tab

  • Refresh your data at a given interval (ie every 30 seconds)

Refresh Data Connections Manually

You can trigger the refreshing of your stock data by either using keyboard shortcut Ctrl+Alt+F5 or navigating to your Excel Ribbon’s Data tab and clicking the Refresh All button within the Queries & Connections button group.

Refresh All Button.png

Refresh Data Connections When File Opens (VBA)

You can trigger a data refresh when your Excel file is first opened by pasting VBA code into the Workbook_Open event. Simply double-click the ThisWorkbook object in the VBA Project Pane to open the text editor (blank white sheet) within the Visual Basic Editor (keyboard shortcut Alt +F11).

Next, paste the below code into the text editor and save.

Private Sub Workbook_Open()
‘PURPOSE: Run Data tab’s Refresh All function when file is opened

ThisWorkbook.RefreshAll

MsgBox «Stock Data has been refreshed!»

End Sub

Workbook Event.png

The next time you open your Excel file, you should see the message box immediately appear indicating that your stock data has been refreshed.

Refresh Data Connections When Sheet Is Activated (VBA)

You can trigger a data refresh when you navigate to a particular spreadsheet tab by pasting VBA code into the Worksheet_Activate event. Simply double-click the desired Sheet object in the VBA Project Pane to open the text editor (blank white sheet) within the Visual Basic Editor (keyboard shortcut Alt +F11). The tab name of your sheets will be inside the parathesis next to the object name, so you can easily decipher which sheet object you want to store the code in.

Next, paste the below code into the text editor and save.

Private Sub Worksheet_Activate()
‘PURPOSE: Run Data tab’s Refresh All function when sheet is activated

ThisWorkbook.RefreshAll

MsgBox «Stock Data has been refreshed!»

End Sub

Worksheet Event.png

The next time you navigate to the particular tab you stored the code in, you should see the message box immediately appear indicating that your stock data has been refreshed.

Refresh Data Connections Every X Seconds (VBA)

Alright, this is for all the day traders out there that want their data automatically refreshed throughout the day. We can utilize VBA’s OnTime functionality to schedule a macro to run and effectively create a loop so that it keeps refreshing at your desired interval.

There are 4 macros in the below code, however, you will only need to call two of them:

  1. StartRefreshLoop — Starts the refresh intervals

  2. EndRefreshLoop — Ends the refresh intervals

You can set the public variable “Seconds” to any interval you wish. Since stock data typically refreshes every 15 minutes, you’ll most likely want to set it to 960 seconds.

Public RefreshTime As Double
Public Const Seconds = 30 ‘Input Refresh Interval in seconds

Sub StartRefreshLoop()

‘User Message indicating loop is beginning
  MsgBox «Refreshes will begin to occur at » & _
    «the designated interval of » & Seconds & » seconds»

‘Call the first Refresh
  Call StartRefreshes

End Sub

Sub StartRefreshes()

‘Calculate Next Refresh Time
  RefreshTime = Now + TimeSerial(0, 0, Seconds)

‘Trigger a Refresh with OnTime function
  Application.OnTime _
    EarliestTime:=RefreshTime, _
    Procedure:=»RefreshConnections», _
    Schedule:=True

  End Sub

Sub RefreshConnections()

‘Refresh Data Connections
  ThisWorkbook.RefreshAll

‘Start Timer Over Again
  Call StartRefreshes

End Sub

Sub EndRefreshLoop()

‘On Error Resume Next
  Application.OnTime _
    EarliestTime:=RefreshTime, _
    Procedure:=»RefreshConnections», _
    Schedule:=False

‘User Message indicating loop has ended
  MsgBox «Refreshes are no longer occurring»

End Sub

I Hope This Helped!

Hopefully, I was able to explain how you can use VBA code to automate refreshing your data connections to ensure you have the most up-to-date stock information in your spreadsheets. If you have any questions about this technique or suggestions on how to improve it, please let me know in the comments section below.

Chris Newman 2020 - TheSpreadsheetGuru

About The Author

Hey there! I’m Chris and I run TheSpreadsheetGuru website in my spare time. By day, I’m actually a finance professional who relies on Microsoft Excel quite heavily in the corporate world. I love taking the things I learn in the “real world” and sharing them with everyone here on this site so that you too can become a spreadsheet guru at your company.

Through my years in the corporate world, I’ve been able to pick up on opportunities to make working with Excel better and have built a variety of Excel add-ins, from inserting tickmark symbols to automating copy/pasting from Excel to PowerPoint. If you’d like to keep up to date with the latest Excel news and directly get emailed the most meaningful Excel tips I’ve learned over the years, you can sign up for my free newsletters. I hope I was able to provide you some value today and hope to see you back here soon! — Chris

 

Vsevolod

Пользователь

Сообщений: 485
Регистрация: 31.03.2016

#1

14.07.2018 08:14:59

Привет
Стоит задача по очереди обновить ряд Power Query подключений. По очереди, это значит дождаться конца предыдущего обновления и только потом начинать следующий. На форуме нашел, что стоит запускать с BackgroundQuery = false. Но это не помогает и они параллельно выполняются. Подскажите пожалуйста, как решить эту задачу. Спасибо

Код
    ThisWorkbook.Connections("Query - makeLinkWeb").OLEDBConnection.BackgroundQuery = False
    ThisWorkbook.Connections("Query - makeLinkWeb").refresh
    ThisWorkbook.Connections("Query - makeLinInsta").OLEDBConnection.BackgroundQuery = False
    ThisWorkbook.Connections("Query - makeLinInsta").refresh
 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#2

14.07.2018 09:59:59

Доброе время суток
Попробуйте

Код
ThisWorkbook.Connections("Query - makeLinkWeb").OLEDBConnection.Refresh

Вдруг, да поможет. А то вы отключаете фоновое обновление у одного объекта, а метод обновления запускаете для более высокоуровневого. Проверить не могу. Дома нет таких наборов данных, чтобы оценить.

 

Vsevolod

Пользователь

Сообщений: 485
Регистрация: 31.03.2016

#3

14.07.2018 16:22:57

Андрей VG, Спасибо за помощь! Попробовал — стартует один коннект, потом к нему через какое-то время второй добавляется. А хочется, чтобы они шли поочередно.
У меня почему-то проблемы при одновременном Refresh несколько коннектов, если они берут данные(два коннекта) информацию из одного файла загруженного в модель и прогоненого через Table.Buffer.

Тут

обсуждали.

Код
  ThisWorkbook.Connections("Query - skladNumArticle").OLEDBConnection.BackgroundQuery = False
     ThisWorkbook.Connections("Query - skladNumArticle").OLEDBConnection.refresh
     ThisWorkbook.Connections("Query - skladNumSizeAll").OLEDBConnection.BackgroundQuery = False
     ThisWorkbook.Connections("Query - skladNumSizeAll").OLEDBConnection.refresh

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#4

14.07.2018 16:40:39

Цитата
Vsevolod написал:
стартует один коннект, потом к нему через какое-то время второй добавляется

Тогда костыль, навроде

Код
Public Sub refreshOleConnection(ByVal thisConnection As OLEDBConnection)
    thisConnection.Refresh
    Do While thisConnection.Refreshing
        DoEvents
    Loop
End Sub
 

Vsevolod

Пользователь

Сообщений: 485
Регистрация: 31.03.2016

Андрей VG, по исследую еще и отпишусь. Мне кажется кружок крутиться — НО Excel понимает, что все данные он уже собрал и рендерит(мои догадки) и стартует следующее обновление. Так как в других моделях когда много коннектов больше задержки. Отпишусь по результату! Благодарю за помощь!  

 

PooHkrd

Пользователь

Сообщений: 6602
Регистрация: 22.02.2017

Excel x64 О365 / 2016 / Online / Power BI

Vsevolod, вы можете все таки объяснить зачем вы выдергиваете данные в таблицу на лист, а затем обращаетесь другими запросами к этой таблице, вместо того чтобы закинуть результат первого запроса в буфер и другими запросами обращаться к уже готовой таблице в памяти?
Зачем все эти костыли?

Изменено: PooHkrd16.07.2018 09:34:57

Вот горшок пустой, он предмет простой…

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

#7

16.07.2018 12:09:18

Цитата
Андрей VG написал:
Тогда костыль, навроде

Есть ощущение, что цепочка запросов в PQ всегда пересчитывается при изменении первого, причем очередность он «знает сам». Первым может быть и 7-й в списке из 10-ти. Тогда 7, 8, 9 и 10-й пересчитаются автоматически. И это никак не изменить, даже в 2016-м.

Неизлечимых болезней нет, есть неизлечимые люди.

 

Vsevolod

Пользователь

Сообщений: 485
Регистрация: 31.03.2016

#8

18.07.2018 11:33:10

Андрей VG, спасибо большое! Не могу сообразить, как переменную, что туда передать?

Код
refreshOleConnection (ThisWorkbook.Connections("Query - dataBlogerProduct"))
refreshOleConnection (ThisWorkbook.Connections("Query - dataBlogerProduct").OLEDBConnection)

Пробовал такие два варианта:(
PooHkrd, вот TheBestOfTheBest,  описал то что у меня происходит. Большой Excel фаил, есть много различных вычислений, которые сходятся к одним и тем же источникам данных(запиханых в буфер). Если Вызвать рефреш одновременный двух connection — то он будет таблицу(источник данных) все равно дважды обновлять:(  

 

PooHkrd

Пользователь

Сообщений: 6602
Регистрация: 22.02.2017

Excel x64 О365 / 2016 / Online / Power BI

Т.е. у вас на выходе несколько одновременно выполняемых запросов, каждый из которых выводит данные в какие-то таблицы? Если так, то да, создаются параллельные цепочки, которые выполняются одновременно.
Тут для оптимизации уже нужно смотреть на весь ваш проект целиком. А это вряд ли возможно в рамках одной темы.
Единственно, что по собственному опыту, я бы рекомендовал посмотреть в сторону Power Pivot, если загружать таблицы в модель данных, то там как раз более менее нормально строятся цепочки загрузки таблиц, даже использующих одни и те же источники.

Вот горшок пустой, он предмет простой…

 

Vsevolod

Пользователь

Сообщений: 485
Регистрация: 31.03.2016

#10

19.07.2018 17:43:17

Андрей VG, смог сделать по примеру, как показал Андрей.
PooHkrd, в одном файле генерируется несколько проекций данных, в которых данные могут браться из одного и того же источника. Например Имя клиента. Где возможно, использую Power Pivot.

Это продолжение перевода книги Кен Пульс и Мигель Эскобар. Язык М для Power Query. Главы не являются независимыми, поэтому рекомендую читать последовательно.

Предыдущая глава    Содержание    Следующая глава

По мере того, как вы создаете все больше и больше решений на основе Power Query, и начинаете понимать, сколько времени это экономит, вы захотите еще большей автоматизации. Да, вы можете просто щелкнуть правой кнопкой мыши таблицу, которая была импортирована с помощью Power Query, но даже это ощущается как… ручная операции. Нельзя ли запланировать обновление или, возможно, контролировать порядок обновления?

На самом деле вы можете использовать несколько различных методов автоматизации обновления решений Power Query:

  • Обновление при открытии книги
  • Обновление каждые Х минут
  • Обновить соединение по требованию с помощью VBA
  • Обновить все соединения по требованию с помощью VBA
  • Использовать расписание обновлений в сторонней надстройке

Ris. 16.1. Nastrojka parametrov podklyucheniya

Рис. 16.1. Настройка параметров подключения

Скачать заметку в формате Word или pdf, примеры в формате архива

Планирование обновлений без использования кода

Первые два метода работают через пользовательский интерфейс и не требуют кода VBA. Они могут быть настроены на основе подключения, и вы даже можете автоматизировать обновление вплоть до Power Pivot. Откройте файл Automating Refresh.xlsx. Перейдите на вкладку Данные –> Запросы и подключения. В правой части окна Excel откроется область Запросы и подключения. Кликните правой кнопкой мыши имя запроса –> Свойства. Откроется окно Свойства запроса (рис. 1).

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

Следующий параметр – Обновлять каждые ХХ минут. Этот параметр очень пригодится, если вы извлекаете данные из веб-источника, который постоянно меняется, или если вы ориентируетесь на базу данных, которая регулярно обновляется. Для того, чтобы это обновление произошло книга Excel должна быть открыта. Допустимые значения для этого параметра – от 1 до 32 767.

Обновлять при открытии книги. Второй параметр в этом разделе – Удалять данные из внешнего диапазона перед сохранением книги. Установите этот флажок, если вы хотите сохранить книгу с определением запроса, но без использования внешних данных. Снимите этот флажок, чтобы сохранить, и определение запроса, и данные. Этот флажок, будет доступен только после установления флажка Обновлять при открытии книги.

Автоматизация обновления запросов с помощью VBA

Приемы, описанные выше, и не использующие макросы, обходятся без каких-либо окон, предупреждающих о безопасности. Кроме того, такие книги легче переносить в Power BI, так как они не вызывают никаких проблем с блокировкой. Однако если вы работаете исключительно в настольном экземпляре Excel, иногда может потребоваться предоставить пользователю удобный и очевидный способ обновления решений Power Query. Это может быть сделано с помощью записи кода VBA.

Можно создать макрос для обновления одного подключения Power Query. В файле Automating Refresh.xlsx и перейдите на лист Transactions. На листе расположена Таблица Transactions, а также сводная таблица. Допустим, вы хотите создать макрос для обновления их обеих. Перейдите на вкладку Разработчик. Если вы не видите вкладку Разработчик, щелкните правой кнопкой мыши любую вкладку на ленте и выберите Настроить ленту. В правом окне установите флажок рядом с вкладкой Разработчик и нажмите Ok. На вкладке Разработчик нажмите кнопку Запись макроса. Также можно нажать иконку в левом нижнем углу окна Excel:

Ris. 16.2. Knopka Nachat zapis makrosa

Рис. 16.2. Кнопка Начать запись макроса

Как только вы нажмете эту кнопку, Excel начнет записывать каждый щелчок листа, каждое нажатие клавиши и… каждую ошибку, которую вы делаете. Выполните в точности следующие действия. Дайте макрос Refresh и сохраните его в текущей книге. Пройдите по меню Данные –> Запросы и подключения –> В правой части окна Excel в области Запросы и подключения кликните правой кнопкой мыши на запросе Transactions –> Обновить. Щелкните правой кнопкой мыши любую ячейку сводную таблицу –> Обновить. Повторно кликните кнопку, как на рис. 16.2. Запись макроса будет остановлена. Проверьте код. Пройдите по меню Вид –> Макросы:

Ris. 16.3. Makrosy

Рис. 16.3. Макросы

Нажмите Изменить. Откроется окно редактора VBA

Ris. 16.4. Kod VBA

Рис. 16.4. Код VBA; чтобы увеличить изображение кликните на нем правой кнопкой мыши и выберите Открыть картинку в новой вкладке

Добавьте кнопку для обновления макроса. Перейдите на вкладку Разработчик –> Вставить –> Кнопку:

Ris. 16.5. Vstavit element upravleniya Knopku

Рис. 16.5. Вставить элемент управления Кнопку

Выберите место на листе, и удерживая левую кнопку мыши, нарисуйте прямоугольник для Кнопки. Отпустите левую кнопку мыши. Появится окно с предложением поставить в соответствие Кнопке макрос. Выберите Refresh. Нажмите Ok. Щелкните правой кнопкой мыши по Кнопке –> Изменить текст. Введите Обновить. Щелкните любую ячейку на листе, чтобы выйти из режима редактирования названия кнопки.

Ris. 16.6. Knopka podklyuchennaya k makrosu

Рис. 16.6. Кнопка, подключенная к макросу

Обновление нескольких запросов

Теперь можно добавить иные запросы в макрос. Пройдите по меню Разработчик –> Макросы –> Refresh –> Изменить. На данный момент код имеет вид (см. также рис. 16.4):

Sub Refresh()

Refresh Макрос

    ActiveWorkbook.Connections(«Power Query — Transactions»).Refresh

    Range(«J6»).Select

    ActiveSheet.PivotTables(«Сводная таблица1»).PivotCache.Refresh

End Sub

Первые четыре строки после Sub Refresh() – это просто комментарии. Сейчас в них нет смысла, так что можно их удалить. Строка, начинающаяся с ActiveWorkbook, обновляет запрос. В следующей строке выбирается ячейка на активном листе. Предпоследняя строка обновляет сводную таблицу на активном листе.

Вы можете внести некоторые изменения в этот макрос, чтобы не только контролировать порядок обновления всех соединений, но и сделать код немного более надежным. (Сейчас код потерпел бы неудачу, если бы кто-то попытался запустить его из другого рабочего листа, так как на нем не было бы сводной таблицы.) Вот как должен выглядеть усовершенствованный код:

Sub Refresh()

   ActiveWorkbook.Connections(«Power Query — Jan2008»).Refresh

   ActiveWorkbook.Connections(«Power Query — Feb2008»).Refresh

   ActiveWorkbook.Connections(«Power Query — Mar2008»).Refresh

   ActiveWorkbook.Connections(«Power Query — Transactions»).Refresh

   Worksheets(«Transactions»).PivotTables(«PivotTable1»). _

      PivotCache.Refresh

End Sub

Символы пробела и подчеркивания используются для обозначения разрыва строки в коде VBA. Код будет работать, если PivotCache.Refresh останется в той же строке (без переноса). Вот только длинные строки плохо размещать на картинках)) Использование Worksheets("Transactions") вместо ActiveSheet более универсально.

Имена подключений должны совпадать с именами, которые можно увидеть в диалоговом окне Существующие подключения:

Ris. 16.7. Sushhestvuyushhie podklyucheniya

Рис. 16.7. Существующие подключения

Поскольку теперь книга включает макрос, вы не можете сохранить ее в формате XLSX. Вместо этого сохранить книгу в формате XLSM. При открытии книги пользователи получат предупреждение системы безопасности.

Обновление всех запросов

Чтобы обновить все запросы Power Query, необходимо использовать несколько иной код. Следующий макрос будет просматривать все подключения в книге и обновлять те из них, что созданы Power Query (и игнорировать остальные):

Public Sub UpdatePowerQueriesOnly()

   Dim lTest As Long, cn As WorkbookConnection

   On Error Resume Next

   For Each cn In ThisWorkbook.Connections

      lTest = InStr(1, cn.OLEDBConnection.Connection, _

         «Provider=Microsoft.Mashup.OleDb.1»)

      If Err.Number <> 0 Then

         Err.Clear

         Exit For

      End If

   If lTest > 0 Then cn.Refresh

Next cn

End Sub

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

Имейте в виду, что этот код не обязательно обновит запросы в том порядке, в котором они должны быть обновлены, так как Excel обновляет запросы в алфавитном порядке. Если порядок обновления важен, пройдите по меню в Данные –> Существующие подключения. Откроется окно Существующие подключения (см. рис. 16.7). Кликните на подключении правой кнопкой мыши –> Изменить свойства подключения. Откроется окно Свойства запроса. Последовательно измените имена запросов, например, на такие 01-Jan2008, 02-Feb2008, 03-Mar2008, 99-Transactions. Теперь запросы будут обновляться в нужном порядке.

Содержание

  1. Метод QueryTable.Refresh (Excel)
  2. Синтаксис
  3. Параметры
  4. Возвращаемое значение
  5. Примечания
  6. Поддержка и обратная связь
  7. Глава 16. Автоматизация обновления решений в Power Query
  8. Планирование обновлений без использования кода
  9. Автоматизация обновления запросов с помощью VBA
  10. Обновление нескольких запросов
  11. Как обновить запросы Power Query(и не только) в указанном порядке?

Метод QueryTable.Refresh (Excel)

Обновления диапазон внешних данных в объекте QueryTable.

Синтаксис

expression. Обновление (BackgroundQuery)

Выражение Переменная, представляющая объект QueryTable .

Параметры

Имя Обязательный или необязательный Тип данных Описание
BackgroundQuery Необязательный Variant Используется только с queryTable, основанными на результатах SQL-запроса. Значение true , чтобы вернуть управление процедурой сразу после подключения к базе данных и отправки запроса. QueryTable обновляется в фоновом режиме. Значение false , чтобы вернуть управление процедуре только после получения всех данных на лист.

Если этот аргумент не указан, параметр свойства BackgroundQuery определяет режим запроса.

Возвращаемое значение

Примечания

Следующие примечания относятся к объектам QueryTable , основанным на результатах SQL-запроса.

Метод Refresh заставляет Microsoft Excel подключаться к источнику данных объекта QueryTable , выполнять SQL-запрос и возвращать данные в диапазон, основанный на объекте QueryTable . Если этот метод не вызывается, объект QueryTable не взаимодействует с источником данных.

При подключении к источнику данных OLE DB или ODBC Microsoft Excel использует строку подключения, указанную свойством Connection . Если в указанной строке подключения отсутствуют необходимые значения, будут отображаться диалоговые окна с запросом у пользователя необходимых сведений. Если свойство DisplayAlerts имеет значение False, диалоговые окна не отображаются, а метод Refresh завершается ошибкой с исключением недостаточных сведений о подключении.

После успешного подключения Microsoft Excel сохраняет завершенную строку подключения, чтобы не отображались запросы для последующих вызовов метода Refresh во время того же сеанса редактирования. Вы можете получить завершенную строку подключения, изучив значение свойства Connection .

После подключения к базе данных выполняется проверка SQL-запроса. Если запрос недопустим, метод Refresh завершается ошибкой с исключением ошибки синтаксиса SQL.

Если запрос требует параметров, перед вызовом метода Refresh коллекция Parameters должна быть инициализирована с помощью сведений о привязке параметров. Если не достаточно параметров было привязано, метод Refresh завершается ошибкой с исключением ошибка параметра. Если для параметров задан запрос их значений, для пользователя отображаются диалоговые окна независимо от значения свойства DisplayAlerts . Если пользователь отменяет диалоговое окно параметров, метод Refresh останавливается и возвращает значение False. Если дополнительные параметры связаны с коллекцией Parameters , эти дополнительные параметры игнорируются.

Метод Refresh возвращает значение True , если запрос успешно завершен или запущен; Возвращает значение False , если пользователь отменяет подключение или диалоговое окно параметров.

Чтобы узнать, превышает ли количество извлекаемых строк количество доступных строк на листе, изучите свойство FetchedRowOverflow . Это свойство инициализируется при каждом вызове метода Refresh .

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Глава 16. Автоматизация обновления решений в Power Query

Это продолжение перевода книги Кен Пульс и Мигель Эскобар. Язык М для Power Query. Главы не являются независимыми, поэтому рекомендую читать последовательно.

По мере того, как вы создаете все больше и больше решений на основе Power Query, и начинаете понимать, сколько времени это экономит, вы захотите еще большей автоматизации. Да, вы можете просто щелкнуть правой кнопкой мыши таблицу, которая была импортирована с помощью Power Query, но даже это ощущается как… ручная операции. Нельзя ли запланировать обновление или, возможно, контролировать порядок обновления?

На самом деле вы можете использовать несколько различных методов автоматизации обновления решений Power Query:

  • Обновление при открытии книги
  • Обновление каждые Х минут
  • Обновить соединение по требованию с помощью VBA
  • Обновить все соединения по требованию с помощью VBA
  • Использовать расписание обновлений в сторонней надстройке

Рис. 16.1. Настройка параметров подключения

Скачать заметку в формате Word или pdf, примеры в формате архива

Планирование обновлений без использования кода

Первые два метода работают через пользовательский интерфейс и не требуют кода VBA. Они могут быть настроены на основе подключения, и вы даже можете автоматизировать обновление вплоть до Power Pivot. Откройте файл Automating Refresh.xlsx. Перейдите на вкладку Данные –> Запросы и подключения. В правой части окна Excel откроется область Запросы и подключения. Кликните правой кнопкой мыши имя запроса –> Свойства. Откроется окно Свойства запроса (рис. 1).

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

Следующий параметр – Обновлять каждые ХХ минут. Этот параметр очень пригодится, если вы извлекаете данные из веб-источника, который постоянно меняется, или если вы ориентируетесь на базу данных, которая регулярно обновляется. Для того, чтобы это обновление произошло книга Excel должна быть открыта. Допустимые значения для этого параметра – от 1 до 32 767.

Обновлять при открытии книги. Второй параметр в этом разделе – Удалять данные из внешнего диапазона перед сохранением книги. Установите этот флажок, если вы хотите сохранить книгу с определением запроса, но без использования внешних данных. Снимите этот флажок, чтобы сохранить, и определение запроса, и данные. Этот флажок, будет доступен только после установления флажка Обновлять при открытии книги.

Автоматизация обновления запросов с помощью VBA

Приемы, описанные выше, и не использующие макросы, обходятся без каких-либо окон, предупреждающих о безопасности. Кроме того, такие книги легче переносить в Power BI, так как они не вызывают никаких проблем с блокировкой. Однако если вы работаете исключительно в настольном экземпляре Excel, иногда может потребоваться предоставить пользователю удобный и очевидный способ обновления решений Power Query. Это может быть сделано с помощью записи кода VBA.

Можно создать макрос для обновления одного подключения Power Query. В файле Automating Refresh.xlsx и перейдите на лист Transactions. На листе расположена Таблица Transactions, а также сводная таблица. Допустим, вы хотите создать макрос для обновления их обеих. Перейдите на вкладку Разработчик. Если вы не видите вкладку Разработчик, щелкните правой кнопкой мыши любую вкладку на ленте и выберите Настроить ленту. В правом окне установите флажок рядом с вкладкой Разработчик и нажмите Ok. На вкладке Разработчик нажмите кнопку Запись макроса. Также можно нажать иконку в левом нижнем углу окна Excel:

Рис. 16.2. Кнопка Начать запись макроса

Как только вы нажмете эту кнопку, Excel начнет записывать каждый щелчок листа, каждое нажатие клавиши и… каждую ошибку, которую вы делаете. Выполните в точности следующие действия. Дайте макрос Refresh и сохраните его в текущей книге. Пройдите по меню Данные –> Запросы и подключения –> В правой части окна Excel в области Запросы и подключения кликните правой кнопкой мыши на запросе Transactions –> Обновить. Щелкните правой кнопкой мыши любую ячейку сводную таблицу –> Обновить. Повторно кликните кнопку, как на рис. 16.2. Запись макроса будет остановлена. Проверьте код. Пройдите по меню Вид –> Макросы:

Рис. 16.3. Макросы

Нажмите Изменить. Откроется окно редактора VBA

Рис. 16.4. Код VBA; чтобы увеличить изображение кликните на нем правой кнопкой мыши и выберите Открыть картинку в новой вкладке

Добавьте кнопку для обновления макроса. Перейдите на вкладку Разработчик –> Вставить –> Кнопку:

Рис. 16.5. Вставить элемент управления Кнопку

Выберите место на листе, и удерживая левую кнопку мыши, нарисуйте прямоугольник для Кнопки. Отпустите левую кнопку мыши. Появится окно с предложением поставить в соответствие Кнопке макрос. Выберите Refresh. Нажмите Ok. Щелкните правой кнопкой мыши по Кнопке –> Изменить текст. Введите Обновить. Щелкните любую ячейку на листе, чтобы выйти из режима редактирования названия кнопки.

Рис. 16.6. Кнопка, подключенная к макросу

Обновление нескольких запросов

Теперь можно добавить иные запросы в макрос. Пройдите по меню Разработчик –> Макросы –> Refresh –> Изменить. На данный момент код имеет вид (см. также рис. 16.4):

Источник

Как обновить запросы Power Query(и не только) в указанном порядке?

С выходом Power Query в массы все чаще стал появляться вопрос: как обновить запросы один за другим в заданном порядке?
Если еще не работали с этой надстройкой и не знаете что это такое, то для начала лучше ознакомиться со статьей: Power Query — что такое и почему её необходимо использовать в работе?
Описание проблемы
В книге может быть десять и более запросов. И только 4 из них надо обновлять постоянно, да еще и в заданном порядке. Например, у нас есть с десяток запросов по продажам, отгрузкам и прочей аналитике, но только 4 из них нам надо обновить. При этом обновить надо в строгой последовательности: «Запрос — Отделы», «Запрос — Сотрудники», «Заказы и Продажи», «Запрос — Бюджет» . При этом обязательно необходимо, чтобы «Запрос — Бюджет» обновился последним, т.к. он зависит от всех остальных.

Какие есть варианты решения?

Что еще может пригодиться в решении задачи:

Обновление вручную
Можно обновить запросы стандартными методами, поочередно вручную обновляя каждый запрос. Но это не всегда удобно, особенно если запросов более 5. Значит этот вариант не разбираем в деталях в принципе — все его плюсы и минусы очевидны.

Данные -Обновить все
Кнопка Данные (Data)Обновить все (Refresh All) не просто обновляет все без исключения запросы в книге, но и порядок запросов при этом никак не определить, следовательно мы не можем быть уверены в том, что обновление произошло именно в нужном нам порядке. Но все же не станем отбрасывать этот вариант как не рабочий — если проблема лишь в порядке обновления, то решение все же есть.
На самом деле, если мы имеем дело с Power Query, то правильнее всего выстраивать все взаимосвязи уже на стадии создания этих запросов в любом случае. Т.е. создавать их в правильной последовательности и «затягивать» данные в основной запрос в самую последнюю очередь, ориентируясь на результаты вспомогательных запросов. Это оптимальный вариант, т.к. в этом случае достаточно будет просто обновить нужный запрос, а Power Query сама определит какие вспомогательные запросы необходимо обновить для корректного результата. При этом встроенный механизм Power Query достаточно хорошо справляется с кешированием данных и даже если обновление происходит через кнопку Обновить все (Refresh All) , то даже если на один и тот же вспомогательный запрос будет завязано несколько других — он будет обновлен лишь один раз, а не при обновлении каждого запроса.
Но здесь у нас опять же возникает проблема — если нам не надо обновлять все запросы в книге — как Power Query узнает, какие из них надо обновлять, а какие нет? Ответ — никак. Поэтому хоть и следует всегда стараться выстраивать цепочки взаимодействий запросов в «правильном» порядке — нашу проблему с обновлением только части запросов это никак не решит. В этом случае можно создать мастер запрос, в который просто через объединение запросов собирать все нужные. И обновление этого запроса должно инициировать обновление всех указанных в нем запросов со всеми их цепочками. Как создать подобный мастер запрос:

Все, запрос готов. Теперь достаточно обновить только его, чтобы все связанные запросы обновились. Правда, есть одна проблема: если данных много, то такой запрос их увеличит вдвое — ведь мы в один запрос собираем все остальные.

Собственный порядок обновления через Visual Basic for Applications
В решении через мастер-запрос есть одна проблема — запросы могут быть не только Power Query, но и более старых версий. Здесь вариантов вообще не остается — только Visual Basic for Applications. Да и в случае, если запросы уже созданы ранее кем-то еще или навыков создать мастер-запрос нет.

‘————————————————————————————— ‘ Author : Щербаков Дмитрий(The_Prist) ‘ Профессиональная разработка приложений для MS Office любой сложности ‘ Проведение тренингов по MS Excel ‘ https://www.excel-vba.ru ‘ info@excel-vba.ru ‘ Purpose: Код обновляет поочередно указанные запросы в заданном порядке ‘————————————————————————————— Sub RefreshConnections() Dim oc, xQuery, aConnections, xConName Dim IsBG_Refresh As Boolean ‘создаем перечисление всех запросов, которые надо обновить ‘располагаем их в том порядке, в котором необходимо обновлять aConnections = Array(«Запрос — Отделы», «Запрос — Сотрудники», «Заказы и Продажи», «Запрос — Бюджет») ‘перебираем и обновляем все запросы поочередно For Each xConName In aConnections Set oc = ActiveWorkbook.Connections(xConName) Set xQuery = Nothing Select Case oc.Type Case Excel.XlConnectionType.xlConnectionTypeODBC Set xQuery = oc.ODBCConnection Case Excel.XlConnectionType.xlConnectionTypeOLEDB Set xQuery = oc.OLEDBConnection Case Else ‘запрос выгружен в таблицу на листе If oc.Ranges.Count > 0 Then Set xQuery = oc.Ranges(1).QueryTable End If End Select ‘непосредственно обновление запроса с ожиданием окончания обновления If Not xQuery Is Nothing Then ‘запоминаем значение обновления в фоне для запроса IsBG_Refresh = xQuery.BackgroundQuery ‘выставляем принудительно ждать завершения запроса xQuery.BackgroundQuery = False ‘обновляем запрос xQuery.Refresh ‘возвращаем обновление в фоне в первоначальное состояние xQuery.BackgroundQuery = IsBG_Refresh End If Next End Sub

Как использовать: Для начала надо убедиться, что разрешены макросы и при необходимости включить их: почему не работает макрос. Затем копируем код выше, из Excel переходим в редактор VBA( Alt + F11 ) —InsertModule. Вставляем туда скопированный код. Теперь код можно вызывать нажатием клавиш Alt + F8 -выделяем RefreshConnectionsВыполнить (Run) .
Чтобы использовать приведенный код для своих запросов достаточно в строке:

aConnections = Array(«Запрос — Отделы», «Запрос — Сотрудники», «Заказы и Продажи», «Запрос — Бюджет»)

внутри Array() перечислить в кавычках через запятую все имена запросов, которые необходимо обновить. Перечислять надо сразу в том порядке, в котором их требуется обновлять.
Код обновляет не только запросы Power Query, но и запросы более старых версий, выгруженных просто на лист.

Вывести список всех запросов в книге на лист
Что делать, если я не знаю, как правильно называются запросы
Да, вполне логичная ситуация, когда запросов много и переписывать имя каждого запроса не такая уж простая задача. Очень легко ошибиться в имени и тогда обновления не будет. Поэтому ниже я прилагаю код, который выводит на новый лист имена всех запросов:

Источник

Skip to content

Как обновить все связи в открытых книгах

На чтение 2 мин. Просмотров 4.2k.

Что делает макрос: Ваш excel-файл может иметь подключения к внешним источникам данных (веб-запросы, соединений MSQuery, сводные таблицы и так далее). В этих случаях было бы полезным иметь возможность автоматически обновить все связи в открытых книгах.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как работает это код
  4. Как использовать

Как макрос работает

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

Код макроса

Private Sub Workbook_Open()
'Используйте метод RefreshAll
Workbooks(ThisWorkbook.Name).RefreshAll
End Sub

Как работает это код

В данном макросе мы используем объект ThisWorkbook. Этот объект представляет собой простой и безопасный способ, чтобы указать на текущую книгу. Существует разница между Thisworkbook и ActiveWorkbook.

  • Объект ThisWorkbook ссылается на книгу, которая содержит
    код.
  • Объект ActiveWorkbook относится к книге, которая в данный момент активна.

Они часто возвращают один и тот же объект, но если рабочая книга работает с кодом из неактивной рабочей книги, они возвращают различные объекты. Если вы не хотите случайно обновлять связи в других книгах, используете ThisWorkbook.

Как использовать

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

  1. Активируйте редактор Visual Basic, нажав ALT + F11.
  2. В окне проекта, найти свой проект / имя рабочей книги и нажмите на знак плюс рядом с ней, чтобы увидеть все листы.
  3. Нажмите кнопку ThisWorkbook.
  4. Выберите Открыть событие в Event раскрывающемся списке.
  5. Введите или вставьте код во вновь созданном модуле.

Понравилась статья? Поделить с друзьями:
  • Excel vba массив удалить дубликаты
  • Excel vba массив строковый
  • Excel vba код пробела
  • Excel vba кнопка на запуск макроса
  • Excel vba клик мыши