Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1404to1408
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Activate Event in einer modeless Userform

Activate Event in einer modeless Userform
03.02.2015 16:18:46
Arthur
Hallo Forum.
Meiner Ansicht nach sollte der Activate Event einer Userform immer dann anspringen, wenn das Fenster aktiviert wird. Die Aktivierung wiederum geschieht meiner Ansicht nach dann, wenn von einem anderen Fenster auf die Form geklickt wird, erkennbar an der Blaufärbung im Rahmen.
... tut's aber nicht.
Im angehängten Beispiel (einfache Exceldatei mit lediglich einer leeren Userform) sollte, wenn zwischen Worksheet und Userform hin und her geklickt wird stets die aktuelle Zeit in die Zelle A1 geschrieben werden.
https://www.herber.de/bbs/user/95522.xlsm
Warum passiert das nicht?
Gruß, Arthur

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Activate Event in einer modeless Userform
03.02.2015 16:43:06
Rudi
Hallo,
Activate springt nur bei .Show an.
Nimm Click.
Gruß
Rudi

AW: Activate Event in einer modeless Userform
03.02.2015 16:46:44
Matze
Hallo Arthur,
die Uf ist doch schon offen somit hat das Activate oder auch inizialize seinen dienst schon verrichtet.
Nimm mal dies :
Private Sub UserForm_Click()
ThisWorkbook.ActiveSheet.Cells(1, 1) = Time()
End Sub
bei jeden Click auf die Uf würde dann die Zeit geändert
Gruß Matze

Click, bei Steuerelementen auf der Form
03.02.2015 16:57:51
Arthur
Hallo, Danke schon mal.
Activate (im Sinne, dass die UF den Fokus bekommt) wäre zu schön.
Der Click-Event ist eine Art Ausweg. Jedoch hat die betroffene Userform Steuerelemente (CommandButtons, Rahmen, Listenfelder, etc. Der Click-Event wird dann nur ausgelöst, wenn direkt auf den Hintergrund der UF klickt. Gibt es eine kleine Routine, die den Clickevent für alle Elemente der UF einschließt?
Gruß, Arthur

Anzeige
Click, bei Steuerelementen auf der Form
03.02.2015 16:58:01
Arthur
Hallo, Danke schon mal.
Activate (im Sinne, dass die UF den Fokus bekommt) wäre zu schön.
Der Click-Event ist eine Art Ausweg. Jedoch hat die betroffene Userform Steuerelemente (CommandButtons, Rahmen, Listenfelder, etc. Der Click-Event wird dann nur ausgelöst, wenn direkt auf den Hintergrund der UF klickt. Gibt es eine kleine Routine, die den Clickevent für alle Elemente der UF einschließt?
Gruß, Arthur

AW: Click, bei Steuerelementen auf der Form
03.02.2015 17:11:40
Matze
Hallo Arthur,
- nein
Verstehe aber auch nicht wozu du das brauchst, wenn du vom Blatt auf die UF wechselt musst du diese doch anklicken somit ist doch das was du wolltest gegeben.
ansonsten musste dir einen Button für die Aufgabe auf die Uf legen
Gruß Matze

Anzeige
Click UF <> Click Steuerelement <<>> Activate
03.02.2015 17:55:15
Arthur
Hallo Matze.
Der Click-Event hat schon ein paar Nachteile. Einmal möchte ich nur dann reagieren, wenn zuvor das Fenster inaktiv (grau, nicht blau) war. Zum anderen muss der Click nicht auf die Form sondern kann auch direkt auf bspw. eine Listbox passieren. Die UF bekommt das dann nicht mit. Dies bedeutet, dass a) bei jedem Klick eine Aktion ausgeführt wird und b), dass sowohl in der UF, als auch bei jedem Steuerelement der Klick abgefangen und richtog interpretiert werden muss.
Gruß, Arthur

... noch offen vergessen ;o)
03.02.2015 17:57:12
Arthur

AW: ... noch offen vergessen ;o)
03.02.2015 22:25:52
Mullit
Hallo Arthur,
da wirst Du etwas mehr Gummi geben und Dir bspw. mit dem Api-Timer was bauen müssen:
' ********************************************************************** 
' Modul: UserForm1 Typ: Userform 
' ********************************************************************** 

Option Explicit

Private mblnActivate As Boolean

Private Sub UserForm_Activate()
mblnActivate = Not mblnActivate
Call prcStartTimer
End Sub

Private Sub UserForm_Terminate()
If mblnActivate Then _
  mblnActivate = Not mblnActivate
Call prcStopTimer
End Sub

Friend Property Get prpblnActivate() As Boolean
 prpblnActivate = mblnActivate
End Property

Friend Property Let prpblnActivate(ByVal pvblnVariable As Boolean)
 mblnActivate = pvblnVariable
End Property

' ********************************************************************** 
' Modul:  Typ: Standardmodul 
' ********************************************************************** 

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
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
     ByVal lpClassName As String, _
     ByVal lpWindowName As String) As Long
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long

