Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Как макросом удлинить время для обновления данных из сводных - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как макросом удлинить время для обновления данных из сводных (Макросы/Sub)
Как макросом удлинить время для обновления данных из сводных
mkotik Дата: Воскресенье, 24.02.2019, 20:33 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 181
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Добрый вечер, Уважаемые Знатоки!
Сразу прошу прощения за вопрос, в VBA совсем слаб :(
Проблема следующая.
Ежедневно приходится обновлять данные из Внешних сводных таблиц.
Тратится много времени на обновление.
Хотел сделать это автоматически, но столкнулся со следующей проблемой - нехватка времени.
Функции отрабатываются мгновенно, и в результате - приходится опять делать это вручную.
Есть ли возможность макросом увеличить время на обновление данных? Требуется около 3-5 минут на каждое обновление.
Файл прикладываю
К сообщению приложен файл: _DBd.xlsm (15.2 Kb)
 
Ответить
СообщениеДобрый вечер, Уважаемые Знатоки!
Сразу прошу прощения за вопрос, в VBA совсем слаб :(
Проблема следующая.
Ежедневно приходится обновлять данные из Внешних сводных таблиц.
Тратится много времени на обновление.
Хотел сделать это автоматически, но столкнулся со следующей проблемой - нехватка времени.
Функции отрабатываются мгновенно, и в результате - приходится опять делать это вручную.
Есть ли возможность макросом увеличить время на обновление данных? Требуется около 3-5 минут на каждое обновление.
Файл прикладываю

Автор - mkotik
Дата добавления - 24.02.2019 в 20:33
bmv98rus Дата: Воскресенье, 24.02.2019, 21:01 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
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]


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
Сообщение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]

Автор - bmv98rus
Дата добавления - 24.02.2019 в 21:01
mkotik Дата: Воскресенье, 24.02.2019, 21:02 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 181
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
bmv98rus, спасибо за оперативность - попробую!
 
Ответить
Сообщениеbmv98rus, спасибо за оперативность - попробую!

Автор - mkotik
Дата добавления - 24.02.2019 в 21:02
mkotik Дата: Воскресенье, 24.02.2019, 21:58 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 181
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Dim WithEvents q As QueryTable

Сорри, но ругается: "Syntax error"
 
Ответить
Сообщение
Dim WithEvents q As QueryTable

Сорри, но ругается: "Syntax error"

Автор - mkotik
Дата добавления - 24.02.2019 в 21:58
bmv98rus Дата: Воскресенье, 24.02.2019, 22:06 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
забыл написать, код в модуль книги надо поместить. А строку
[vba]
Код
Set q = Sheet2.QueryTables(1)
[/vba] подправить в соответвии с вашими листами и запросами.
И лля проверки один раз запустить start. Потом он будет запускаться автоматом. Но честно говоря , я б пошел по пути запрета фонового обновления.


Замечательный Временно просто медведь , процентов на 20.

Сообщение отредактировал bmv98rus - Воскресенье, 24.02.2019, 22:06
 
Ответить
Сообщениезабыл написать, код в модуль книги надо поместить. А строку
[vba]
Код
Set q = Sheet2.QueryTables(1)
[/vba] подправить в соответвии с вашими листами и запросами.
И лля проверки один раз запустить start. Потом он будет запускаться автоматом. Но честно говоря , я б пошел по пути запрета фонового обновления.

Автор - bmv98rus
Дата добавления - 24.02.2019 в 22:06
mkotik Дата: Воскресенье, 24.02.2019, 22:17 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 181
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
bmv98rus, спасибо, что Вы со мной!
Простите Тупого - не выходит - опять ошибку выдает: "Invalid attribute in Sub Function"
Можно ли вставить Ваш код в мой файл - туда куда нужно?
 
Ответить
Сообщениеbmv98rus, спасибо, что Вы со мной!
Простите Тупого - не выходит - опять ошибку выдает: "Invalid attribute in Sub Function"
Можно ли вставить Ваш код в мой файл - туда куда нужно?

