Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA: warten mit fortfahren bis Daten geladen sind

VBA: warten mit fortfahren bis Daten geladen sind
27.03.2019 09:57:52
Roman
Hallo zusammen
Ich habe das Problem, dass mein VBA-Code zu früh weiterläuft. In einem ersten Makro (Copy_ISIN) kopiere ich ein Identifier. Im zweiten Arbeitsschritt (Makro add_peers)werden alle zu diesem Identifier gehörenden weiteren Identifiers in einem Arbeitsblatt ergänzt. Dann werden noch Formeln für einen Datenbezug zu den Identifierts angereichert.
Mein Problem ist, dass mittels Formeln Daten aus einer externen Quelle bezogen werden (Schnittstelle zu Morningstar-Server) und das Laden dauert relativ und ist natürlich auch abhängig von der Anzahl der Identifiers. Es können 1 bis 2'000 Identifier je nach Abfrage aufgeführt werden. Mein Code läuft leider immer weiter bevor alle Daten geladen und verarbeitet worden sind.
Meine Frage nun: wie kann ich mein Excel mittels VBA-Code dazu bringen, dass mit der weiteren Verarbeitung gewartet wird bis alle Daten im Excel geladen und verarbeitet worden sind? Mein Code ist:
Sub Run_All()
Copy_SWC_ISIN 'Makro kopiert den Identifier
add_peers     'alle anderen Identifier werden kopiert. Daten-Load startet.
-> hier benötige ich die Unterbrechung bis alle Daten geladen und weiterverarbeitet  _
worden sind.
Remove_alle_NA_Makros 'Makro entfernt N/A's und Nuller
Chart_Achsenskalierung 'Makro passt die Achsenskalierung der Charts automatisch an
End Sub
Ich habe mit der Suchfunktion gesucht aber leider keine Lösung für mein Problem gefunden. Ich wäre sehr dankbar, wenn Ihr mir helfen könnt.
Beste Grüsse
Roman
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: warten mit fortfahren bis Daten geladen sind
27.03.2019 10:16:48
Rainer
Hallo Roman,
ist schwierig zu beantworten ohne den Code im Detail zu kennen.
Aber evtl. eine Behelfslösung: Erstelle eine globale Variable "ENDE_ADD_PEERS" und setze diese am Ende der Sub auf TRUE. Bei der gewünschten Unterbrechung kannst du nun eine Schleife einfügen, die diese Bedingung prüft.
Gruß,
Rainer
Anzeige
Falscher Code-Ausschnitt - Was macht "add_peers"?
27.03.2019 10:50:02
Zwenn
Hallo Roman,
wie sieht der Code von add_peers aus und was für Formeln sind das: 'mittels Formeln Daten aus einer externen Quelle bezogen werden (Schnittstelle zu Morningstar-Server)'
Ich denke add_peers darf die Kontrolle erst an Run_All zurück geben, wenn alles fertig ist, was add_peers machen soll. Nur, was ist das?
Viele Grüße,
Zwenn
Anzeige
AW: VBA: warten mit fortfahren bis Daten geladen sind
27.03.2019 15:35:17
Roman
Das "add_peers" holt anhand von einem Identifier (namentlich ISIN) von einem Universum von 358'592 die dazugehörigen Identifiers. Dann werden diese kopiert und die Formeln quasi per Autofill runtergezogen. Der Code ist:
Sub add_peers()
'Währung bestimmen als Vorarbeit für den Currency Converter
Range("C8:C8").Calculate
'von SWC-ISIN ausgehend die entsprechende Peer Group in der zweiten Lasche im Autofilter  _
anzeigen
Dim Kriterium1$, Kriterium2$
Kriterium1 = Sheets("Peer_Analysis").Cells(8, 1).Value
Sheets("PG_Details").Select
ActiveSheet.Range("$A$2:$G$358592").AutoFilter Field:=3, Criteria1:=Kriterium1
'alle Einzelpeers vom Autofilter markieren und copy
Sheets("PG_Details").Select
Range("E3").Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWindow.SmallScroll Down:=3
Selection.Copy
Sheets("Peer_Analysis").Select
Range("A10").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Range("A10").Select
'Formel für alle Einzelpeers runterkopieren (quasi Autofill)
Range("B10:J10").Copy
Range("B11:J" & Cells(Rows.Count, 1).End(xlUp).Row).PasteSpecial xlPasteFormulas
Range("A10").Select
End Sub
Dann werden die Daten vom Morningstar Server geladen. Hier einige Beispiele der Formeln:
=MSDP($A8;"Std_Dev_3Yr_ME";"lmend";"ann=true") -> hier wird die Standardabweichung über 3 Jahre annualisiert geladen.
=MSTS($A8;"return";"lmend-3g";"lmend";"ann=true") -> hier wird die Performance über 3 Jahre annualisiert geladen.
MSDP steht für Morningstar Data Point.
MSTS steht für Morningstar Time Series.
$A8 ist der Identifier.
Mein VBA-Code soll erst weiterfahren, wenn die Daten von Morningstar geladen sind.
Wenn alles geladen und gerechnet ist, dann soll jetzt das VBA-Makro Remove_alle_NA_Makros (habe der Übersichtshalber nur den ersten Teil reinkopiert) fortfahren:
Sub Remove_NA()
' Remove_NA Makro Teil 1/3 (wegen Stack Overflow nötig Befehl zu splitten)
Dim rng As Range
For Each rng In Sheets("Peer_Analysis").Range("D10:R3000")
If rng.Value = "-N/A" Then rng.ClearContents
Next
End Sub

