Live-Forum - Die aktuellen Beiträge
Datum
Titel
16.10.2025 17:40:39
16.10.2025 17:25:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Event-Ereignis "Excel erhält/verliert Fokus"?

Forumthread: Event-Ereignis "Excel erhält/verliert Fokus"?

Event-Ereignis "Excel erhält/verliert Fokus"?
Guido
Hallo.
Ich habe ein Makro, das die Bildschirmauflösung umstellt, wenn eine Datei geöffnet wird und sie wieder zurückstellt, wenn die Datei geschlossen wird (Workbook_Open / Workbook_BeforeClose).
Nun wollen wir die Umstellung dann haben, wenn Excel den Fokus bekommt (z.B. weil man mit einem anderen Programm gearbeitet hat) bzw. wieder verliert. Welcher Event ist dafür zuständig? Am liebsten bitte mit Beispiel.
Danke, Guido
Anzeige

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

Betreff
Benutzer
Anzeige
Dafür gibts keinen Event!
16.03.2010 13:57:33
Renee
Hallo Guido,
Das kannst du nicht innerhalb EXCEL mit VBA programmieren, sondern nur von aussen mit einem Process-Monitor und das liegt vermutlich ausserhalb deiner Reichweite!
Es ist mir schleierhaft wie man auf solchen Lösungsansätze kommt. EXCEL hat doch auch eine Zoom-Funktion.
GreetZ Renée
Anzeige
AW: Dafür gibts keinen Event!
16.03.2010 14:06:53
Guido
Ja, weiß schon, das war ja auch meine Idee.
Die Vorgabe mit der Veränderung der Auflösung hab ich mir nicht selbst ausgedacht ...
Trotzdem danke.
Guido
AW: Dann machen wir einfach einen
16.03.2010 17:17:13
Nepumuk
Hi,
was nicht geht, bekommt Räder verpasst, damit das Ding rollt:
' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call prcStop
End Sub

Private Sub Workbook_Open()
    blnActiv = True
    Call prcStart
End Sub

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit
Option Private Module

Private Declare Function SetTimer Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal nIDEvent As Long, _
    ByVal uElapse As Long, _
    ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal nIDEvent As Long) As Long
Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function GetActiveWindow Lib "user32.dll" () As Long

Private Const GC_CLASSNAMEMSEXCEL = "XLMAIN"

Private lnghWnd As Long
Public blnActiv As Boolean

Public Sub prcStart()
    lnghWnd = FindWindow(GC_CLASSNAMEMSEXCEL, Application.Caption)
    Call SetTimer(lnghWnd, 0, 100, AddressOf TimerProc)
End Sub

Public Sub prcStop()
    Call KillTimer(lnghWnd, 0)
End Sub

Private Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, _
        ByVal uElapse As Long, ByVal lpTimerFunc As Long)

    If GetActiveWindow = lnghWnd Then
        If Not blnActiv Then
            Call prcYour_Procedur 'Aufruf deiner Prozedur
            blnActiv = True
        End If
    Else
        blnActiv = False
    End If
End Sub

Private Sub prcYour_Procedur() 'Deine Prozedur
    Static intIndex As Integer
    intIndex = intIndex + 1
    MsgBox "Excel agree focus " & CStr(intIndex) & ". time", 64, "Info"
End Sub

Gruß
Nepumuk
Anzeige
Danke, interessanterweise....
16.03.2010 17:32:48
NoNet
Hallo Nepumuk,
danke auch von meiner Seite für dieses Codebeispiel !
Interessanterweise wird das Event auch dann ausgelöst, wenn innerhalb der Mappe ein Tabellenblatt gelöscht wird.
Verliert die Excel-Applikation dabei temporär den Focus oder den Handle ?
Gruß, NoNet
AW: Danke, interessanterweise....
17.03.2010 14:55:16
Nepumuk
Hallo NoNet,
klar, kommt doch eine MsgBox in den Vordergrund. Es erfolgt (noch) keine Abfrage, ob das ein Childwindow ist. Aber du darfst natürlich gerne weiterbasteln.
Gruß
Nepumuk
Anzeige
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Excel Ereignisse: Fokus erhalten oder verlieren


Schritt-für-Schritt-Anleitung

Um in Excel ein Makro zu erstellen, das auf das Ereignis "Fokus erhalten" oder "Fokus verlieren" reagiert, kannst du die Windows-API nutzen. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Neues Modul einfügen: Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.

  3. Code einfügen: Füge folgenden Code in das Modul ein:

    Option Explicit
    
    Private Declare Function SetTimer Lib "user32.dll" ( _
       ByVal hwnd As Long, _
       ByVal nIDEvent As Long, _
       ByVal uElapse As Long, _
       ByVal lpTimerFunc As Long) As Long
    
    Private Declare Function KillTimer Lib "user32.dll" ( _
       ByVal hwnd As Long, _
       ByVal nIDEvent As Long) As Long
    
    Private Declare Function GetActiveWindow Lib "user32.dll" () As Long
    
    Private Const GC_CLASSNAMEMSEXCEL = "XLMAIN"
    
    Private lnghWnd As Long
    Private blnActiv As Boolean
    
    Public Sub prcStart()
       lnghWnd = FindWindow(GC_CLASSNAMEMSEXCEL, Application.Caption)
       Call SetTimer(lnghWnd, 0, 100, AddressOf TimerProc)
    End Sub
    
    Public Sub prcStop()
       Call KillTimer(lnghWnd, 0)
    End Sub
    
    Private Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long)
       If GetActiveWindow = lnghWnd Then
           If Not blnActiv Then
               MsgBox "Excel hat den Fokus erhalten!"
               blnActiv = True
           End If
       Else
           blnActiv = False
       End If
    End Sub
  4. Makro starten: Rufe prcStart() auf, um den Timer zu starten, der das Ereignis überwacht.


Häufige Fehler und Lösungen

  • Fehler: "Typ nicht definiert"
    Lösung: Stelle sicher, dass du die korrekten Declare-Anweisungen in deinem Code hast. Diese sind notwendig, um die Windows-API aufzurufen.

  • Fehler: Makro wird nicht ausgeführt
    Lösung: Überprüfe deine Sicherheitseinstellungen in Excel und aktiviere die Ausführung von Makros.


Alternative Methoden

Wenn du keine Windows-API verwenden möchtest, könntest du auch ein Timer-Objekt in VBA nutzen. Hier ist ein einfaches Beispiel:

Sub StartTimer()
    Application.OnTime Now + TimeValue("00:00:01"), "CheckFocus"
End Sub

Sub CheckFocus()
    If Application.WindowState = xlMinimized Then
        MsgBox "Excel ist minimiert!"
    End If
    StartTimer
End Sub

Diese Methode ist jedoch weniger präzise als die Verwendung der Windows-API.


Praktische Beispiele

Ein praktisches Beispiel für die Verwendung des obigen Codes könnte wie folgt aussehen:

  1. Makro für das Öffnen von Excel: Wenn Excel geöffnet wird, kannst du den Fokus überprüfen und eine Nachricht anzeigen.
  2. Makro für spezifische Aktionen: Du könntest auch spezifische Aktionen ausführen, wenn Excel den Fokus erhält, wie das Ändern von Zellformatierungen oder das Aktualisieren von Daten.

Tipps für Profis

  • Verwende Debugging: Nutze Debug.Print, um Informationen während der Ausführung des Codes zu protokollieren.
  • Erstelle benutzerdefinierte Ereignisse: Du kannst auch eigene Ereignisse definieren, um spezifische Aktionen auszulösen, wenn Excel den Fokus erhält oder verliert.
  • Optimiere den Timer: Reduziere die Zeitintervalle im SetTimer, um die Reaktionsgeschwindigkeit zu erhöhen, aber achte darauf, die Systemressourcen nicht übermäßig zu belasten.

FAQ: Häufige Fragen

1. Kann ich das Ereignis auch für andere Anwendungen nutzen?
Ja, jedoch musst du den Code entsprechend anpassen, um mit der spezifischen Anwendung zu interagieren.

2. Funktioniert dieser Code in allen Excel-Versionen?
Der Code sollte in den meisten modernen Excel-Versionen funktionieren, aber teste ihn in deiner spezifischen Version, um sicherzustellen, dass alles reibungslos läuft.

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