683 Aufrufe
Gefragt in Tabellenkalkulation von heiko1985 Mitglied (127 Punkte)

Hallo zusammen

Also:
Ich habe eine Excel-Datei (A).
Aus dieser Datei wird mit VBA/Hyperlink eine andere Excel-Datei (B) geöffnet.
Nachdem diese Datei B geöffnet wurde, soll in Datei A ein Code ausgeführt werden.


Infos:

  1. Die Datei B ist in einem separaten Programm gespeichert.
  2. Das Programm speichert die Datei B aber nicht unter ihrem Namen und auch nicht in einer Ordnerstruktur. Stattdessen hat die Datei eine ID (mehrstellige Zahl).
  3. Diese ID kommt im Hyperlink vor.
  4. Es besteht kein Zusammenhang zwischen ID und Dateinamen.
  5. Durch den Hyperlink wird das Programm quasi angestupst, die Datei B auf die Festplatte zu kopieren und anschließend zu öffnen.
  6. Der Ordner, in den Datei B kopiert wird, ist irgendein Unterordner des Programms. Er ist mir vorher nicht bekannt.
  7. An dem Verhalten des Programms kann ich nichts ändern.


Mein Problem:
Datei B wird nicht geöffnet, wenn noch ein Code läuft.
Das heißt, nachdem der Hyperlink in Datei A ausgeführt wurde, kann ich den Code nicht einfach "warten lassen", bis Datei B geöffnet wurde, und dann weiterlaufen lassen.


Meine Frage:
Ist es möglich, ein ereignisorientiertes Makro im Hintergrund laufen zu lassen, welches erkennt, dass eine neue Datei geöffnet wurde?

Oder hättet ihr sonst eine Idee?


Danke für eure Hilfe!

Gruss
Heiko1985

4 Antworten

+1 Punkt
Beantwortet von xlking Experte (1.5k Punkte)

Hallo Heiko,

hast du es schon mit dem FollowHyperlink-Ereignis versucht? Das wird ausgeführt, sobald du auf einen Link klickst, aber soweit ich erkennen kann erst nachdem die verlinkte Datei vollständig geöffnet wurde.

Dazu in Datei A in dem Tabellenmodul, das die Links enthält z.B. diesen Code schreiben:

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
  Dim wb As Workbook
  On Error Resume Next
  Set wb = Workbooks(Right(Target.Address, Len(Target.Address) - InStrRev(Target.Address, "\")))
  MsgBox wb.Name & " wurde geöffnet"
End Sub

Natürlich wird der Code nur ausgeführt, wenn nicht bereits ein anderer Code läuft. Sollte das jedoch der Fall sein, kannst du in dem anderen Code an beliebiger Stelle (z.B. am Ende einer Schleife) ein DoEvents einbauen, damit das Ereignis ausgeführt wird, bevor der andere Code weiterläuft.

Gruß Mr. K.

0 Punkte
Beantwortet von heiko1985 Mitglied (127 Punkte)

Danke für deine Antwort, Mr. K.

hast du es schon mit dem FollowHyperlink-Ereignis versucht?

Leider ist die Datei ja nicht direkt verlinkt. Excel weiß nicht, dass durch den Hyperlink letztendlich eine Excel-Datei geöffnet wird.

ein DoEvents einbauen, damit das Ereignis ausgeführt wird, bevor der andere Code weiterläuft

Das klappt leider nur eingeschränkt. Ich schiebe es jetzt mal auf dieses Programm, das die Excel-Datei herunterlädt und öffnet. Das verhält sich nämlich irgendwie inkonsistent, hat teilweise seeehr lange Antwortzeiten usw.

Naja, ich belasse es dabei. Dieses Programm nervt auch an vielen anderen Stellen, fühlt sich teilweise wie eine Beta an (für die unsere Firma aber ordentlich Geld bezahlt hat ...).

Danke nochmals und Gruß

Heiko1985

+1 Punkt
Beantwortet von xlking Experte (1.5k Punkte)

Hallo Heiko

Leider ist die Datei ja nicht direkt verlinkt. Excel weiß nicht, dass durch den Hyperlink letztendlich eine Excel-Datei geöffnet wird.

Aha, also wird auf jeden Fall eine bestehende Excel-Datei aus irgendeinem Ordner geöffnet wenn du auf den Hyperlink klickst. Du weißt nur nicht welche? Wenn du auf diese Datei zugreifen willst, gibts noch einen anderen Weg.

Ist es möglich, ein ereignisorientiertes Makro im Hintergrund laufen zu lassen, welches erkennt, dass eine neue Datei geöffnet wurde?

Probiers mal so: Ist nur halt nur etwas komplizierter. Du musst dazu die sog. Application.Events einschalten. Füge dazu in Datei A ein neues Klassenmodul hinzu: Das kannst du im Eigenschaftenfenster z.B. AppEvents nennen. Füge dort deinen Wunschcode ein. z.B.

Public WithEvents app As Application

Private Sub app_WorkbookOpen(ByVal Wb As Workbook)
  MsgBox Wb.Name & " wurde geöffnet"
End Sub

Außerdem fügst du im Modul "DieseArbeitsmappe" von Datei A noch diesen Code ein, damit die Events beim Öffnen der Datei eingeschaltet werden.

Dim myEvents As New AppEvents
Private Sub Workbook_Open()
  Set myEvents.app = Application
End Sub

Sobald du Datei A schließt und neu öffnest sind die AppEvents aktiv. Der Code app_WorkbookOpen wird ausgeführt sobald sich irgend eine bestehende Datei öffnet. Man kann nur hoffen, dass das Kaufprogramm bereits ein DoEvents enthält. Wenn nicht würde ich das reklamieren und den Einbau dieses Befehls nach dem Öffnen der Datei verlangen. Nur so hast du die Möglichkeit eigenen Code auszuführen, bevor der Code des Programms weiterläuft.

Gruß Mr. K.

0 Punkte
Beantwortet von heiko1985 Mitglied (127 Punkte)
Hallo Mr. K.

Sorry, offenbar ging meine Antwort auf deine letzte Nachricht nicht raus, was ich eben erst bemerkt habe. Daher nochmals in Kürze:

Das mit dem Application.Events hat funktioniert, danke!

Gruß

Heiko
...