Anzeige
AW: VBA: warten mit fortfahren bis Daten geladen sind
27.03.2019 17:07:52
Zwenn
Hallo Roman,
ich kann es zwar nicht sicher sagen, nehme aber an, dass es mit den Formeln zusammenhängt. Da Formeln von Excel sehr wohl im Multithreading-Betrieb bearbeitet werden, kann ich mir vorstellen, dass "nebenbei" auch Makrocode weiter ausgeführt wird.
Ob das mit Formeln, die Daten von einem Server ziehen auch funktioniert kann ich nicht sagen. Aber schau Dir mal die folgende Seite zu CalculationState an:
http://docs.microsoft.com/de-de/office/vba/api/excel.application.calculationstate?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev11.query%3FappId%3DDev11IDEF1%26l%3Dde-DE%26k%3Dk(vbaxl10.chm133265)%3Bk(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue
Damit solltest Du eine Schleife bauen können, die so lange läuft, bis der Status auf xlDone springt:
http://docs.microsoft.com/de-de/office/vba/api/excel.xlcalculationstate
Viele Grüße,
Zwenn
Anzeige
AW: VBA: warten mit fortfahren bis Daten geladen sind
01.04.2019 11:31:50
Roman
Hallo Zwenn
Vielen Dank für deine Hilfe. Als VBA-Anfänger ist mir das aber zu anspruchsvoll und so belasse ich alles beim Alten. Trotzdem vielen Dank.
;
Anzeige
Anzeige

Infobox / Tutorial

VBA: Warten bis Daten geladen sind


Schritt-für-Schritt-Anleitung

Um sicherzustellen, dass dein Excel VBA-Code wartet, bis alle Daten geladen sind, kannst du folgende Schritte befolgen:

  1. Globale Variable erstellen: Lege eine globale Variable an, die den Status der Datenverarbeitung speichert. Zum Beispiel:

    Dim ENDE_ADD_PEERS As Boolean
  2. Variable am Ende der Sub setzen: Setze die Variable am Ende deines add_peers Makros auf True, um anzuzeigen, dass die Verarbeitung abgeschlossen ist.

    Sub add_peers()
       ' Dein bestehender Code ...
       ENDE_ADD_PEERS = True
    End Sub
  3. Warten bis die Variable True ist: Füge in deinem Hauptmakro Run_All eine Schleife ein, die wartet, bis die Variable ENDE_ADD_PEERS auf True gesetzt ist. Das könnte so aussehen:

    Sub Run_All()
       Copy_SWC_ISIN 'Makro kopiert den Identifier
       add_peers     'Daten-Load startet.
    
       ' Warten bis die Daten geladen sind
       Do While Not ENDE_ADD_PEERS
           DoEvents 'Lässt Excel weiterhin reagieren
       Loop
    
       Remove_alle_NA_Makros 'Fortfahren mit dem nächsten Schritt
       Chart_Achsenskalierung
    End Sub

Häufige Fehler und Lösungen

  • Makro läuft weiter: Wenn dein Makro zu früh weiterläuft, stelle sicher, dass die Schleife korrekt implementiert ist. Überprüfe, ob die globale Variable ENDE_ADD_PEERS wirklich auf True gesetzt wird.

  • Daten werden nicht aktualisiert: Wenn die Daten von einer externen Quelle (wie dem Morningstar-Server) nicht rechtzeitig geladen werden, kann es an der Multithread-Verarbeitung in Excel liegen. Überprüfe die CalculationState-Eigenschaft und stelle sicher, dass dein Code wartet, bis die Berechnung abgeschlossen ist.


Alternative Methoden

Falls die oben genannte Methode nicht funktioniert, könntest du auch den DoEvents Befehl verwenden. Dieser lässt Excel weiterhin reagieren, während dein Code läuft. Dadurch könnte sichergestellt werden, dass der Benutzer nicht das Gefühl hat, dass Excel eingefroren ist.

Eine andere Möglichkeit ist die Verwendung des Application.Wait Befehls, um eine feste Zeit zu warten, bevor das Makro fortfährt. Dies ist jedoch weniger flexibel.

Application.Wait (Now + TimeValue("0:00:05")) 'Warte 5 Sekunden

Praktische Beispiele

Hier ist ein Beispiel, wie du die oben genannten Konzepte kombinieren kannst:

Dim ENDE_ADD_PEERS As Boolean

Sub Run_All()
    Copy_SWC_ISIN
    add_peers

    ' Warten bis die Daten geladen sind
    Do While Not ENDE_ADD_PEERS
        DoEvents
    Loop

    Remove_alle_NA_Makros
    Chart_Achsenskalierung
End Sub

Sub add_peers()
    ' Dein bestehender Code ...
    ENDE_ADD_PEERS = True
End Sub

Tipps für Profis

  • Vermeide unnötige Berechnungen: Setze Application.Calculation = xlCalculationManual zu Beginn deines Makros und zurück zu xlCalculationAutomatic, um die Berechnungen während der Ausführung zu minimieren.

  • Multithread-Verarbeitung beachten: Sei dir bewusst, dass Formeln, die Daten von externen Quellen abrufen, möglicherweise im Hintergrund verarbeitet werden können. Stelle sicher, dass du den vba warten Befehl korrekt implementierst, um unerwartete Ergebnisse zu vermeiden.


FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass mein Makro wartet, bis alle Daten geladen sind? Du kannst eine globale Variable verwenden, die am Ende der Datenverarbeitung auf True gesetzt wird und in einer Schleife auf diese Variable warten.

2. Was ist der Unterschied zwischen DoEvents und Application.Wait? DoEvents ermöglicht Excel, während der Ausführung deines Codes weiterhin auf Benutzereingaben zu reagieren, während Application.Wait eine bestimmte Zeit wartet und den Code pausiert.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige