Aktualizacja dwóch scalonych raportów zaciąganych z xml

0

Cześć wszystkim,

bardzo mi miło zawitać na forum. Jestem laikiem jeśli chodzi o sprawy komputerowe i dopiero zaczynam swoją przygodę, prosiłbym o wyrozumiałość...
Mam dwa raporty stworzone na podstawie wielu plików XML. Jeden jest scalony z drugim, gdzie potem wyszukuje pionowo pewne dane. Ręcznie wygląda to tak, że muszę otworzyć raport X, odświeżyć go i zamknąć, potem otworzyć raport Y, odświeżyć go - i dopiero wtedy raport Y pokaże mi to co chce.
Chciałem to trochę ułatwić używając poniższego takiego kodu.
W teorii makro działa i "niby" się odświeża, ale efekt jest taki że nic się nie odświeżyło.
Z góry dziękuję za pomoc i rady

Kopiuj
Private Sub Workbook_Open()
Dim Wkb As Workbook
Dim Wkb2 As Workbook

Set Wkb2 = Workbooks.Open(Filename:="D:\Ex\Zestawienie X.xlsx")
Workbooks("Zestawienie X.xlsx").RefreshAll
Wkb2.Close SaveChanges:=True

Set Wkb = Workbooks.Open(Filename:="D:\Ex\Zestawienie Y.xlsx")
Workbooks("Zestawienie Y.xlsx").RefreshAll
Wkb.Close SaveChanges:=True

Application.Quit
End Sub
0

Nie jestem specjalistą, ale czy nie powinno być tak:

Kopiuj

Set Wkb2 = Workbooks.Open(Filename:="D:\Ex\Zestawienie X.xlsx")
'To bym zmienił
'Workbooks("Zestawienie X.xlsx").RefreshAll
Wkb2.RefreshAll
Wkb2.Close SaveChanges:=True
0
Panczo napisał(a):

Nie jestem specjalistą, ale czy nie powinno być tak:

Kopiuj

Set Wkb2 = Workbooks.Open(Filename:="D:\Ex\Zestawienie X.xlsx")
'To bym zmienił
'Workbooks("Zestawienie X.xlsx").RefreshAll
Wkb2.RefreshAll
Wkb2.Close SaveChanges:=True

Tak, w ten sposób też makro się odpala, ale wciąż nie ma żadnej aktualizacji.

Raporty zaciągają się z plików xml rozpakowanych w PowerQuery. Przy ręcznym odświeżeniu przyciskiem "Odśwież wszystko" w zakładce "Dane", raport odświeża bazę xml i prezentuje uaktualnione wartości.

Przy zastosowaniu tego makro, widać że raporty się otwierają, widać że coś odświeża i plik się zamyka, ale dane z xml nie są odświeżone. Tak jakby nie odświeżał wszystkiego, czyli tej "kwerendy" do plików xml, tylko np. odświeżał sobie sam skoroszyt bez niczego.
Nie wiem czy to dobrze tłumaczę.

0
Panczo napisał(a):

Najprościej:

https://support.microsoft.com/pl-pl/office/szybki-start-tworzenie-makra-741130ca-080d-49f5-9471-1e5fb3d581a8

i zobaczyć co wygeneruje i porównać

To nie jest takie proste, już tego próbowałem. Rejestracja makra nie uwzględnia tego, że otwieramy nowy plik i nie otworzy sam tego pliku w celu odświeżenia.

Kopiuj
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save
    ActiveWindow.Close
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save
    ActiveWindow.Close

Zmieniłem kod na taki:

Kopiuj
Private Sub Workbook_Open()
Dim Wkb As Workbook
Dim Wkb2 As Workbook

Set Wkb2 = Workbooks.Open(Filename:="D:\Ex\Zestawienie X.xlsx")
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save
    ActiveWindow.Close

Set Wkb = Workbooks.Open(Filename:="D:\Ex\Zestawienie Y.xlsx")
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save
    ActiveWindow.Close
    
Application.Quit
End Sub

I teraz plik po otwarciu, w trakcie odświeżania kwerendy wyświetla komunikat: "
Spowoduje to anulowanie trwającego odświeżania danych. Czy kontynuować?"

Czyli makro chce zapisać zmiany i zamknąć plik, zanim odświeżanie dobiegnie do końca. Jak to uwzględnić w kodzie, aby wstrzymał się z zapisem i zamknięciem okna, aż do końca procesu odświeżania?

0

Za dokumentacja:

Remarks
Objects that have the BackgroundQuery property set to True are refreshed in the background.

https://docs.microsoft.com/pl-pl/office/vba/api/excel.workbook.refreshall

Więc jeżeli dobrze czytam te przykłady:

To musisz zmienić:

Kopiuj
Dim Wkb As Workbook
Dim Wkb2 As Workbook

Set Wkb2 = Workbooks.Open(Filename:="D:\Ex\Zestawienie X.xlsx")
    For Each cnct In ActiveWorkbook.Connections
       cnct.ODBCConnection.BackgroundQuery = False
    Next cnct    
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save
    ActiveWindow.Close

Set Wkb = Workbooks.Open(Filename:="D:\Ex\Zestawienie Y.xlsx")
    For Each cnct In ActiveWorkbook.Connections
       cnct.ODBCConnection.BackgroundQuery = False
    Next cnct    
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save
    ActiveWindow.Close
    
Application.Quit

0
Panczo napisał(a):

Za dokumentacja:

Remarks
Objects that have the BackgroundQuery property set to True are refreshed in the background.

https://docs.microsoft.com/pl-pl/office/vba/api/excel.workbook.refreshall

Więc jeżeli dobrze czytam te przykłady:

To musisz zmienić:

Kopiuj
Dim Wkb As Workbook
Dim Wkb2 As Workbook

Set Wkb2 = Workbooks.Open(Filename:="D:\Ex\Zestawienie X.xlsx")
    For Each cnct In ActiveWorkbook.Connections
       cnct.ODBCConnection.BackgroundQuery = False
    Next cnct    
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save
    ActiveWindow.Close

Set Wkb = Workbooks.Open(Filename:="D:\Ex\Zestawienie Y.xlsx")
    For Each cnct In ActiveWorkbook.Connections
       cnct.ODBCConnection.BackgroundQuery = False
    Next cnct    
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save
    ActiveWindow.Close
    
Application.Quit

Zmienione, natomiast...:
Run-time error '1004':
Application-defined or object-defined error
:(

EDIT: temat do zamknięcia. Pomogła komenda: Application.CalculateUntilAsyncQueriesDone

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.