Warten auf das Öffnen der CSV-file?

Ich versuche, eine CSV-file mit VBA in Excel herunterzuladen und zu öffnen. Wenn ich den Debugger benutze, funktioniert mein Code gut, aber wenn ich versuche, ihn normal auszuführen, wird es nicht funktionieren, er versucht die Informationen aus der neu geöffneten CSV-file in die existierende .xlsm-file zu kopieren, findet sie aber nicht etwas. Ich habe pathe gefunden, um zu überprüfen, dass die file geöffnet ist, aber ich muss es überprüfen und sobald es existiert, um mit dem Code fortzufahren.

Hier ist, wie ich die file zum Download bekomme:

Sub getFile(address) On Error Resume Next Set ie = CreateObject("InternetExplorer.Application") ie.Visible = False ie.navigate address ie.Quit Set ie = Nothing On Error GoTo 0 End Sub 

Und dann in dem Sub, das getFile aufruft,

 Do While Workbooks(Workbooks.Count).Name <> "file.csv" Loop 

Ich habe ein paar Varianten ausprobiert, die alle gut funktionieren, wenn man es im Debugger langsam macht, aber ansonsten abstürzt. Kennt jemand einen path, um es zu überprüfen und zu warten, bis die file geöffnet ist? Es erfordert, dass der Benutzer etwas tut, um sicherzustellen, dass file.csv geöffnet ist. Soll ich meinen check-in sub getFile eingeben oder behalten, nachdem es aufgerufen wird?

SEELE: Ich habe den folgenden Ratschlag ausprobiert: Ich habe es versucht und es hat perfekt funktioniert:

 Sub getFile(address) On Error Resume Next Set ie = CreateObject("InternetExplorer.Application") ie.Visible = False ie.navigate address Do While Workbooks(Workbooks.Count).Name <> "file.csv" DoEvents Loop ie.Quit Set ie = Nothing On Error GoTo 0 End Sub 

Die Prüfung wurde vor dem Schließen von IE DoEvents und DoEvents zu meiner loop hinzugefügt.

Solutions Collecting From Web of "Warten auf das Öffnen der CSV-file?"

Normalerweise geschieht ein solches Verhalten nicht aufgrund der Code-Logik, sondern aufgrund von Interrupts. Abhängig von der Art Ihrer Umgebung könnte es eines von zwei Dingen sein

  • Irgendein backgroundauffrischungsprozeß wird irgendwann zwischen Ihrer Codeausführungszeit ausgeführt, die einige Probleme verursacht. BlpUpdate in einer Finanzdienstleistungsumgebung könnte Ihre Bloomberg-API ihr rechtzeitiges BlpUpdate Ereignis durchführen
  • Ihr Code blockiert einen großen Teil der time und führt zu unerwartetem Verhalten, da das Ereignis, das während Ihrer loop ausgetriggers wurde, zu lange blockiert wurde, bis der Code im Hauptthread abgeschlossen wurde.

Also müssen Sie die folgenden zwei Lösungen versuchen, von denen eine funktionieren sollte

Für das zweite Problem, in Ihrem

 Do While Condition ' ... your code ... Loop 

Fügen Sie eine Codezeile hinzu, die nach ausstehenden Ereigniswarteschlangen sucht und diese löscht. Dadurch wird …

 Do While Condition DoEvents ' either put it at the start or at the end of your code ' ... your existing code ... Loop 

Dies gibt dem System etwas "Atempause", um ausstehende Ereignisse zu beenden. Sie müssen mit dem memoryort Ihres DoEvents Codes experimentieren.

Für das erste Problem können Sie versuchen, Ihre gesamte loop innerhalb eines Event Protected Codebereichs einzuschließen, um sicherzustellen, dass sie ausgeführt wird, bevor sie von irgendetwas gestört wird.

 Application.EnableEvents = False 'your loop and other code comes here Application.EnableEvents = True 

Noch einmal, Sie benötigen möglicherweise ein wenig Trial and Error, um zu sehen, wie viel von dem Code in die ereignisfreie Zone geworfen werden muss, bevor er wie erwartet funktioniert.