Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1952to1956
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

.QueryTables.Refresh Backgroundquery:=True, keine Werte

.QueryTables.Refresh Backgroundquery:=True, keine Werte
24.11.2023 15:52:49
Philipp Broxtermann
Liebes Forum,

ich möchte eine PowerQuery in ein Tabellenblatt laden.
Das entstandene QueryTable besteht aus einer Ergebniszeile.
Diese will ich kopieren und in eine andere Zeile kopieren.

Mit
QueryTables.Refresh Backgroundquery := false
funktioiniert es. Leider kann man dabei Excel nicht bedienen.

Wenn ich
QueryTables.Refresh Backgroundquery:=true setze und eine Schleife baue, die für eine Zeitlang läuft, damit die Abfrage im Hintergrund aktualisieren kann, kann ich zwar Excel bedienen, aber die QueryTable zeigt keine Werte an, auch wenn die PowerQuery Aktualisierung abgeschlossen wurde.
Daher wird nichts mehr kopiert. Stoppe ich dann den Code, werden die Ergebnisse plötzlich angezeigt.
Ich habe schon Dinge probiert wie
Application.ScreenUpdating = True
oder
ActiveSheets.Calculate
Ohne Erfolg.

Hat jemand eine Idee, wie QueryTables im Hintergrund aktualisiert und trotzdem die Werte auch im Sheet angezeigt werden, ohne das Makro zu stoppen?

Viele Grüße

Philipp

Code:

'Erstellt eine kombinierte PowerQuery aus vorher per VBA erstellen Einzelqueries

ActiveWorkbook.Queries.Add Name:="Anfügen", Formula:= _
"let" & Chr(13) & "" & Chr(10) & " Quelle = Table.Combine({ " & Queries & "})," & Chr(13) & "" & Chr(10) & " #""Transponierte Tabelle"" = Table.Transpose(Quelle)" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " #""Transponierte Tabelle"""


With ActiveWorkbook.Sheets(1).ListObjects.Add(SourceType:=0, Source:= _
"OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=Anfügen;Extended Properties=""""" _
, Destination:=Range("$V$1")).QueryTable
.CommandType = xlCmdSql
.CommandText = Array("SELECT * FROM [Anfügen]")
.RowNumbers = 0
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
'.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Anfügen"
.Refresh BackgroundQuery:=True

End With

WaitTime = Now() + TimeValue("00:00:20") 'Schleife soll dem QueryTable Zeit zur Aktualisierung im Hintergrund geben
Do While Now() WaitTime
Application.ScreenUpdating = False
DoEvents
Loop

ActiveWorkbook.Sheets(1).Range("V3:AH3").Select 'Selektiert die Ergebniszeile des QueryTables auf dem Arbeitsblatt.
Selection.Copy
ActiveWorkbook.Sheets(1).Cells(row, 22).Select 'kopiert die Ergebniszeile in eine andere Zeile.
ActiveWorkbook.Sheets(1).Paste
ActiveWorkbook.Sheets(1).Cells(row, 19) = Now

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: .QueryTables.Refresh Backgroundquery:=True, keine Werte
25.11.2023 09:34:06
Luschi
Hallo Philipp,

ich habe mal den Makrorecorder angeworfen und dann_
- Register Daten - Alle aktualisieren geklickt
- und aufgezeichnet wurde: ActiveWorkbook.RefreshAll
- dann Daten - Abfragen und Verbindungen
- im rechts erscheinenden Fenster 'Abfragen und Verbindungen'
- eine Abfrage mit rechter Maustaste angeklickt und 'Aktualisieren' gestartet
- aufgezeichnet wurde: ActiveWorkbook.Connections("Abfrage - tab_Daten (2)").Refresh
- die Abfrage im rechten Fenster nennt sich: 'tab_Daten (2)'
- 'Abfrage - ' wird vom Recorder davor gesetzt
- hast Du eine engl. sprachige Version, dann nennt sich das sicher 'Query - ' (wer weiß!)

Gruß von Luschi
aus klein-Paris
Anzeige
AW: .QueryTables.Refresh Backgroundquery:=True, keine Werte
26.11.2023 10:02:45
Philipp Broxtermann
Hallo Luschi,

vielen Dank für Deine Antwort!
Ich habe die Vorschläge ausprobiert. Ich habe auch versucht das QueryTable Objekt mit .ListObject.QueryTable.Refresh BackgroundQuery:=False (eigentlich der gleiche Befehl wie im Ursprünglichen Code, aber das wurde mir beim Makro Aufzeichnen ausgespuckt) zu refreshen.
Bei ActiveWorkbook.RefreshAll werden alle Abfragen aktualisiert und auch die QueryTable, die mit der zusammengefügten Abfrage verknüpft ist.
Aber auch hier werden die Werte erst angezeigt, wenn das Makro gestoppt wird.
Bei connections.Refresh wird das QueryTable Objekt nicht aktualisert. Ich nehme an, weil in der PowerQuery die Daten ja schon vorhanden sind.

Du hast im Code vllt gesehen, dass ich eine Variable "row" hab.
Das bedeutet, dass ich das Makro über viele Zeilen laufen lasse über eine While-Schleife. Dadurch werden aus Parametern in der Zeile row jedes Mal die PowerQuery zum Abrufen von Daten neu erstellt.

Nach Verknüpfung der PowerQuery mit dem Excel Sheet als QueryTable werden dann aber die Werte nicht angezeigt (obwohl die Abfrage aktualisiert ist) und von der PowerQuery Ergebniszeile "V3:AH3" in die Zeile "row" kopiert, da die Zellen mit den Ergebnissen der QueryTable Zeile "V3:AH3" leer bleiben. Das Makro läuft weiter und zählt die Reihen hoch.
Nur wenn Refresh backroundquery:=False ist, werden die Werte im Worksheet angezeigt und kopiert oder wenn ich das Makro anhalte. Dann kann man aber Excel für die Zeit in der das Makro durchläuft nicht mehr nutzen und gucken. Da die Aktualisierung sehr lang dauert, kann man also keine Änderungen sehen.

Mir fällt da noch ein, dass Ich auch probiert habe, die QueryTable in einer eigenen Prozedur zu updaten und diese innerhalb einer Prozedur aufzurufen, die dann die Zeilen kopiert. Das hat auch nicht funktioniert. Es geligt mir nicht die QueryTable im Hintergrund zu aktualisieren, so dass die Werte auch wirklich in den Zellen angezeigt werden.

Hat diese Beschreibung das Problem ggf. noch etwas besser raus gearbeitet?

Vielen Dank nochmal für Deine Antwort. Vllt. fällt Dir ja noch was ein!

Philipp

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige