Clever-Excel-Forum

Normale Version: VBA /
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo,
ich habe eine Excel-Datei in der mehrere Daten per PowerQuery abgefragt werden (aktuell 12 Abfragen).
Ich habe einen VBA-Button eingerichtet, der diese Daten aktualisiert (ThisWorkbook.RefreshAll).
Jetzt möchte ich eine Fertigmeldung einrichten, die über den Fortschritt informiert (1/12 .... 2/12 .... 3/12 .... ).

Via Google habe ich hierzu auch ein schönes Script gefunden:

Code:
'Hier die Deklaration im allgemeinen Teil
Public WithEvents qt1 As QueryTable
Public WithEvents qt2 As QueryTable
Public WithEvents qt3 As QueryTable
Public qts1 As Boolean
Public qts2 As Boolean
Public qts3 As Boolean

'Beim öffnen der Arbeitsmappe werden die Variablen belegt
Private Sub Workbook_Open()
qts1 = False
qts2 = False
qts3 = False
Set qt1 = ThisWorkbook.Worksheets("Daten").QueryTables("Abfrage_Daten")
Set qt2 = ThisWorkbook.Worksheets("Daten").QueryTables("Abfrage_Auswahl")
Set qt3 = ThisWorkbook.Worksheets("Rohdaten").QueryTables("Abfrage_Roh")
'Hier kann aber auch anstelle der Namen mit Index gearbeitet werden
'Set qt1 = ThisWorkbook.Worksheets(1).QueryTables(1)
'Set qt2 = ThisWorkbook.Worksheets(1).QueryTables(2)
'Set qt3 = ThisWorkbook.Worksheets(2).QueryTables(1)
End Sub

'Ab hier werden die Ereignisse überwacht:
Private Sub qt1_afterRefresh(ByVal success As Boolean)
If success Then
qts1 = True
MsgBox "Abfrage_Daten vom Arbeitsblatt >>Daten<< wurde aktualisiert"
If qts1 And qts2 And qts3 Then
MsgBox "alles aktualisiert"
End If
End If
End Sub

Jetzt suche ich allerdings nach einer Möglichkeit alle QueryTables aufzulisten, zu zählen und per Scheife zu durchlaufen ohne im Code alle Namen einzeln aufzuführen.

Wie könnte das laufen?

Gruß,
Kevin
(23.04.2024, 06:55)KevinT schrieb: [ -> ]Ich habe einen VBA-Button eingerichtet, der diese Daten aktualisiert (ThisWorkbook.RefreshAll).
Warum? Mit VBA blockierst du Excel bis der Code fertig ist.
Außerdem hat Excel den Knopf standardmäßig eingebaut. Und wer lustig ist kann den Knopf auch noch in die Symbolleiste für den Schnellzugriff einfügen.

(23.04.2024, 06:55)KevinT schrieb: [ -> ]Jetzt möchte ich eine Fertigmeldung einrichten, die über den Fortschritt informiert (1/12 .... 2/12 .... 3/12 .... ).
Super Idee um die Laufzeit zu verlängern.
beide Punkte sind nötig, da ich nicht selbst alleiniger Nutzer der Datei bin.

Ständige Rückfragen: 
    "Wo finde ich den Knopf zum Aktualisieren?"
    "Wo sehe ich, dass die Aktualisierung abgeschlossen ist oder ob sie noch läuft?"
Wenn PQ zu lange dauert sollte man die Datenstruktur neu gestalten.
Moin,

inhaltlich stimme ich shift-delbzu, allerdings ist Eventhandling in Klassen ein spannendes Thema. Du brauchst im Prinzip eine Hilfsklasse, die das Eventhandling einer QT übernimmt. Anschließend musst du für jede QT ein Objekt der Hilfsklasse erstellen und in einer Collection sammeln.

Wenn ich gleich mal Zeit finde, bereite ich was vor.

Viele Grüße 
derHöpp
(23.04.2024, 08:25)KevinT schrieb: [ -> ]    "Wo finde ich den Knopf zum Aktualisieren?"
Einmal zeigen. Nie wieder vergessen.
https://support.content.office.net/de-de...5f4526.jpg

(23.04.2024, 08:25)KevinT schrieb: [ -> ]    "Wo sehe ich, dass die Aktualisierung abgeschlossen ist oder ob sie noch läuft?"
Links in der Statusleiste.
Hallöchen,

mal abgesehen von den Problemen:

ThisWorkbook.Queries.Count

liefert Dir die Anzahl der Abfragen. Den Fortschritt könntest Du auch in einer (temporären) Textbox oder der Statuszeile (Application.StatusBar) von Excel ausgeben.
Moin,

merkwürdigerweise erzeugt PQ bei mir keine Querytables auf den Arbeitsblättern. Ich komme also bei meinen Tests nicht an das Eventhandling heran.

Viele Grüße 
derHöpp
Hallöchen,

MS schreibt dazu:

QueryTable object (Excel)
Represents a worksheet table built from data returned from an external data source, such as a SQL server or a Microsoft Access database.

Stimmt aber wohl auch nicht, eine Abfrage auf eine Access DB bringt das nicht.

Habe dann mal die Listobjects und die Queries gezählt. Alle über Abfragen erzeugten Listen und auch einfache Listen werden als Listobject gezählt, Abfragen (Thisworkbook.Queries) eben dort.

(Pivottabellen werden nicht als Abfrage gezählt)

weiter, bei google mal geschaut, was da los ist. z.B. bei StackOberfloh erfährt man
If you added your QT via the Data/Get External Data Ribbon menu, what you added was actually a ListObject.

Habe mir nun die Listobjects angeschaut. Da findet man je nach Quelle nun die zugehörige QueryTable mit ihren Eigenschaften oder eben den <...Fehler> bei Listen ohne. Womit dann für weitere Aktionen wohl je nach Informationsstand zur QT gezielte Ansprache oder eine Schleife infrage kommt.
Seiten: 1 2