Автор - mkotik
Дата добавления - 24.02.2019 в 22:17
bmv98rus Дата: Воскресенье, 24.02.2019, 22:29 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
mkotik, Упс, похоже я погорячился, У вас запросы в другом файле и вариант 2 не сработает.


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
Сообщениеmkotik, Упс, похоже я погорячился, У вас запросы в другом файле и вариант 2 не сработает.

Автор - bmv98rus
Дата добавления - 24.02.2019 в 22:29
mkotik Дата: Понедельник, 25.02.2019, 01:08 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 181
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Кратко можно сформулировать вопрос следующим образом: как правильно макросом добиться окончательного обновления фонового запроса excel
 
Ответить
СообщениеКратко можно сформулировать вопрос следующим образом: как правильно макросом добиться окончательного обновления фонового запроса excel

Автор - mkotik
Дата добавления - 25.02.2019 в 01:08
bmv98rus Дата: Понедельник, 25.02.2019, 08:00 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4107
Репутация: 768 ±
Замечаний: 0% ±

Excel 2013/2016
обсуждали вопрос очень похожий тут но так и не решили.


Замечательный Временно просто медведь , процентов на 20.
 
Ответить
Сообщениеобсуждали вопрос очень похожий тут но так и не решили.

Автор - bmv98rus
Дата добавления - 25.02.2019 в 08:00
mkotik Дата: Понедельник, 25.02.2019, 08:47 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 181
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
bmv98rus, спасибо за подсказку, будем думать :)
 
Ответить
Сообщениеbmv98rus, спасибо за подсказку, будем думать :)

Автор - mkotik
Дата добавления - 25.02.2019 в 08:47
mkotik Дата: Понедельник, 25.02.2019, 17:10 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 181
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
1. Можно отключить фоновое обновление, что заставит дождаться полного обновления, а уже потом продолжить работу приложения. через интерфейс или .BackgroundQuery = False

