Страницы: 1
RSS
Выполнить код после обновления запросов PQ
 
Всем привет!
Есть макрос, который запускает сначала обновление запросов в PQ, а потом делает рассылку на почту, но вот проблема в том что обновление не успевает выполниться или возможно нужно сохранить файл перед рассылкой
Код
Private Sub Workbook_Open()
' При открытии книги на листе Лог прописывается ФИО пользователя
    Worksheets("Лог").Cells(lastrow + 2, 5) = Environ("USERNAME")
    
 'Макрос вставляет формулу и тем самым дает активную ячейку, для проверки условия, макроса на листе Лог
    Sheets("Лог").Select
    Range("F2").Select
    ActiveCell.FormulaR1C1 = "=IF(RC[-1]=""PupkinVasia"",TRUE,FALSE)"
    
End Sub

Далее лист лог, на нем если условия выполнены, то срабатывают обновление и рассылка
Код
' Проверка если F2=ИСТИНА,выполняются макросы, сам макрос срабатывает от активизации макросом в модуле ЭтаКнига
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("F2")) Is Nothing Then
   If Target = True Then
     
    'Запускаем макрос обновления
    Call Обновление
    'Запускаем макрос рассылки
    If Format(Now, "hh:mm") > "21:00" Then Рассылка
    
   End If
 End If
End Sub
Код
Sub Обновление()

        ActiveWorkbook.RefreshAll
   
End Sub

Код
Sub Рассылка()

Dim objOutlookApp As Object, objMail As Object
    Dim lr As Long, lLastR As Long

    Application.ScreenUpdating = False
    On Error Resume Next
    Set objOutlookApp = CreateObject("Outlook.Application")
    If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
    objOutlookApp.Session.Logon

    lLastR = Cells(Rows.Count, 1).End(xlUp).Row 'определяем последнюю заполненную ячейку в столбце А
    'цикл от второй строки(начало данных с адресами) до последней ячейки таблицы
    For lr = 2 To lLastR
        Set objMail = objOutlookApp.CreateItem(0)   'создаем новое сообщение
        'создаем сообщение
        With objMail
            .To = Cells(lr, 1).Value 'адрес получателя
            .Subject = Cells(lr, 2).Value 'тема сообщения
            .Body = Cells(lr, 3).Value 'текст сообщения
            .Attachments.Add Cells(lr, 4).Value
            .Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
        End With
    Next lr

    Set objOutlookApp = Nothing: Set objMail = Nothing
    Application.ScreenUpdating = True
End Sub
 
adamm, Доброго дня, не особо шарю но мб поможет.

Код
Call Обновление
Application.Wait Time:=Now + TimeSerial(0, 0, 10) 'задержит выполнение Вашего макроса на 10 секунд.
If Format(Now, "hh:mm") > "21:00" Then Рассылка


Возможно надо воткнуть не в этом месте, не особо вникал в код :D
Изменено: Wild.Godlike - 24.06.2020 10:05:52
 
Цитата
adamm написал:
ActiveWorkbook.RefreshAll
этот метод обновляет запросы НЕ В ФОНОВОМ РЕЖИМЕ, а в синхронном. Т.е. у Вас обновление идет параллельно с продолжением выполнения кода. Надо обновлять все запросы по очереди, принудительно задавая свойство BackgroundQuery = False.
Тема эта уже поднималась, можно найти поиском.
В этой статье есть практически готовый код обновления всех запросов: Собрать данные из защищенных паролем файлов - PowerQuery
Кусок обновления запросов в процедуре Sub RefreshPQ():
Код
For Each oc In ThisWorkbook.Connections
        'запоминаем значение обновления в фоне для запроса
        IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery
        'выставляем принудительно ждать завершения запроса
        oc.OLEDBConnection.BackgroundQuery = False
        'обновляем запрос
        oc.Refresh
        'возвращаем обновление в фоне в первоначальное состояние
        oc.OLEDBConnection.BackgroundQuery = IsBG_Refresh
    Next
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Добрый день. М.б. вот это поможет?
https://docs.microsoft.com/ru-ru/office/vba/language/reference/user-interface-help/doevents-function
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Код
Sub Макрос5
  Макрос4
  Макрос1
  Макрос3
  Макрос2
End Sub
Макросе5 задает последовательность выполнения макросов 1,2,3,4
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Михаил Лебедев,  нет, это не поможет. Тут надо отслеживать именно завершение запроса, а он выгружает порциями данные на лист. Уже обсуждали это и самый оптимальный вариант это последовательно обновлять каждый запрос не в фоне.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Ігор Гончаренко, только хотел так ответить, но вы опередили  :D
По-моему, этот ответ 100% по названию темы
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
этот ответ 100% по названию темы
Привет, Алексей.
А стоит ли заглядывать в темы этого ТС, учитывая количество постов? Мне так кажется, что такая манера постановки вопросов уже не излечима. Megamen2 и Красноглазый Пиркаф не дадут соврать.
Изменено: Андрей VG - 24.06.2020 16:29:49
 
Андрей VG, привет))
Цитата
Андрей VG: стоит ли заглядывать
"обещать", как говориться, не значит "жениться"  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Да согласен тему стоило назвать немного по другому, например "выполнить код после обновления запросов PQ", да и прошу прощения, за несвоевременный ответ. Всем спасибо!
Цитата
Андрей VG написал:
Мне так кажется, что такая манера постановки вопросов уже не излечима.
Работаю над собой, не оправдываюсь, но честно на работе голова почти всегда квадратная
Цитата
Дмитрий(The_Prist) Щербаков написал:
В этой статье есть практически готовый код
Обязательно почитаю! Спасибо!
Все получилось!
Изменено: adamm - 25.06.2020 12:48:30
 
Всем привет!
В продолжение темы, решил загнать данный файл, с кодом от Дмитрия, в планировщик задач начала выпадать ошибка, то есть запускаю в ручном режиме все работает, через планировщик не хочет, в чем может быть проблема?
 
файл то успевает открытся?)
 
да файл открывается, но сразу выпадает ошибка
 
adamm,  Конечно это не относится к теме. Нужно смотреть что в планировщике. Что запускаете, под какой учеткой?
По вопросам из тем форума, личку не читаю.
 
Создать новую тему?
Ранее при простом обновлении, через планировщик все работало, но была одна строчка "oc.Refresh", тупо обновить все.
Прочитал статью Дмитрия, почитал про свойства объекта "oc.OLEDBConnection.BackgroundQuery", не совсем конечно разобрался, но думаю, что не коннект происходит в строчках:
Код
'запоминаем значение обновления в фоне для запроса        
IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery
'выставляем принудительно ждать завершения запроса
oc.OLEDBConnection.BackgroundQuery = False
Изменено: adamm - 03.07.2020 09:54:27
Страницы: 1
Наверх