VisualBasic Worbook Object | Starte Funktion aus verlinktem Workbook

-]Dr.OeTz![-

Lt. Junior Grade
Registriert
Nov. 2009
Beiträge
509
Hallo Zusammen,

ich beiße mir gerade die Zähne aus und komme nicht weiter:

Ich möchte in einem Workbook mehrere Sheets aktualisieren und am Ende die neu hinzugefügten Daten verarbeiten. Dazu nutze ich Workbook.Open:

Code:
Dim LinkedWorkbook As Object
Set LinkedWorkbook = CreateObject("Excel.Application")

LinkedWorkbook.Workbooks.Open CStr(LinkedWorkbookFullPath)

For Each LinkedWorkbookSheet In LinkedWorkbook.Worksheets

    [DO SOMETHING] 'Füge Content in LinkedWorkbookSheet ein

Next LinkedWorkbookSheet

[HIER sollte RefreshData aufgerufen werden]

LinkedWorkbook.Workbooks(LinkedWorkbookFileName).Close True
LinkedWorkbook.Quit

Nun möchte ich, dass nach dem Hinzufügen der Daten ([DO SOMETHING]) im LinkedWorkbook eine bestimmte Funktion gestartet wird, um die neuen Daten zu verarbeiten.

Dazu triggere ich derzeit in jedem LinkedWorkbookSheet einen "Worksheet_Change"-Event
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Call RefreshData
End Sub

Entscheidender Nachteil ist, dass diese Funktion natürlich mehrfach hintereinander aufgerufen wird, was leider sehr viel Zeit in Anspruch nimmt (es geht um mehrere LinkedWorkbook mit vielen Sheets - in der Masse macht das mehrere Minuten, da auch Iterationen ablaufen)

Gibt es eine Möglichkeit, die Funktion "RefreshData" aus dem "LinkedWorkbook" einmalig zu starten, nachdem alle Sheets aktualisiert sind und bevor ich es wieder schließe?


Applikation.Run wäre eine Option aber dafür wird wieder eine komplette Instanz meines LinkedWorkbook geöffnet.
Am charmantesten wäre wirklich die Funktion direkt aufrufen zu können, bevor ich LinkedWorkbook speichere und schließe
 
Wo ist das Problem die Sub RefreshData an der von dir genannten Stelle auszuführen? Gibts da eine race condition?
Was mir sonst noch einfällt wäre in der Worksheet_Change Sub zu überprüfen ob das triggernde Sheet das letzte im File ist und nur danm RefreshData aufzurufen.
 
Oder, wenn es ganz trivial sein sollte: Einfach am Ende der Funktion die aktuelle Zeit speichern und beim nächsten Aufruf prüfen, ob schon mehr als eine Sekunde vergangen ist ... Ja, das ist nicht sauber, aber bevor dir gar nichts einfällt ... :)
 
floq0r schrieb:
Wo ist das Problem die Sub RefreshData an der von dir genannten Stelle auszuführen? Gibts da eine race condition?
Darin finden Iterationen statt, die jeweils bis zu 10 Sekunden dauern können. Da dieses OnChange im Verlauf allerdings vielfach getriggert wird, erhöht sich die Laufzeit extrem (wir reden dann schnell von >5min Laufzeit je nach System)

floq0r schrieb:
Was mir sonst noch einfällt wäre in der Worksheet_Change Sub zu überprüfen ob das triggernde Sheet das letzte im File ist und nur danm RefreshData aufzurufen.
Gute Idee, hatte ich auch überlegt aber ich kann die Reihenfolge der Sheets nicht 100% sicherstellen.

Habe es daher so ähnlich gelöst:
Habe ein Sheet "AutoStart" in die betreffenden Workbooks gepackt. Dieses triggere ich einmalig und gezielt aus meiner Quelle heraus, nachdem alle Daten in die Workbooks übertragen wurden.

Das funktioniert freilich, aber schöner wäre es natürlich, wenn ich direkt Funktion im "LinkedWorkbook" ausführen könnte. ;)


karl.klammer schrieb:
Oder, wenn es ganz trivial sein sollte: Einfach am Ende der Funktion die aktuelle Zeit speichern und beim nächsten Aufruf prüfen, ob schon mehr als eine Sekunde vergangen ist ... Ja, das ist nicht sauber, aber bevor dir gar nichts einfällt ... :)
Auch eine Idee - geht aber nur, ich das Worksheet_Change-Event nur einmalig aber egal wann ausführen möchte.

In meinem Fall bin ich aber darauf angewiesen, dass es ausgeführt wird, wenn bereits alle anderen Sheets aktualisiert wurden.
 

Ähnliche Themen

Antworten
9
Aufrufe
2.961
Zurück
Oben