Почитал внимательно тут:
Примечание: Невозможно запустить запрос OLAP в фоновом режиме.
Первый вариант по умолчанию отключен.
Пока бьюсь :(
 
Ответить
Сообщение
1. Можно отключить фоновое обновление, что заставит дождаться полного обновления, а уже потом продолжить работу приложения. через интерфейс или .BackgroundQuery = False

Почитал внимательно тут:
Примечание: Невозможно запустить запрос OLAP в фоновом режиме.
Первый вариант по умолчанию отключен.
Пока бьюсь :(

Автор - mkotik
Дата добавления - 25.02.2019 в 17:10
boa Дата: Понедельник, 25.02.2019, 17:42 | Сообщение № 12
Группа: Друзья
Ранг: Ветеран
Сообщений: 550
Репутация: 167 ±
Замечаний: 0% ±

365
mkotik,
Можно отключить фоновое обновление, что заставит дождаться полного обновления, а уже потом продолжить работу приложения. через интерфейс или .BackgroundQuery = False

[vba]
Код
Sub NewMacros()
     For Each CON In ThisWorkbook.Connections
        CON.OLEDBConnection.BackgroundQuery = False 'Чтобы макрос дальше не выполнялся пока не обновится пивот.
        CON.Refresh
    Next
End Sub
[/vba]
или снять галочку
К сообщению приложен файл: 5740620.jpg (35.2 Kb)




Сообщение отредактировал boa - Понедельник, 25.02.2019, 17:46
 
Ответить
Сообщениеmkotik,
Можно отключить фоновое обновление, что заставит дождаться полного обновления, а уже потом продолжить работу приложения. через интерфейс или .BackgroundQuery = False

[vba]
Код
Sub NewMacros()
     For Each CON In ThisWorkbook.Connections
        CON.OLEDBConnection.BackgroundQuery = False 'Чтобы макрос дальше не выполнялся пока не обновится пивот.
        CON.Refresh
    Next
End Sub
[/vba]
или снять галочку

Автор - boa
Дата добавления - 25.02.2019 в 17:42
mkotik Дата: Вторник, 26.02.2019, 00:41 | Сообщение № 13
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 181
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
boa, спасибо за подсказку.
По первому:
Property OLEDBConnection As OLEDBConnection
read-only
Member of Excel.WorkbookConnection

По второму: Картинка


Сообщение отредактировал mkotik - Вторник, 26.02.2019, 01:10
 
Ответить
Сообщениеboa, спасибо за подсказку.
По первому:
Property OLEDBConnection As OLEDBConnection
read-only
Member of Excel.WorkbookConnection

По второму: Картинка

Автор - mkotik
Дата добавления - 26.02.2019 в 00:41
boa Дата: Вторник, 26.02.2019, 23:43 | Сообщение № 14
Группа: Друзья
Ранг: Ветеран
Сообщений: 550
Репутация: 167 ±
Замечаний: 0% ±

365
mkotik, надо смотреть свойства подключения.
возможно он автоматом обновляется после обновления других подключений.
В приложенном файле коннектов нет. Обсуждать нечего.


 
Ответить
Сообщениеmkotik, надо смотреть свойства подключения.
возможно он автоматом обновляется после обновления других подключений.
В приложенном файле коннектов нет. Обсуждать нечего.

Автор - boa
Дата добавления - 26.02.2019 в 23:43
anvg Дата: Среда, 27.02.2019, 10:06 | Сообщение № 15
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе время суток.
Может такой вариант отработает? Нет у меня подключений с долгим временем обновления.
[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
Дата добавления - 27.02.2019 в 10:06
mkotik Дата: Среда, 27.02.2019, 12:05 | Сообщение № 16
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 181
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
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 - Среда, 27.02.2019, 12:18
 
Ответить
Сообщение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
Дата добавления - 27.02.2019 в 12:05
boa Дата: Среда, 27.02.2019, 12:28 | Сообщение № 17
Группа: Друзья
Ранг: Ветеран
Сообщений: 550
Репутация: 167 ±
Замечаний: 0% ±

365
mkotik,
В модуль книги
[vba]
Код
Private Sub Workbook_Open()
'    ...
'    ...
    Application.OnTime Now + TimeValue("00:50:00"), "CloseBook"
End Sub

Sub CloseBook()
    ThisWorkbook.Close SaveChanges:=True
End Sub
[/vba]


 
Ответить
Сообщениеmkotik,
В модуль книги
[vba]
Код
Private Sub Workbook_Open()
'    ...
'    ...
    Application.OnTime Now + TimeValue("00:50:00"), "CloseBook"
End Sub

Sub CloseBook()
    ThisWorkbook.Close SaveChanges:=True
End Sub
[/vba]

Автор - boa
Дата добавления - 27.02.2019 в 12:28
mkotik Дата: Среда, 27.02.2019, 12:34 | Сообщение № 18
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 181
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
boa, спасибо за помощь!
Действительно, она не сохраняет изменения.
Я ждал полного выполнения Application.OnTime Now + TimeValue("00:50:00").
Но она ничего не сделала - "заморозила" всё на 50 минут и не изменила ничего.
Как только "отпустила" - пошло фоновое обновление на 48 минут.
Чую, я уже близко подобрался :) - но пока не взял :)
 
Ответить
Сообщениеboa, спасибо за помощь!
Действительно, она не сохраняет изменения.
Я ждал полного выполнения Application.OnTime Now + TimeValue("00:50:00").
Но она ничего не сделала - "заморозила" всё на 50 минут и не изменила ничего.
Как только "отпустила" - пошло фоновое обновление на 48 минут.
Чую, я уже близко подобрался :) - но пока не взял :)

Автор - mkotik
Дата добавления - 27.02.2019 в 12:34
boa Дата: Среда, 27.02.2019, 12:38 | Сообщение № 19
Группа: Друзья
Ранг: Ветеран
Сообщений: 550
Репутация: 167 ±
Замечаний: 0% ±

365
mkotik,
вы не перепутали Application.Wait и Application.OnTime?


 
Ответить
Сообщениеmkotik,
вы не перепутали Application.Wait и Application.OnTime?

Автор - boa
Дата добавления - 27.02.2019 в 12:38
mkotik Дата: Среда, 27.02.2019, 12:42 | Сообщение № 20
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 181
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
boa, сорри, уже голова забилась :)
 
Ответить
Сообщениеboa, сорри, уже голова забилась :)

Автор - mkotik
Дата добавления - 27.02.2019 в 12:42
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как макросом удлинить время для обновления данных из сводных (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!