Страницы: 1
RSS
Обновленный через VBA запрос с предупреждением "Загрузка не была завершена"
 
Добрый день!
Прошу подсказать, имеется часть кода (обновление запроса Powert Query):

Код
With ThisWorkbook.Connections("Запрос — Слияние1").OLEDBConnection 
.BackgroundQuery = False
.Refresh
End With

Проблема в том, что в конце общего кода, должна срабатывать защита книги и в этом случае Запрос - Слияние1 выдает предупреждение "Загрузка не была завершена", таблица источником данных которой является запрос - также не обновляется.

Если защиту книги не ставить - все обновляется. Если проходить код построчно в редакторе все также работает.

Есть предположение, что запрос не успевает обновиться до срабатывания защиты, хотя я, видимо ошибочно, думал, что .BackgroundQuery = False должно помочь избежать этого.

Прошу помочь в решении проблемы обновления запроса с защитой книги.

Заранее благодарен.

 
Код
With ThisWorkbook.Connections("Запрос — Слияние1").OLEDBConnection 
  .BackgroundQuery = False
  .Refresh
  do while .Refreshing
    doevents
  loop
End With
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, к сожалению результат не изменился
 
Привет!
Цитата
Тимур написал:
Если проходить код построчно в редакторе все также работает.
пробовали поставить задержку
Код
Application.Wait Time:=Now + TimeSerial(0, 0, 5)

перед
Код
With ThisWorkbook.Connections("Запрос — Слияние1").OLEDBConnection 

?
Сравнение прайсов, таблиц - без настроек
 
Inexsu, пробовал перед, после, внутри With  :)  Итог тот же... Без остановки в режиме отладки - не работает, либо не включать защиту книги, что по условиям - недопустимо.
 
Цитата
Тимур написал:
имеется часть кода
можете весь код приложить?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код
Private Sub Workbook_Open()
'обновление запросов из хранилища
On Error Resume Next

Application.ScreenUpdating = False
ActiveWorkbook.Unprotect Password:="ae,l"

Sheets("Auto_model").Visible = True
Sheets("Auto_model_ListDocId").Visible = True
Sheets("Вспомогательный").Visible = True
 
With ThisWorkbook.Connections("Запрос — PriceF_Spr").OLEDBConnection
.BackgroundQuery = False
.Refresh
'Do While .Refreshing
    'DoEvents
'Loop
End With

''''''''''''''''''''''''''''
Application.Wait Time:=Now + TimeSerial(0, 0, 5)
With ThisWorkbook.Connections("Запрос — Слияние1").OLEDBConnection
.BackgroundQuery = False
.Refresh
 Do While .Refreshing
    DoEvents
  Loop
End With

'''''''''''''''''''''''''''''
With ThisWorkbook.Connections("Запрос — Auto_model_ListDocId").OLEDBConnection
.BackgroundQuery = False
.Refresh

End With


ActiveWorkbook.Save

Sheets("Auto_model").Visible = False
Sheets("Auto_model_ListDocId").Visible = False
Sheets("Вспомогательный").Visible = False
   
ActiveWorkbook.Protect Password:="ae,l"
ThisWorkbook.Worksheets("(СЗ)").Activate
Application.ScreenUpdating = True
End Sub
 
А у Вас запросы в той же книге, которую защищаете или в другой? Код выглядит так, как будто в другой.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, в той же книге, источник данных запросов в хранилище
 
Цитата
Тимур написал:
в той же книге
как странно тогда записан код...То ActiveWorkbook, то ThisWorkbook...Да еще все это на событии Open. Возможно, книга просто открыться до конца не успевает, а Вы её уже обновляете. Попробуйте так:
Код
Private Sub Workbook_Open()
    Application.OnTime Now, Me.CodeName & ".RefreshQueries"
End Sub
Sub RefreshQueries()
    'обновление запросов из хранилища
    On Error Resume Next
     
    Application.ScreenUpdating = False
    ThisWorkbook.Unprotect Password:="ae,l"
     
    ThisWorkbook.Sheets("Auto_model").Visible = True
    ThisWorkbook.Sheets("Auto_model_ListDocId").Visible = True
    ThisWorkbook.Sheets("Вспомогательный").Visible = True
      
    With ThisWorkbook.Connections("Запрос — PriceF_Spr").OLEDBConnection
    .BackgroundQuery = False
    .Refresh
    End With
     
    ''''''''''''''''''''''''''''
    Application.Wait Time:=Now + TimeSerial(0, 0, 5)
    With ThisWorkbook.Connections("Запрос — Слияние1").OLEDBConnection
    .BackgroundQuery = False
    .Refresh
    End With
     
    '''''''''''''''''''''''''''''
    With ThisWorkbook.Connections("Запрос — Auto_model_ListDocId").OLEDBConnection
    .BackgroundQuery = False
    .Refresh
    End With
     
     
    ThisWorkbook.Save
     
    ThisWorkbook.Sheets("Auto_model").Visible = False
    ThisWorkbook.Sheets("Auto_model_ListDocId").Visible = False
    ThisWorkbook.Sheets("Вспомогательный").Visible = False
        
    ThisWorkbook.Protect Password:="ae,l"
    ThisWorkbook.Worksheets("(СЗ)").Activate
    Application.ScreenUpdating = True
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Альтернатива - использовать событие Application.AfterCalculate
Владимир
 
