Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Shell.AppActivate und SendKey

Forumthread: Shell.AppActivate und SendKey

Shell.AppActivate und SendKey
26.10.2020 20:05:37
Mike
Hallo zusammen,
ich komme irgendwie nicht weiter. Das nachfolgende Makro soll ein geöffnetes Windows Explorer Fenster aktivieren und über den SendKeys Befehl schließen.
Ich erhalte aber immer ein Fehler beim Kompilieren. Das Argument ist nicht Optional.
Aber nach allem was ich gelesen habe sollte es klappen. Kann mir da jemand weiter helfen?
Sub b()
Dim success As Object
Dim win As Object
success = Shell.AppActivate("\\blabla.com\bla\blub\temp\xyz\Zeug")
If success Then Shell.SendKeys "%{F4}"
Set objShell = Nothing
End Sub
Danke und Gruß
Mike
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Shell.AppActivate und SendKey
26.10.2020 20:23:11
ralf_b
bei mir geht das so.
AppActivate Shell("C:\Program Files\Mozilla Firefox\firefox.exe")
AW: Shell.AppActivate und SendKey
26.10.2020 20:39:53
Mike
Hallo Ralf,
soweit ich das sehe bezieht sich dein Vorschlag aber auf das schließen der kompletten Applikation und würde alle Fenster schließen.
Ich möchte aber gezielt über den fenstertitel ein Windows Explorer fenster ansprechen und auch nur dieses schließen. Andere Explorer Fenster sollen weiterhin geöffnet bleiben.
Gruß
Mike
Anzeige
AW: Shell.AppActivate und SendKey
26.10.2020 21:22:53
Nepumuk
Hallo Mike,
teste mal:
Option Explicit

Private Declare PtrSafe Function EnumWindows Lib "user32.dll" ( _
    ByVal lpEnumFunc As LongPtr, _
    ByVal lParam As LongPtr) As Long
Private Declare PtrSafe Function GetWindowTextA Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal lpString As String, _
    ByVal cch As Long) As Long
Private Declare PtrSafe Function GetWindowTextLengthA Lib "user32.dll" ( _
    ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function GetClassNameA Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal lpClassName As String, _
    ByVal nMaxCount As Long) As Long
Private Declare PtrSafe Function PostMessageA Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal wMsg As Long, _
    ByVal wParam As LongPtr, _
    ByVal lParam As LongPtr) As Long
#If Win64 Then
Private Declare PtrSafe Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongPtrA" ( _
    ByVal hwnd As LongPtr, _
    ByVal nIndex As Long) As LongPtr
#Else
Private Declare PtrSafe Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
    ByVal hwnd As LongPtr, _
    ByVal nIndex As Long) As LongPtr
#End If

Private Const GC_CLASSNAMEEXPLORER As String = "CabinetWClass"
Private Const GWL_STYLE As Long = -16&
Private Const WS_VISIBLE As Long = &H10000000
Private Const WS_BORDER As Long = &H800000
Private Const MAX_CLASS_NAME As Long = 255
Private Const WM_CLOSE As Long = &H10

Private lstrCaption As String

Public Sub Start()
    lstrCaption = "G:\Eigene Dateien\Eigene Excelbeispiele" ' Anpassen !!!
    Call EnumWindows(AddressOf WindowCallBack, ByVal 0)
End Sub

Private Function WindowCallBack(ByVal pvlngptrHwnd As LongPtr, ByVal lngptrParam As LongPtr) As Long
    Dim strCaption As String, strClassName As String
    Dim lngReturn As Long
    Dim lngptrStyle As LongPtr
    lngptrStyle = GetWindowLong(pvlngptrHwnd, GWL_STYLE)
    If (lngptrStyle And (WS_VISIBLE Or WS_BORDER)) = (WS_VISIBLE Or WS_BORDER) Then
        strClassName = Space$(MAX_CLASS_NAME)
        lngReturn = GetClassNameA(pvlngptrHwnd, strClassName, MAX_CLASS_NAME)
        strClassName = Left$(strClassName, lngReturn)
        If strClassName = GC_CLASSNAMEEXPLORER Then
            lngReturn = GetWindowTextLengthA(pvlngptrHwnd)
            strCaption = Space$(lngReturn)
            Call GetWindowTextA(pvlngptrHwnd, strCaption, lngReturn + 1)
            If strCaption = lstrCaption Then
                Call PostMessageA(pvlngptrHwnd, WM_CLOSE, 0&, 0&)
                WindowCallBack = 0
            End If
        End If
    End If
    WindowCallBack = 1
End Function

