Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Макрос берет старое, а не обновленное из внешней связи значение
 
Добрый день. Прошу мне объяснить, почему так происходит:
есть макрос, который открывает файл, обновляет его и сверяет дату по которую обновились данные из этого файла с текущей датой.
если прогоняю макрос пошагово, все получается.
но, если запускаю полностью, процесс обновления вроде как происходит (в строке состояния), но сначала выдается мой MsgBox что "данные еще не обновились", а потом уже появляется обновленная дата в ячейке I1.
Файл приложить не могу, т.к. обновление внешнее.
Буду оч благодарна за помощь.
Код
Sub SalesLinkFile()
'откроем файл-источник и сравним в нем последнюю дату обновления с текущей датой:
Dim wbMSSQL As Workbook
    Set wbMSSQL = Workbooks.Open(Filename:="\\nas\bosco_sport$\ВЫРУЧКА\MS SQL ВыручкаПоДням.xlsx")
wbMSSQL.RefreshAll

'MyDate - последняя дата обновления базы sql
Dim MyDate As Date
    MyDate = wbMSSQL.Worksheets("pivot").Range("I1").Value
If MyDate < (Date - 1) Then
    MsgBox "Данные еще не обновились по вчерашний день. Подождите. Обновление, как правило, происходит в 10:30", _
    vbInformation
    Exit Sub
End If

...
End Sub
 
Обновление происходит в фоновом режиме. Это значит, что при вызове Refresh вызывается обновление в параллельном процессе, а сам код продолжает выполнение. По идее можно вызывать обновление одной процедурой, а проверять дату другой, вызываемой по Application.OnTime с задержкой, скажем, секунд в 7-10. Т.е. обновили, подождали 7 секунд и сверили даты.
Что-то вроде этого:
Код
Dim MyDate As Date
Sub SalesLinkFile()
'откроем файл-источник и сравним в нем последнюю дату обновления с текущей датой:
    Dim wbMSSQL As Workbook
    Set wbMSSQL = Workbooks.Open(Filename:="\\nas\bosco_sport$\ВЫРУЧКА\MS SQL ВыручкаПоДням.xlsx")
    wbMSSQL.RefreshAll
    MyDate = wbMSSQL.Worksheets("pivot").Range("I1").Value
    Application.OnTime Now + TimeValue("00:00:07"), "CheckDate"
End Sub
Sub CheckDate()
    'MyDate - последняя дата обновления базы sql
    If MyDate < (Date - 1) Then
        MsgBox "Данные еще не обновились по вчерашний день. Подождите. Обновление, как правило, происходит в 10:30", _
               vbInformation
        Exit Sub
    End If
End Sub
Обращаю внимание на MyDate. Её необходимо объявить либо на уровне модуля, либо на уровне проекта. Подробнее про это можно почитать в статье: Что такое переменная и как правильно её объявить?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо!
Я так понимаю, других вариантов кроме создания двух процедур нет?
 
Можете попробовать через Application.Wait. Но он грузит процессор и не дает ничего сделать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Мне в итоге после .RefreshAll помогла строчка
Код
Application.CalculateUntilAsyncQueriesDone
и не потребовалось двух процедур
 
Тогда уточнение: данный метод доступен в версиях только начиная с 2007 Excel.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist,похоже до 2007 был не актуален, так как был несколько другой принцип загрузки внешних данных ине работало через querytable
Страницы: 1
Читают тему (гостей: 1)