Дмитрий(The_Prist) Щербаков, результат не изменился "Загрузка не была завершена"

sokol92, был бы признателен за пример, что-то не нахожу такого события (Excel 2016)
 
Должно быть (в модуль книги).
Код
Option Explicit
Dim WithEvents App As Application

Private Sub App_AfterCalculate()
  MsgBox "AfterCalculate"
End Sub

Private Sub Workbook_Open()
  Set App = Application
End Sub
Можно проверить работоспособность, введя в любую ячейку любую формулу.

Вы можете последнее обновление источников данных запустить аcинхронно, сразу после этого присвоить App, в обработке события App_AfterCalculate:
Код
Set App=Nothing
и далее действия по сохранению и защите книги.
Изменено: sokol92 - 09.03.2021 15:10:37
Владимир
 
А ошибки никакие не появляются, проверяли? Может убрать обработчик On Error Resume Next и посмотреть?
И как вариант можно еще так разбить процедуру:
Код
Private Sub Workbook_Open()
    'обновление запросов из хранилища
    Application.ScreenUpdating = False
    ThisWorkbook.Unprotect Password:="ae,l"
    DoEvents
    ThisWorkbook.Sheets("Auto_model").Visible = True
    ThisWorkbook.Sheets("Auto_model_ListDocId").Visible = True
    ThisWorkbook.Sheets("Вспомогательный").Visible = True
    DoEvents
    
    With ThisWorkbook.Connections("Запрос — PriceF_Spr").OLEDBConnection
        .BackgroundQuery = False
        .Refresh
    End With
    With ThisWorkbook.Connections("Запрос — Слияние1").OLEDBConnection
        .BackgroundQuery = False
        .Refresh
    End With
    With ThisWorkbook.Connections("Запрос — Auto_model_ListDocId").OLEDBConnection
        .BackgroundQuery = False
        .Refresh
    End With
    Application.OnTime Now + TimeSerial(0, 0, 5), Me.CodeName & ".SaveMe"
End Sub
Sub SaveMe()
    ThisWorkbook.Save
    ThisWorkbook.Sheets("Auto_model").Visible = False
    ThisWorkbook.Sheets("Auto_model_ListDocId").Visible = False
    ThisWorkbook.Sheets("Вспомогательный").Visible = False
        
    ThisWorkbook.Protect Password:="ae,l"
    ThisWorkbook.Worksheets("(СЗ)").Activate
    Application.ScreenUpdating = True
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, On Error Resume Next убирал, никаких ошибок не выявлялось, код работал также. Ваш вариант РАБОТАЕТ, благодарю!!!

Можно последний вопрос :) ? Почему периодически, после отработки кода ниже, лист Auto_model_ListDocId, становится видимым, хотя изначально он скрыт и нигде в коде он не открывается. Это проявляется через раз.
Код
Private Sub Workbook_Open()'обновление данных из хранилища
    Application.ScreenUpdating = False
    ThisWorkbook.Unprotect Password:="ae,l"
    DoEvents
     
    With ThisWorkbook.Connections("Запрос — PriceF_Spr").OLEDBConnection
        .BackgroundQuery = False
        .Refresh
    End With
    With ThisWorkbook.Connections("Запрос — Слияние1").OLEDBConnection
        .BackgroundQuery = False
        .Refresh
    End With
    With ThisWorkbook.Connections("Запрос — Auto_model_ListDocId").OLEDBConnection
        .BackgroundQuery = False
        .Refresh
    End With
    Application.OnTime Now + TimeSerial(0, 0, 5), Me.CodeName & ".SaveMe"
End Sub
Sub SaveMe()
    ThisWorkbook.Save
    ThisWorkbook.Protect Password:="ae,l"
    ThisWorkbook.Worksheets("(СЗ)").Activate
    Application.ScreenUpdating = True
    MsgBox ("Данные модели обновлены")
End Sub
 
А вы добавьте строку
Код
ThisWorkbook.Sheets("Auto_model_ListDocId").Visible = False

перед строкой
Код
Application.ScreenUpdating = True

в процедуре SaveMe
 
добавлял, ошибка 400. Хотелось бы понять, каким образом скрытый лист становится открытым, не имея для того каких-либо оснований и почему это происходит не каждый раз при открытии файла?

P.S.
Ошибка 400 из-за того, что ThisWorkbook.Sheets("Auto_model_ListDocId").Visible = False нужно поставить не перед строкой Application.ScreenUpdating = True, а перед строкой защиты книги. Собственно, поставив  скрытие листа "Auto_model_ListDocId" в процедуру после обновления одноименного запроса, проблема с периодически открытым листом была снята. Хоть природа сего явления так и осталась загадкой  
Страницы: 1
Наверх