Страницы: 1
RSS
Добавить команду по фоновому обновлению в макрос - в какую конкретно часть?, В какую часть кода вставлять команду .BackgroundQuery := False, чтобы обновление происходило последовательно и следующий этап не начинался до полного завершения обновления запроса
 
Друзья, выручайте, пожалуйста!

С макросами на Вы, поэтому прошу помощи.

1. Есть перечень запросов Power Query
2. Есть зависящие от них таблицы
3. Есть последующие вычисления

Есть макрос для обновления запросов:
Код
Sub Update_1()

    Dim Connection As WorkbookConnection
    Dim rng_Refresh As Range
    
    Set rng_Refresh = Range("Update_1[Update_1]")
    
    For Each Connection In ThisWorkbook.Connections
        If Not rng_Refresh.Find(Connection.Name) Is Nothing Then
            'MsgBox rng_Refresh.Find(Connection.Name).Address
            Connection.Refresh
                
        End If
        
    Next Connection
End Sub

Он вызывается в другом макросе командой Call и потом дальше начинают происходить действия.


Весь макрос вот такой:

Код
Sub Full()
Application.Calculation = xlCalculationAutomatic

Call Update_1
Call raschet
Call QueryDelete
Call ClaimsRename
Call Update_2

ActiveWorkbook.Sheets("Claims_Result").Range("m1:m200000").Clear  
ThisWorkbook.SaveCopyAs (ThisWorkbook.Path & "\" & Replace(ThisWorkbook.Name, ".xlsm", "_" & Format(Date, "yyyymmdd") & ".xlsm"))  

MsgBox ("Готово!") 

Call CloseDoc    

End Sub

Вопрос в следующем, понимаю, что нужно использовать команду ниже, чтобы следующие шаги после Update_1 и Update_2 дожидались завершения обновления запроса.

Код
.BackgroundQuery = False
Но куда его в этой последовательности впихнуть - ума не приложу!
Прошу помощи)
Спасибо большое заранее!
Изменено: Денис - 22.07.2022 00:21:13
 
Денис,
это пример от Дмитрий(The_Prist) Щербаков, который я себе сохранял
Код
For Each oc In ThisWorkbook.Connections        'запоминаем значение обновления в фоне для запроса
        IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery
        'выставляем принудительно ждать завершения запроса
        oc.OLEDBConnection.BackgroundQuery = False
        'обновляем запрос
        oc.Refresh
        'возвращаем обновление в фоне в первоначальное состояние
       oc.OLEDBConnection.BackgroundQuery = IsBG_Refresh
    Next
 
Цитата
написал evgeniygeo:
это пример от Дмитрий(The_Prist) Щербаков, который я себе сохранял

Его-то я и нашел :) и скакал вокруг него несколько часов, пытаясь понять, в какой конкретно части своего макроса его применить и как модифицировать под свой случай

Отчаявшись, решил писать на форум :)

Спасибо за ответ, в любом случае!
Изменено: Денис - 22.07.2022 10:19:31
 
Цитата
написал:
в какой конкретно части своего макроса его применить
ну как бэ...вроде все достаточно прозрачно и с комментариями. Не так уж вроде сложно подстроить под себя
Код
Sub Update_1() 
    Dim Connection As WorkbookConnection
    Dim rng_Refresh As Range
    Dim IsBG_Refresh as boolean
     
    Set rng_Refresh = Range("Update_1[Update_1]")
    For Each Connection In ThisWorkbook.Connections
        If Not rng_Refresh.Find(Connection.Name) Is Nothing Then
            'MsgBox rng_Refresh.Find(Connection.Name).Address
            'запоминаем значение обновления в фоне для запроса
            IsBG_Refresh = Connection.OLEDBConnection.BackgroundQuery
            'выставляем принудительно ждать завершения запроса
            Connection.OLEDBConnection.BackgroundQuery = False
            'обновляем запрос
            Connection.Refresh
             'возвращаем обновление в фоне в первоначальное состояние
             Connection.OLEDBConnection.BackgroundQuery = IsBG_Refresh
        End If
    Next Connection
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
написал Дмитрий(The_Prist) Щербаков:
ну как бэ...вроде все достаточно прозрачно и с комментариями. Не так уж вроде сложно подстроить под себя
ну как бэ...вроде все достаточно прозрачно и с комментариями. Не так уж вроде сложно подстроить под себя
Дмитрий, спасибо огромное!! Все работает идеально
Не сложно - умеючи) но я пытался до последнего, прежде чем писать сюда)

Спасибо еще раз!
Изменено: Денис - 22.07.2022 10:57:40
 
Здравствуйте, подскажите как исправить возникающую проблему.
Я использую макрос в сообщении выше
Но если в таблице формула, которая создает текст запроса
Код
="Запрос — "&Лист1!B4&Лист1!C4
то код не работает, а если просто текст - работает. Как исправить, чтобы макрос работал, когда в таблице формулы?
Изменено: Ал Пр - 29.08.2022 13:55:37
 
Цитата
Ал Пр написал:
Но если в таблице формулы
изучите параметры метода .Find - там можно указать искать по формулам или значениям. Правильнее в любом случае указывать эти параметры:
Код
If Not rng_Refresh.Find(Connection.Name,lookin:=xlvalues,lookat:=xlwhole) Is Nothing Then

lookin:=xlvalues - искать по значениям ячеек, а не по формулам
lookat:=xlwhole - просматривать значение ячейки целиком
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, спасибо за помощью
может подскажите, как игнорировать ошибки Power Query при обновлении запроса в том же коде, что выше.
Надо проигнорировать Datasource.Error

Не знаю правильно или нет, но мне помогло, если в начале кода поставить
Код
On Error Resume Next
Изменено: Ал Пр - 30.08.2022 15:57:03
Страницы: 1
Наверх