Private Const GC_CLASSNAMEMSEXCELFORM As String = "ThunderDFrame"

Private llngHwnd As Long

Public Sub prcStartTimer()
  llngHwnd = FindWindow(GC_CLASSNAMEMSEXCELFORM, UserForm1.Caption)
  SetTimer llngHwnd, 0&, 1&, AddressOf TimerProc
End Sub

Public Sub prcStopTimer()
  KillTimer llngHwnd, 0&
End Sub

Private Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, _
    ByVal uElapse As Long, ByVal lpTimerFunc As Long)
 Static sblnInit As Boolean
 With UserForm1
     If GetForegroundWindow = llngHwnd Then
       If Not .prpblnActivate And Not sblnInit Then
           Call prcMyProg
           sblnInit = Not sblnInit
       End If
     Else
        If .prpblnActivate Then _
          .prpblnActivate = Not .prpblnActivate
        If sblnInit Then _
          sblnInit = Not sblnInit
     End If
 End With
End Sub

Private Sub prcMyProg()
 MsgBox "Click"
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 12

Gruß, Mullit

Anzeige
Daumen hoch :)
04.02.2015 09:50:24
Arthur
Hallo Mullit.
Super Dank. Über diesen Weg bekommt die UF ihren 'Activate'.
Gruß, Arthur

AW: Daumen hoch :)
04.02.2015 17:46:03
Mullit
Hallo Arthur,
prima, da besteht noch Kürzungsbedarf: der ganze Static-Crap kann raus...
' ********************************************************************** 
' Modul: UserForm1 Typ: Userform 
' ********************************************************************** 

Option Explicit

Private mblnActivate As Boolean

Private Sub UserForm_Activate()
mblnActivate = Not mblnActivate
Call prcStartTimer
End Sub

Private Sub UserForm_Terminate()
Call prcStopTimer
End Sub

Friend Property Get prpblnActivate() As Boolean
 prpblnActivate = mblnActivate
End Property

Friend Property Let prpblnActivate(ByVal pvblnVariable As Boolean)
 mblnActivate = pvblnVariable
End Property

' ********************************************************************** 
' Modul:  Typ: Standardmodul 
' ********************************************************************** 

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
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
     ByVal lpClassName As String, _
     ByVal lpWindowName As String) As Long
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long

Private Const GC_CLASSNAMEMSEXCELFORM As String = "ThunderDFrame"

Private llngHwnd As Long

Public Sub prcStartTimer()
  llngHwnd = FindWindow(GC_CLASSNAMEMSEXCELFORM, UserForm1.Caption)
  SetTimer llngHwnd, 0&, 1&, AddressOf TimerProc
End Sub

Public Sub prcStopTimer()
  KillTimer llngHwnd, 0&
End Sub

Private Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, _
    ByVal uElapse As Long, ByVal lpTimerFunc As Long)
 With UserForm1
     If GetForegroundWindow = llngHwnd Then
       If Not .prpblnActivate Then
           Call prcMyProg
           .prpblnActivate = Not .prpblnActivate
       End If
     Else
        If .prpblnActivate Then _
          .prpblnActivate = Not .prpblnActivate
     End If
 End With
End Sub

Private Sub prcMyProg()
 MsgBox "Click"
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 12

Gruß, Mullit

Anzeige
AW: Daumen hoch :)
05.02.2015 08:28:01
Mullit
Hallo,
[edit] Da kann man sich die Klassenvariable auch gleich sparen, so sieht's doch nach was aus...
' ********************************************************************** 
' Modul: UserForm1 Typ: Userform 
' ********************************************************************** 

Option Explicit

Private Sub UserForm_Activate()
Call prcStartTimer
End Sub

Private Sub UserForm_Terminate()
Call prcStopTimer
End Sub

' ********************************************************************** 
' Modul:  Typ: Standardmodul 
' ********************************************************************** 

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
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
     ByVal lpClassName As String, _
     ByVal lpWindowName As String) As Long
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long

Private Const GC_CLASSNAMEMSEXCELFORM As String = "ThunderDFrame"

Private llngHwnd As Long
Private lblnActivate As Boolean

Public Sub prcStartTimer()
  llngHwnd = FindWindow(GC_CLASSNAMEMSEXCELFORM, UserForm1.Caption)
  SetTimer llngHwnd, 0&, 1&, AddressOf TimerProc
End Sub

Public Sub prcStopTimer()
  KillTimer llngHwnd, 0&
  If lblnActivate Then _
    lblnActivate = Not lblnActivate
End Sub

Private Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, _
    ByVal uElapse As Long, ByVal lpTimerFunc As Long)
     If GetForegroundWindow = llngHwnd Then
       If lblnActivate Then
           Call prcMyProg
           lblnActivate = Not lblnActivate
       End If
     Else
        If Not lblnActivate Then _
          lblnActivate = Not lblnActivate
     End If
End Sub

Private Sub prcMyProg()
 MsgBox "Click"
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 14

Gruß, Mullit
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige