Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Prüfen ob Fenster extistiert

Forumthread: Prüfen ob Fenster extistiert

Prüfen ob Fenster extistiert
Sebastian
Hallo... ich nochmal...
Ich nutze den unten aufgeführten Code um ein Fenster in den Vordergrund zu bringen.
Ist das Fenster nicht geöffnet würde ich gerne den Code beenden, mit eine msgBox "Bitte Progamm öffnen"
an welcher stelle muß ich da was einfügen im Code, vor allem was?
Vielen Dank
Sebastian
Private Function GetWindowInfo(ByVal hwnd&, STitel$, Optional booVisible As Boolean = True) As  _
Long
Dim Result&, Style&, Title$
'Darstellung des Fensters
Style = GetWindowLong(hwnd, GWL_STYLE)
Style = Style And (WS_VISIBLE Or WS_BORDER)
'Fensetrtitel ermitteln
Result = GetWindowTextLength(hwnd) + 1
Title = Space$(Result)
Result = GetWindowText(hwnd, Title, Result)
Title = Left$(Title, Len(Title) - 1)
'prüfen ob Fenster Sichtbar
If (Style = (WS_VISIBLE Or WS_BORDER)) Or booVisible = False Then
If Title Like "*" & STitel & "*" Then
GetWindowInfo = hwnd
Exit Function
End If
End If
GetWindowInfo = 0
End Function

Sub FensterSuchen()
Dim hwnd As Long
Dim STitel As String
STitel = "MeineFenstertitel"
hwnd = GetDesktopWindow()
hwnd = GetWindow(hwnd, GW_CHILD)
GetWindowInfo hwnd, STitel, True
Do While hwnd 0
hwnd = GetWindow(hwnd, GW_HWNDNEXT)
If GetWindowInfo(hwnd, STitel, True) = hwnd Then
ShowWindow hwnd, iNormal 'maximieren
SetForegroundWindow hwnd 'aktivieren
Dim Rec As RECT
GetWindowRect GetForegroundWindow, Rec
End If
Loop
starte_makro
End Sub
Anzeige

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Prüfen ob Fenster extistiert
14.09.2010 15:38:51
JogyB
Hallo Sebastian,
jetzt schreib mal das was Du gepostet hast in ein Modul einer neuen Arbeitsmappe und probier aus, ob irgendwas passiert... merkst Du was? Wie sollen wir Dir helfen, wenn Du einen offensichtlich unvollständigen Code postest? Naja egal, schwer zu finden war der Originalcode ja nicht.
Option Explicit
Private Declare Function GetDesktopWindow Lib "user32" () _
As Long
Private Declare Function GetWindow Lib "user32" (ByVal hWnd _
As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hWnd As Long, ByVal wIndx As _
Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" _
Alias "GetWindowTextLengthA" (ByVal hWnd As Long) _
As Long
Private Declare Function GetWindowText Lib "user32" Alias _
"GetWindowTextA" (ByVal hWnd As Long, ByVal lpString _
As String, ByVal cch As Long) As Long
Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2
Const GW_CHILD = 5
Const WS_VISIBLE = &H10000000
Const WS_BORDER = &H800000
Const GWL_STYLE = (-16)
Function sucheFenster(suchName As String, Optional ByVal teilSuche As Boolean = False, _
Optional ByVal grossKlein As Boolean = False) As Boolean
Dim hWnd As Long
Dim fensterTitel As String
' gross/Kleinschreibung unwichtig?
If Not grossKlein Then suchName = LCase(suchName)
' Nur nach Teil des Namens suchen
If teilSuche Then suchName = "*" & suchName & "*"
'Einstieg
hWnd = GetWindow(GetWindow(GetDesktopWindow(), GW_CHILD), GW_HWNDFIRST)
'Alle vorhandenen Fenster abklappern
Do
fensterTitel = GetWindowInfo(hWnd)
If Not grossKlein Then fensterTitel = LCase(fensterTitel)
If fensterTitel Like suchName Then
sucheFenster = True
Exit Function
End If
hWnd = GetWindow(hWnd, GW_HWNDNEXT)
Loop Until hWnd = 0
End Function
Private Function GetWindowInfo(ByVal hWnd As Long) As String
Dim Result As Long
Dim Title As String
Dim Style As Long
Style = GetWindowLong(hWnd, GWL_STYLE)
Style = Style And (WS_VISIBLE Or WS_BORDER)
'Title des Fenster auslesen
Result = GetWindowTextLength(hWnd) + 1
Title = Space$(Result)
Result = GetWindowText(hWnd, Title, Result)
Title = Left$(Title, Len(Title) - 1)
If Style = (WS_VISIBLE Or WS_BORDER) Then
GetWindowInfo = Title
End If
End Function

Das ist jetzt reduziert aus das, was Du brauchst. Mit der Funktion sucheFenster kannst Du abfragen, ob ein Fenster mit diesem Titel aktiv ist.
Gruß, Jogy
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Fensterprüfung in Excel VBA: So erkennst Du, ob ein Fenster existiert


Schritt-für-Schritt-Anleitung

Um zu überprüfen, ob ein Fenster in Excel VBA existiert, kannst Du die Funktion GetWindowInfo verwenden. Hier ist eine Schritt-für-Schritt-Anleitung, wie Du den Code anpassen kannst, um eine msgBox anzuzeigen, wenn das Fenster nicht geöffnet ist:

  1. Öffne Deine Excel-Anwendung und gehe zu „Entwicklertools“ > „Visual Basic“.
  2. Füge ein neues Modul hinzu, indem Du mit der rechten Maustaste auf „VBAProject“ klickst und „Einfügen“ > „Modul“ wählst.
  3. Kopiere den folgenden Code in das Modul:
Option Explicit
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal wIndx As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2
Const GW_CHILD = 5
Const WS_VISIBLE = &H10000000
Const WS_BORDER = &H800000
Const GWL_STYLE = (-16)

Function GetWindowInfo(ByVal hwnd&, STitel$, Optional booVisible As Boolean = True) As Long
    Dim Result&, Style&, Title$
    Style = GetWindowLong(hwnd, GWL_STYLE)
    Style = Style And (WS_VISIBLE Or WS_BORDER)
    Result = GetWindowTextLength(hwnd) + 1
    Title = Space$(Result)
    Result = GetWindowText(hwnd, Title, Result)
    Title = Left$(Title, Len(Title) - 1)

    If (Style = (WS_VISIBLE Or WS_BORDER)) Or booVisible = False Then
        If Title Like "*" & STitel & "*" Then
            GetWindowInfo = hwnd
            Exit Function
        End If
    End If
    GetWindowInfo = 0
End Function

Sub FensterSuchen()
    Dim hwnd As Long
    Dim STitel As String
    STitel = "MeineFenstertitel"
    hwnd = GetDesktopWindow()
    hwnd = GetWindow(hwnd, GW_CHILD)

    Dim windowExists As Boolean
    windowExists = False

    Do While hwnd <> 0
        If GetWindowInfo(hwnd, STitel, True) = hwnd Then
            ShowWindow hwnd, 1 ' maximieren
            SetForegroundWindow hwnd ' aktivieren
            windowExists = True
            Exit Do
        End If
        hwnd = GetWindow(hwnd, GW_HWNDNEXT)
    Loop

    If Not windowExists Then
        MsgBox "Bitte Programm öffnen"
    End If
End Sub
  1. Ersetze "MeineFenstertitel" durch den Titel des Fensters, das Du überprüfen möchtest.
  2. Starte das Makro FensterSuchen, um zu sehen, ob das Fenster geöffnet ist.

Häufige Fehler und Lösungen

  • Fehler: „Typ nicht definiert“

    • Stelle sicher, dass Du alle benötigten Variablen deklariert hast. Verwende Option Explicit zu Beginn Deines Moduls.
  • Fehler: MsgBox wird nicht angezeigt

    • Überprüfe den Titel des Fensters. Wenn der Titel nicht korrekt ist, wird die MsgBox nicht aufgerufen.
  • Unvollständiger Code

    • Wenn Du nur Teile des Codes einfügst, kann dies dazu führen, dass die Funktion nicht richtig funktioniert. Achte darauf, den gesamten Code zu verwenden, wie oben beschrieben.

Alternative Methoden

Eine alternative Methode zur Überprüfung, ob ein Fenster existiert, ist die Verwendung der Funktion sucheFenster, die ebenfalls im Thread erwähnt wird. Diese Funktion kann einfach in Deinen Code integriert werden:

Function sucheFenster(suchName As String, Optional ByVal teilSuche As Boolean = False, Optional ByVal grossKlein As Boolean = False) As Boolean
    Dim hWnd As Long
    Dim fensterTitel As String

    If Not grossKlein Then suchName = LCase(suchName)
    If teilSuche Then suchName = "*" & suchName & "*"

    hWnd = GetWindow(GetWindow(GetDesktopWindow(), GW_CHILD), GW_HWNDFIRST)

    Do
        fensterTitel = GetWindowInfo(hWnd)
        If Not grossKlein Then fensterTitel = LCase(fensterTitel)
        If fensterTitel Like suchName Then
            sucheFenster = True
            Exit Function
        End If
        hWnd = GetWindow(hWnd, GW_HWNDNEXT)
    Loop Until hWnd = 0
End Function

Du kannst diese Funktion in Deinem FensterSuchen Makro verwenden, um die Fensterprüfung zu optimieren.


Praktische Beispiele

  1. Fenster mit spezifischem Titel suchen: Verwende die Funktion GetWindowInfo und passe den Titel an, um spezifische Anwendungen zu überprüfen.

  2. Teilweise Titelübereinstimmung: Wenn Du nur Teile des Fenstertitels kennst, kannst Du die sucheFenster Funktion nutzen, um eine Übereinstimmung zu finden.


Tipps für Profis

  • Verwende Option Explicit: Dies stellt sicher, dass alle Variablen deklariert sind, was Fehler bei der Ausführung reduziert.
  • Fehlerbehandlung einfügen: Um robustere Makros zu erstellen, füge Fehlerbehandlungsroutinen hinzu, um unerwartete Ausnahmen zu behandeln.
  • Code modularisieren: Teile Deinen Code in kleinere, wiederverwendbare Funktionen auf, um die Lesbarkeit und Wartbarkeit zu verbessern.

FAQ: Häufige Fragen

1. Wie kann ich den Titel eines Fensters herausfinden? Du kannst den Titel eines Fensters herausfinden, indem Du mit der Maus über das Fenster fährst oder das Fenster aktivierst und den Titel in der Titelleiste abliest.

2. Funktioniert dieser Code in Excel 2016? Ja, dieser VBA-Code sollte in Excel 2016 und neueren Versionen problemlos funktionieren. Stelle sicher, dass die „Entwicklertools“ aktiviert sind.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige