Close

TheLamer

Mitglied
Hallo,

hab mal ne frage ich habe ein Programm über das man Word Datein öffnen kann.
wen man eine Word Datei geöffnet hat hat man einen zurück button.
Code:
Dokuments.Open FileNam:="C:\...........", ReadOnly:=true
ich will aber auch das wen man auf den Button drückt das sich die word datei schließt und man zum normalen programm zurück kommt.

Danke schonmal ;)
 
Dazu würdest du ein VBA Macro benötigen das im Word in dem zu öffnenden Dokument oder in der Normal.dot enthalten ist.

Alternativ wäre den Prozess zu überwachen bis Word wieder geschlossen wird.
 
ja das mit der Normal.dot ist leider nicht möglich aber das zweite den Prozess zu überwachen bis word geschlossen wird hört sich ganz gut an. Kannst du mir dazu noch was erzhälen ?

Danke schonmal
 
Das geht nur über Windows API Funktionen.


Hier die API Deklarationen, ich hab jetzt die unnötigen Konstrukte nicht gekürzt.
Code:
' SHELLEXECUTEINFO hInstApp Rückgabe-Konstanten
Public Enum ShellExecuteError
    SE_ERR_FNF = 2 ' Datei wurde nicht gefunden
    SE_ERR_PNF = 3 ' Pfad wurde nicht gefunden
    SE_ERR_ACCESSDENIED = 5 ' Zugriff verweigert
    SE_ERR_OOM = 8 ' nicht genügend Speicher verfügbar
    SE_ERR_BAD_FORMAT = 11 ' Falsches Format
    SE_ERR_SHARE = 26 ' Datei konnte nicht geöffnet werden, da sie bereits verwendet wird
    SE_ERR_ASSOCINCOMPLETE = 27 ' Dateityp ist nicht ausreichend assoziiert
    SE_ERR_DDETIMEOUT = 28 ' DDE-Zeitlimit wurde ereicht
    SE_ERR_DDEFAIL = 29 ' DDE ist gescheitert
    SE_ERR_DDEBUSY = 30 ' DDE konnte nicht gestartet werden
    SE_ERR_NOASSOC = 31 ' Dateityp ist nicht assoziiert
    SE_ERR_DLLNOTFOUND = 32 ' eine benötigte Dll wurde nicht gefunden
End Enum

' SHELLEXECUTEINFO nShow-Konstanten
Public Enum ShellExecuteShowConstants
    SE_SW_HIDE = 0 ' versteckt das Fenster
    SE_SW_MAXIMIZE = 3 ' maximiert das Fenster
    SE_SW_MINIMIZE = 6 ' minimiert das Fenster
    SE_SW_RESTORE = 9 ' stellt das Fenster wieder her
    SE_SW_SHOW = 5 ' zeigt das Fenster an
    SE_SW_SHOWMAXIMIZED = 3 ' zeigt das Fenster maximiert an
    SE_SW_SHOWMINIMIZED = 2 ' zeigt das Fenster minimiert an
    SE_SW_SHOWMINNOACTIVE = 7 ' zeigt das Fenster minimiert an, aber aktiviert es nicht
    SE_SW_SHOWNA = 8 ' zeigt das Fenster an, aber aktiviert es nicht
    SE_SW_SHOWNOACTIVATE = 4 ' zeigt das Fenster in der besten Größe und Position an, aber aktiviert es nicht
    SE_SW_SHOWNORMAL = 1 ' zeigt das Fenster ganz normal an
End Enum

' SHELLEXECUTEINFO fMask-Konstanten
Public Enum ShellExecuteMaskConstants
    SEE_MASK_CLASSKEY = &H3 ' Struktur wird mit dem Handle des Registry - Schlüssels für die Klasse gefüllt
    SEE_MASK_CLASSNAME = &H1 ' Struktur wird mit dem Klassennamen oder GUID gefüllt der die Datei beschreibt
    SEE_MASK_CONNECTNETDRV = &H80 ' Struktur verbindet den PC mit einem Netzlaufwerk falls nötig, lpFile muss der UNC-Pfadname in dem Netzwerk sein
    SEE_MASK_DOENVSUBST = &H200 ' Struktur wird mit Umgebungsvariablen des Programms gefüllt, diese werden in lpDirectory oder lpFile gepackt
    SEE_MASK_FLAG_DDEWAIT = &H100 ' die Funktion wartet, dass die DDE ihre Vorgänge abgeschlossen hat und kehrt dann erst zurück
    SEE_MASK_FLAG_NO_UI = &H400 ' die Funktion zeigt keine Fehler-Dialogboxen an
    SEE_MASK_HOTKEY = &H20 ' dwHotkey wird gefüllt
    SEE_MASK_ICON = &H10 ' hIcon wird gefüllt mit dem Icon-Handle des Standard-Icons der Anwendung
    SEE_MASK_IDLIST = &H4 ' benutzt die lpIDLIST-Option um das Programm zu starten, das in ihr beschrieben ist
    SEE_MASK_INVOKEIDLIST = &HC ' benutzt die lpIDLIST-Option um das Programm zu starten, das in ihr beschrieben ist
    SEE_MASK_NOCLOSEPROCESS = &H40 ' füllt die Struktur-Option hProcess mit dem Process-Handle der gestarteten Anwendung
End Enum

Public Enum ShellExecuteOperation
    SE_OPEN = 0
    SE_EDIT = 1
    SE_EXPLORE = 2
    SE_FIND = 3
    SE_PRINT = 4
    SE_PROPERTIES = 5
End Enum

' SHELLEXECUTEINFO dwHotKey-Konstanten
Public Enum ShellExecuteHotkeyConstants
    HOTKEYF_ALT = &H4 ' benutzt ALT für den Hotkey
    HOTKEYF_CONTROL = &H2 ' benutzt STRG für den Hotkey
    HOTKEYF_EXT = &H8 ' benutzt den Extendend-Key für den Hotkey
    HOTKEYF_SHIFT = &H1 ' benutzt Shift für den Hotkey
End Enum

' WaitForSingleObject dwMillisekond - Konstante
Private Const INFINITE = &HFFFF ' unendlich warten

' WaitForSingleObject Rückgabe-Konstanten
Private Enum ShellExecuteWaitConstants
    WAIT_ABANDONED = &H80 ' der Mutex, der in hHandle angegeben ist wird
        ' nicht freigegeben, so lange der Eltern-Thread zerstört ist. Der Mutex ist nun
        ' Bestandteil des aufrufenden Threads und ist nicht mehr im signalisierenden Status
    WAIT_FAILED = &HFFFFFFFF ' die Funktion ist gescheitert
    WAIT_OBJECT_0 = &H0 ' das Objekt. das in hHandle spezifiziert ist,
        ' ist in einem signalisierendem Status
    WAIT_TIMEOUT = &H102 ' das Zeitlimit für eine Änderung des
        ' Thread-Statuses ist abgelaufen
End Enum

Public Enum wcWaitConstant
   wcDontWait = 0
   wcWaitUntilInitialized = 1
   wcWaitUntilTerminated = 2
End Enum

' #############################################################################
' ##
' ##  @Area = API-Strukturen
' ##
' #############################################################################

' wird als Parameter der Funktion ShellExecuteEx benötigt
Private Type SHELLEXECUTEINFO
    cbSize As Long      ' Erwartet die Größe der Struktur in Bytes.
    fMask As Long       ' Erwartet eine oder eine Kombination aus mehreren der "fMask"-Konstanten die beschreiben, welche Optionen der Struktur beim Funktionsaufruf gefüllt oder ausgelesen werden sollen.
    hwnd As Long        ' Erwartet das Fensterhandle des Fensters, das die Funktion aufruft, falls vorhanden.
    lpVerb As String    ' Erwartet einen String, der den Vorgang der Dateioperation beschreibt, der stattfinden soll. Gültige Werte sind "explore","open", "print".
    lpFile As String    ' Erwartet den Namen einer Datei, die ausgeführt werden soll. Handelt es sich nicht um eine ausführbare Datei, so wird das Programm, das mit dieser Datei assoziiert ist, gestartet.
    lpParameters As String  ' Erwartetet zusätzliche Parameter, die dem zu startenden Programm übergeben werden können.
    lpDirectory As String ' Erwartet das Arbeitsverzeichnis, in dem das Programm arbeiten soll.
    nShow As Long       ' Erwartet eine "nShow"-Konstante, die beschreibt, wie das Fenster des zu startenden Programms angezeigt werden soll.
    hInstApp As Long    ' Ist die Funktion erfolgreich, so beinhaltet diese Variable das Instanzhandle der Anwendung, die gestartet wurde, andernfalls enthält sie den Fehlercode, der die Ursache des Misslingens beschreibt. Gültige Fehlercodes sind eine der "hInstApp"-Konstanten.
    lpIDList As Long    ' Erwartet einen Pointer zu einer  ITEMIDLIST-Struktur, die gefüllt ist mit dem Pfad des zu startenden Programms, wenn die "SEE_MASK_IDLIST" oder "SEE_MASK_INVOKEIDLIST"-Konstante gesetzt ist.
    lpClass As String   ' Erwartet den Namen der Dateiklasse oder des GUIDs der Datei, falls die Konstante "SEE_MASK_CLASSNAME" gesetzt worden ist.
    hkeyClass As Long   ' Erwartet das Handle eines Registryschlüssels der Dateiklasse, falls die Konstante "SEE_MASK_CLASSKEY" gesetzt worden ist.
    dwHotKey As Long    ' Enthält nach erfolgreichem Aufruf der Funktion den Hotkey, der mit dem Programm assoziiert ist. Der Low-Order Word ist eine der Virtual-Keycode-Konstanten und der High-Order Word eine der "dwHotKey"-Konstanten, falls die "SEE_MASK_HOTKEY"-Konstante gesetzt worden ist.
    hIcon As Long       ' Enthält nach erfolgreichem Aufruf der Funktion das Handle des Standard-Icons der Anwendung, falls die "SEE_MASK_ICON"-Konstante gesetzt worden ist.
    hProcess As Long    ' Enthält nach erfolgreichem Aufruf der Funktion das Handle des Prozesses der Anwendung, falls die "SEE_MASK_NOCLOSEPROCESS"-Konstante gesetzt worden ist.
End Type


' #############################################################################
' ##
' ##  @Area = API-Funktions Deklarationen
' ##
' #############################################################################

Private Declare Function ShellExecuteEx Lib "shell32.dll" Alias "ShellExecuteExA" _
  (lpExecInfo As SHELLEXECUTEINFO) As Long
    ' @Desc = Diese Funktion startet ein Programm oder öffnet ein Dokument mit dem
    ' @Desc = assoziierten Programm und gibt Informationen über das gestartete Programm zurück.
    ' @Param lpExecInfo = Erwartet eine  SHELLEXECUTEINFO-Struktur, die Informationen über das zu startende Programm enthält.
    ' @Return = Ist die Funktion erfolgreich, so ist die Rückgabe "ungleich 0", andernfalls ist die Rückgabe "0".

Private Declare Function ShellExecute Lib "shell32.dll" Alias _
        "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation _
        As String, ByVal lpFile As String, ByVal lpParameters _
        As String, ByVal lpDirectory As String, ByVal nShowCmd _
        As Long) As Long
    ' @Desc = Diese Funktion startet eine Anwendung oder ein Dokument mit der verknüpften
    ' @Desc = Anwendung, wobei man noch den Start- und Fenstermodus festlegen kann.
    ' @Param hwnd = Handle des aufrufenden Fensters
    ' @Param lpOperation = Erwartet eine Zeichenfolge, die beschreibt, welche Operation ausgeführt
    '       werden soll. Bei diesen Operationen handelt es sich um Befehle, die in der
    '       Windows-Registry stehen und auch im Kontextmenü der Datei im Windows-Explorer
    '       zu finden sind. Wird ein leerer String übergeben, wird der Standard-Öffnenbefehl benutzt. Ist
    ' @Param lpFile = Verzeichnisnamen, Datei oder Dokument, welches mit der verknüpften
    '       Anwendung geöffnet werden soll.
    ' @Param lpParameters = Optionale Angabe von zusätzlichen Aufruf-Parametern.
    ' @Param lpDirectory = Legt das Arbeitsverzeichnis fest.
    ' @Param nCmdShow = Erwartet ein Konstante, die beschreibt, wie sich das Anwendungs-Fenster
    '       berhalten soll.
    ' @Return = War der Funktionsaufruf erfolgreich, wird das Instanzhandle der gestarteten
    '       Anwendung zurückgegeben. Der Rückgabewert ist 0, wenn nicht genügend Systemressourcen
    '       zur Ausführung der Funktion vorhanden sind. Scheitert der Funktionsaufruf aus einem
    '       anderen Grund, so ist der Rückgabewert wie folgt zu interpretieren.


Private Declare Function WaitForSingleObject Lib "kernel32.dll" _
  (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    ' @Desc = Diese Funktion hält ein Programm an, bis ein Objekt einen signalisierenden
    ' @Desc = Status erreicht hat oder das voreingestellte Zeitlimit erreicht wurde.
    ' @Param hHandle = Erwartet das Handle eines Objektes, das z.B. von einem Ereignis,
    '       Drucker-Job, Mutex, Prozess, etc. stammen kann.
    ' @Param dwMilliseconds = Erwartet die Anzahl an Millisekunden, die der Programmablauf
    '       angehalten wird, bis die Funktion eine Veränderung des Objektstatus feststellt.
    '       Soll kein Zeitlimit erreicht werden, so kann man die "dwMilliseconds"-Konstante angeben.
    ' @Return = Ist die Funktion erfolgreich, liefert sie eine der Rückgabe-Konstanten.
    '       Ist die Rückgabe "WAIT_FAILED", so kann man die GetLastError-Funktion für erweiterte
    '       Fehlerinformationen aufrufen

Private Declare Function WaitForInputIdle Lib "user32" ( _
   ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long
    ' @Desc = Die Funktion WaitForInputIdle wartet, bis der spezifizierte Prozeß auf Benutzereingaben wartet,
    ' @Desc = obwohl keine erwartet werden, oder bis angegeben Time-out abgelaufen ist.
    ' @Param hProcess = [in] Handle zum Prozeß. Wenn der Prozess eine Konsolenanwendung oder keine Ereigniswarteschlange besitzt,
    '       wird die Funktion sofort wieder beendet zurück.
    ' @Param dwMilliseconds = [in] Timeout Angabe in Millisekunden.
    '   Wenn der Paramenter Unendlich(INFINITE) ist, die Funktion kehrt nicht zurück,
    '   solange der Prozeß untätig ist
    ' @Return = 0, wenn warten Erfolgreich. WAIT_TIMEOUT, wenn Wartezeit durch Timeout überschritten wurde.
    '   WAIT_FAILED, wenn ein Fehler aufgetreten ist, Fehler mit GetLastDLLError ermitteln.
Private Declare Function TerminateProcess Lib "kernel32" ( _
   ByVal hProcess As Long, ByVal uExitCode As Long) As Long



Meine Funktion hab mir dazu eine Klasse gebaut die mir alles behandelt.
Die Variable mit "m_" sind Membervariablen aus der Klasse.

Code:
Public Function ExecuteAndWaitForEnd(p_sFilePath As String, p_sParameter As String, _
Optional p_sWorkFolder As String = "") As Boolean

    Dim l_lReturnValue As Long
    
    ' Initialisierung
    If Len(p_sWorkFolder) = 0 Then p_sWorkFolder = p_sFilePath
    
    ' Unendlich ist ungültig
    If m_lWaitMilliseconds = INFINITE Then
        m_lWaitMilliseconds = 10000
    End If
    
    With m_oShellExecuteInfo
       .cbSize = Len(m_oShellExecuteInfo)
       .fMask = m_fMask
       .hwnd = m_hWnd
       .lpVerb = SelectOperationString(m_lOperation)
       .lpFile = p_sFilePath
       .lpParameters = p_sParameter
       .lpDirectory = p_sWorkFolder
       .nShow = m_lShowWindow
    End With
    
    ' Anwendung ausführen
    l_lReturnValue = ShellExecuteEx(m_oShellExecuteInfo)
    
    If l_lReturnValue = 0 Then
        SetShellExecuteError m_oShellExecuteInfo.hInstApp, p_sFilePath, SelectOperationString(m_lOperation), p_sWorkFolder
        ExecuteAndWaitForEnd = False
        Exit Function
    End If
    
    l_lReturnValue = WAIT_TIMEOUT
    While l_lReturnValue = WAIT_TIMEOUT
        l_lReturnValue = WaitForSingleObject(m_oShellExecuteInfo.hProcess, 1000)
        DoEvents
    Wend
    
    If l_lReturnValue = WAIT_FAILED Then
        ExecuteAndWaitForEnd = False
    Else
        ExecuteAndWaitForEnd = True
    End If
    
End Function
 
Es geht aber auch etwas einfacher (wenn du ein Word-Objekt erzeugt hast) mit:
Code:
Documents.Item(Dokumentname oder Index).Close
Oder
Code:
ActiveWindow.Close
schließt das Worddokument, das im Vordergrund ist.
 
Zurück