Laut Physikbuch dehnen sich alle heißen Körper aus. Also bin ich nicht dick, sondern heiß.

Guten Tag Herr Martin
Vielen Dank für Ihre ausführlichen Mitteilungen in Ihrer letzten Mail
Inzwischen steht das erste Modul (Flächenmanagement).
Allerdings sind mir dabei Probleme begegnet, die ich nicht lösen konnte.

1.) Zugriff auf den richtigen Visio Prozess.
Der Zugriff auf Visio läuft prima, solange nicht mehrere Visio-Anwendungen laufen.
Hier die entsprechenden Code-Zeilen

Public vsoApp As Visio.Application

Public Sub Set_vsoApp()
‚Prüfen ob eine Visio Application läuft
‚Wenn ja, dann die laufende App als vsoApp definieren
‚Wenn nein dann eine neue Application starten

If GetObject("winmgmts:").ExecQuery("select * from win32_process where name='VISIO.EXE'").Count > 0 Then
    Set vsoApp = GetObject(, "Visio.Application")
Else
    Set vsoApp = CreateObject("Visio.Application")
End If

End Sub

Mit diesen Zeilen gelange ich zu einer Objektvariable vsoApp, deren Dokumente ich durchlaufe und das gewünschte Dokument entweder finde oder öffne.
Wenn nun aber mehrere Applikationen laufen und das gewünschte Dokument dummerweise nicht in der ersten App läuft, so funktioniert der Code nicht mehr. Das gewünschte Dokument wird nicht gefunden und kann auch nicht ein zweites Mal geöffnet werden.

Die Frage lautet darum:
Gibt es eine Möglichkeit die ganze Auflistung
„select * from win32_process where name=’VISIO.EXE'“
zu durchlaufen und einzelnen zu durchsuchen?

#

Hallo Herr M.,

und hier meine Antworten:

1.) Es gibt verschiedene Strategien. Ich habe ein Projekt, da arbeite ich folgendermaßen:
On Error GoTo Fehler
Set vsApp = CreateObject(„Visio.Application“)
[…]
Set vsDatei = vsApp.Documents.Open(strDateiName)
[…]
vsDatei.Save
vsDatei.Close
[…]
Call VisioSchliessen(True)

Set vsDatei = Nothing
Set vsApp = Nothing
Exit Sub

Fehler:
MsgBox „Es trat ein Fehler auf:“ & vbCr & Err.Number & „: “ & Err.Description

Das heißt: ich öffne einfach die Datei. Sollte die Datei schon offen sein, wird ein Fehler erzeugt, die Sprungmarke angesprungen und die Meldung ausgegeben, dass die Datei in Benutzung ist. Der Anwender muss sie zumachen und das Programm erneut starten.

Zweite Variante: Sie greifen mit GetObject auf das bereits geöffnete Visio und auf die bereits geöffnete Datei zu. Sollte sie noch nicht geöffnet sein, wird ein Fehler erzeugt, der verarbeitet wird, indem Visio, bzw. die Datei geöffnet wird:
Dim vsApp As Object
Dim vsDatei As Object
Const PFAD As String = „D:\Eigene Dateien\Räuberhauptmann2.vsdx“

On Error Resume Next

Set vsApp = GetObject(, "Visio.Application")
If Err.Number <> 0 Then
    Err.Clear
    Set vsApp = CreateObject("Visio.Application")
End If

vsApp.Visible = True

Set vsDatei = vsApp.Documents("Räuberhauptmann2.vsdx")
If Err.Number <> 0 Then
    Err.Clear
    Set vsDatei = vsApp.Documents.Open(PFAD)
End If

MsgBox vsDatei.Name

Und zur dritten (Ihrer Lösung) – durchlaufen Sie alle Dokumente von Visio:

Dim i As Integer
Dim blnDateiOffen As Boolean
blnDateiOffen = False
For i = 1 To vsoApp.Documents.Count
    If vsoApp.Documents(i).Name = "Räuberhauptmann2.vsdx" Then
        Set vsoDatei = vsoApp.Documents(i)
        blnDateiOffen = True
    End If
Next

If blnDateiOffen = False Then
    Set vsoDatei = vsoApp.Documents.Open(PFAD)
End If

Du stehst gut gelaunt auf, fühlst dich gut und dann triffst du Menschen …

Ich erstelle für einen Kunden ein Programm. Per VBA greift Visio auf Excel zu. Dabei wird überprüft, ob Excel (beziehungsweise eine bestimmte Datei) schon offen ist:

On Error Resume Next

' -- greife auf das offene Excel zu
Set xlApp = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
    ' -- falls Excel nicht offen ist: öffne Excel
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False
End If

On Error GoTo 0

Die Zeile GetObject(, „Excel.Application“) liefert einen Fehler, wenn sich der Cursor in einer Zelle befindet:

Eigentlich sollte es automatisch (automatisiert) gehen …