Gruß
Nepumuk
Anzeige
AW: Shell.AppActivate und SendKey
26.10.2020 21:43:22
Mike
Hallo Nepumuk,
keine Ahnung wie oft du mir bereits geholfen hast aber auch diesmal passt deine Lösung hervorragend.
Endlich kann ich einen Haken dahinter machen.
Besten Dank
Gruß
Mike
;
Anzeige

Infobox / Tutorial

Shell.AppActivate und SendKey: Fenster gezielt aktivieren und schließen


Schritt-für-Schritt-Anleitung

  1. Makro erstellen: Öffne Excel und gehe zu Entwicklertools > Visual Basic. Klicke auf Einfügen > Modul und füge den folgenden Code ein:

    Sub CloseExplorerWindow()
       Dim lstrCaption As String
       lstrCaption = "Fenstertitel" ' Hier den Titel des Windows Explorer Fensters anpassen
       Call EnumWindows(AddressOf WindowCallBack, ByVal 0)
    End Sub
    
    Private Function WindowCallBack(ByVal hwnd As LongPtr, ByVal lParam As LongPtr) As Long
       Dim strCaption As String
       Dim lngReturn As Long
    
       lngReturn = GetWindowTextLengthA(hwnd)
       strCaption = Space$(lngReturn)
       GetWindowTextA hwnd, strCaption, lngReturn + 1
    
       If strCaption = lstrCaption Then
           PostMessageA hwnd, WM_CLOSE, 0&, 0&
           WindowCallBack = 0
       End If
       WindowCallBack = 1
    End Function
  2. Fenstertitel anpassen: Stelle sicher, dass du den Fenstertitel in der Variable lstrCaption auf den tatsächlichen Titel des geöffneten Windows Explorer Fensters setzt.

  3. Makro ausführen: Speichere das Modul und führe das Makro mit F5 oder über die Excel-Oberfläche aus.


Häufige Fehler und Lösungen

  • Fehler: "Argument ist nicht optional": Dieser Fehler tritt häufig auf, wenn du Shell.AppActivate ohne das erforderliche Argument aufrufst. Stelle sicher, dass du den richtigen Fenstertitel oder den Prozessnamen angibst.

  • Fenster wird nicht gefunden: Wenn das Fenster nicht gefunden wird, überprüfe den genauen Titel des Fensters. Nutze die Funktion EnumWindows, um die Titel aller geöffneten Fenster zu überprüfen.


Alternative Methoden

Eine alternative Methode zur Verwendung von Shell.AppActivate ist die Verwendung der API-Funktion FindWindow. Hier ist ein Beispiel:

Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Sub ActivateWindow()
    Dim hwnd As LongPtr
    hwnd = FindWindow(vbNullString, "Fenstertitel") ' Hier den Titel des Fensters anpassen
    If hwnd <> 0 Then
        AppActivate hwnd
    End If
End Sub

Praktische Beispiele

  1. Windows Explorer Fenster schließen: Wenn du ein bestimmtes Windows Explorer Fenster mit dem Titel "Dokumente" schließen möchtest, ändere die lstrCaption entsprechend:

    lstrCaption = "Dokumente"
  2. Browser-Fenster schließen: Um ein Browser-Fenster zu schließen, setze den Titel auf den Namen des Browserfensters, das du ansprechen möchtest.


Tipps für Profis

  • Fehlersuche: Nutze die Debugging-Funktionen in VBA, um den Code Schritt für Schritt zu durchlaufen und mögliche Fehlerquellen schnell zu erkennen.

  • Fenstertitel dynamisch bestimmen: Verwende EnumWindows, um eine Liste aller geöffneten Fenster zu erstellen und den Titel dynamisch abzurufen.

  • Shell.SendKeys optimieren: Wenn du nach Shell.SendKeys suchst, sei vorsichtig, da diese Methode unzuverlässig sein kann. Überlege stattdessen, direkte API-Aufrufe zu nutzen.


FAQ: Häufige Fragen

1. Was ist Shell.AppActivate? Shell.AppActivate ist eine Methode, um ein bereits geöffnetes Anwendungsfenster in Windows zu aktivieren, basierend auf dem Fenstertitel oder dem Prozessnamen.

2. Wie kann ich ein Fenster schließen, ohne andere Fenster zu beeinflussen? Verwende API-Funktionen wie EnumWindows in Kombination mit PostMessage, um gezielt nur das gewünschte Fenster zu schließen.

3. Welche Excel-Version benötige ich für die API-Funktionen? Die beschriebenen API-Funktionen sind in VBA für Excel 2010 und später verfügbar, insbesondere bei der Verwendung der PtrSafe-Anweisung für 64-Bit-Versionen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige