Добрый вечер, Уважаемые Знатоки! Сразу прошу прощения за вопрос, в VBA совсем слаб Проблема следующая. Ежедневно приходится обновлять данные из Внешних сводных таблиц. Тратится много времени на обновление. Хотел сделать это автоматически, но столкнулся со следующей проблемой - нехватка времени. Функции отрабатываются мгновенно, и в результате - приходится опять делать это вручную. Есть ли возможность макросом увеличить время на обновление данных? Требуется около 3-5 минут на каждое обновление. Файл прикладываю
Добрый вечер, Уважаемые Знатоки! Сразу прошу прощения за вопрос, в VBA совсем слаб Проблема следующая. Ежедневно приходится обновлять данные из Внешних сводных таблиц. Тратится много времени на обновление. Хотел сделать это автоматически, но столкнулся со следующей проблемой - нехватка времени. Функции отрабатываются мгновенно, и в результате - приходится опять делать это вручную. Есть ли возможность макросом увеличить время на обновление данных? Требуется около 3-5 минут на каждое обновление. Файл прикладываюmkotik
1. Можно отключить фоновое обновление, что заставит дождаться полного обновления, а уже потом продолжить работу приложения. через интерфейс или .BackgroundQuery = False 2. Обрабатывать событие
[vba]
Код
Dim WithEvents q As QueryTable
Private Sub q_AfterRefresh(ByVal Success As Boolean) Debug.Print "AfterRefresh", Now End Sub
Private Sub q_BeforeRefresh(Cancel As Boolean) Debug.Print "BeforeRefresh", Now End Sub
Private Sub Workbook_Open() Application.OnTime Now, Me.Name & ".Start" End Sub
Sub Start() Set q = Sheet2.QueryTables(1) End Sub
[/vba]
1. Можно отключить фоновое обновление, что заставит дождаться полного обновления, а уже потом продолжить работу приложения. через интерфейс или .BackgroundQuery = False 2. Обрабатывать событие
[vba]
Код
Dim WithEvents q As QueryTable
Private Sub q_AfterRefresh(ByVal Success As Boolean) Debug.Print "AfterRefresh", Now End Sub
Private Sub q_BeforeRefresh(Cancel As Boolean) Debug.Print "BeforeRefresh", Now End Sub
Private Sub Workbook_Open() Application.OnTime Now, Me.Name & ".Start" End Sub
забыл написать, код в модуль книги надо поместить. А строку [vba]
Код
Set q = Sheet2.QueryTables(1)
[/vba] подправить в соответвии с вашими листами и запросами. И лля проверки один раз запустить start. Потом он будет запускаться автоматом. Но честно говоря , я б пошел по пути запрета фонового обновления.
забыл написать, код в модуль книги надо поместить. А строку [vba]
Код
Set q = Sheet2.QueryTables(1)
[/vba] подправить в соответвии с вашими листами и запросами. И лля проверки один раз запустить start. Потом он будет запускаться автоматом. Но честно говоря , я б пошел по пути запрета фонового обновления.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Сообщение отредактировал bmv98rus - Воскресенье, 24.02.2019, 22:06
bmv98rus, спасибо, что Вы со мной! Простите Тупого - не выходит - опять ошибку выдает: "Invalid attribute in Sub Function" Можно ли вставить Ваш код в мой файл - туда куда нужно?
bmv98rus, спасибо, что Вы со мной! Простите Тупого - не выходит - опять ошибку выдает: "Invalid attribute in Sub Function" Можно ли вставить Ваш код в мой файл - туда куда нужно?mkotik
1. Можно отключить фоновое обновление, что заставит дождаться полного обновления, а уже потом продолжить работу приложения. через интерфейс или .BackgroundQuery = False
Почитал внимательно тут: Примечание: Невозможно запустить запрос OLAP в фоновом режиме. Первый вариант по умолчанию отключен. Пока бьюсь
1. Можно отключить фоновое обновление, что заставит дождаться полного обновления, а уже потом продолжить работу приложения. через интерфейс или .BackgroundQuery = False
Почитал внимательно тут: Примечание: Невозможно запустить запрос OLAP в фоновом режиме. Первый вариант по умолчанию отключен. Пока бьюсь mkotik
Можно отключить фоновое обновление, что заставит дождаться полного обновления, а уже потом продолжить работу приложения. через интерфейс или .BackgroundQuery = False
[vba]
Код
Sub NewMacros() For Each CON In ThisWorkbook.Connections CON.OLEDBConnection.BackgroundQuery = False 'Чтобы макрос дальше не выполнялся пока не обновится пивот. CON.Refresh Next End Sub
Можно отключить фоновое обновление, что заставит дождаться полного обновления, а уже потом продолжить работу приложения. через интерфейс или .BackgroundQuery = False
[vba]
Код
Sub NewMacros() For Each CON In ThisWorkbook.Connections CON.OLEDBConnection.BackgroundQuery = False 'Чтобы макрос дальше не выполнялся пока не обновится пивот. CON.Refresh Next End Sub
mkotik, надо смотреть свойства подключения. возможно он автоматом обновляется после обновления других подключений. В приложенном файле коннектов нет. Обсуждать нечего.
mkotik, надо смотреть свойства подключения. возможно он автоматом обновляется после обновления других подключений. В приложенном файле коннектов нет. Обсуждать нечего.boa
Доброе время суток. Может такой вариант отработает? Нет у меня подключений с долгим временем обновления. [vba]
Код
Public Sub RefreshConnections() Dim pConn As WorkbookConnection Dim refreshableConn As Object For Each pConn In ThisWorkbook.Connections Set refreshableConn = Nothing If pConn.Type = xlConnectionTypeOLEDB Then Set refreshableConn = pConn.OLEDBConnection ElseIf pConn.Type = xlConnectionTypeODBC Then Set refreshableConn = pConn.ODBCConnection End If If Not refreshableConn Is Nothing Then refreshableConn.Refresh Do While refreshableConn.Refreshing Loop End If Next End Sub
[/vba] Ну, может имеет смысл в тело Do While встроить выход по некоторому timeout.
Доброе время суток. Может такой вариант отработает? Нет у меня подключений с долгим временем обновления. [vba]
Код
Public Sub RefreshConnections() Dim pConn As WorkbookConnection Dim refreshableConn As Object For Each pConn In ThisWorkbook.Connections Set refreshableConn = Nothing If pConn.Type = xlConnectionTypeOLEDB Then Set refreshableConn = pConn.OLEDBConnection ElseIf pConn.Type = xlConnectionTypeODBC Then Set refreshableConn = pConn.ODBCConnection End If If Not refreshableConn Is Nothing Then refreshableConn.Refresh Do While refreshableConn.Refreshing Loop End If Next End Sub
[/vba] Ну, может имеет смысл в тело Do While встроить выход по некоторому timeout.anvg
anvg, спасибо, попробую Пока после долгих мучений, интересных ссылок (Тут) и помощи ZVI (Владимир, огромное ВАМ СПАСИБО!) на текущий момент пришел к следующему листингу: [vba]
Код
Sub OneMoreMacros() ' ' OneMoreMacros Макрос ' ' ' Заходим первый раз ChDir "\\fs\documents$\ArchiveDocuments\Работа" Workbooks.Open Filename:= _ "\\fs\documents$\ArchiveDocuments\Работа\DBd-DIV v.1936-1 - Copy - Copy.xlsb" ActiveWorkbook.RefreshAll ActiveWorkbook.Save ActiveWindow.Close ' Заходим второй раз Workbooks.Open Filename:= _ "\\fs\documents$\ArchiveDocuments\Работа\DBd-DIV v.1936-1 - Copy - Copy.xlsb" With ActiveWorkbook.SlicerCaches("Срез_Срезы_отчетов1") .SlicerItems("Таб1").Selected = True .SlicerItems("Таб2").Selected = False .SlicerItems("Таб3").Selected = False .SlicerItems("Таб4").Selected = False .SlicerItems("Таб5").Selected = False End With
MsgBox "Заходим Application.Wait" Application.Wait (Now + TimeValue("0:59:30")) MsgBox "Выходим Application.Wait" ActiveWorkbook.Save ActiveWindow.Close End Sub
[/vba]
Похоже, что процедура Application.Wait (Now + TimeValue("0:59:30")) ни о чём
Теперь вопрос: "Можно ли каким-либо способом сделать следующее: Открыть файл, подождать 45-50 мин и закрыть файл с сохранением?" Почему задаю такой вопрос? Открываю файл, делаю, рефреш, сохраняю и закрываю. При повторном открытии файл сам начинает обновляться. Нужно просто подождать пока он обновится - это 45-50 мин.
anvg, спасибо, попробую Пока после долгих мучений, интересных ссылок (Тут) и помощи ZVI (Владимир, огромное ВАМ СПАСИБО!) на текущий момент пришел к следующему листингу: [vba]
Код
Sub OneMoreMacros() ' ' OneMoreMacros Макрос ' ' ' Заходим первый раз ChDir "\\fs\documents$\ArchiveDocuments\Работа" Workbooks.Open Filename:= _ "\\fs\documents$\ArchiveDocuments\Работа\DBd-DIV v.1936-1 - Copy - Copy.xlsb" ActiveWorkbook.RefreshAll ActiveWorkbook.Save ActiveWindow.Close ' Заходим второй раз Workbooks.Open Filename:= _ "\\fs\documents$\ArchiveDocuments\Работа\DBd-DIV v.1936-1 - Copy - Copy.xlsb" With ActiveWorkbook.SlicerCaches("Срез_Срезы_отчетов1") .SlicerItems("Таб1").Selected = True .SlicerItems("Таб2").Selected = False .SlicerItems("Таб3").Selected = False .SlicerItems("Таб4").Selected = False .SlicerItems("Таб5").Selected = False End With
MsgBox "Заходим Application.Wait" Application.Wait (Now + TimeValue("0:59:30")) MsgBox "Выходим Application.Wait" ActiveWorkbook.Save ActiveWindow.Close End Sub
[/vba]
Похоже, что процедура Application.Wait (Now + TimeValue("0:59:30")) ни о чём
Теперь вопрос: "Можно ли каким-либо способом сделать следующее: Открыть файл, подождать 45-50 мин и закрыть файл с сохранением?" Почему задаю такой вопрос? Открываю файл, делаю, рефреш, сохраняю и закрываю. При повторном открытии файл сам начинает обновляться. Нужно просто подождать пока он обновится - это 45-50 мин.mkotik
Сообщение отредактировал mkotik - Среда, 27.02.2019, 12:18
boa, спасибо за помощь! Действительно, она не сохраняет изменения. Я ждал полного выполнения Application.OnTime Now + TimeValue("00:50:00"). Но она ничего не сделала - "заморозила" всё на 50 минут и не изменила ничего. Как только "отпустила" - пошло фоновое обновление на 48 минут. Чую, я уже близко подобрался - но пока не взял
boa, спасибо за помощь! Действительно, она не сохраняет изменения. Я ждал полного выполнения Application.OnTime Now + TimeValue("00:50:00"). Но она ничего не сделала - "заморозила" всё на 50 минут и не изменила ничего. Как только "отпустила" - пошло фоновое обновление на 48 минут. Чую, я уже близко подобрался - но пока не взял mkotik