Anzeige
Archiv - Navigation
1740to1744
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

Userform-X-Schaltfläche zum Beenden

Userform-X-Schaltfläche zum Beenden
19.02.2020 10:17:22
Sven
Hallo zusammen,
ich habe ein Makro, mit welchem der Anwender ausschließlich im beim Start der Arbeitsmappe angezeigten Userform arbeitet.
Da die Anwender darauf trainiert sind, eine "Anwendung" durch das X oben rechts zu beenden, machen sie das in diesem Fall auch. Damit wird aber ja lediglich das Userform ausgeblendet und nicht die Mappe geschlossen. Da möglicherweise noch nicht alles gespeichert ist und der Anwender die Arbeitsmappe auch manchmal doppelt auf hat, habe ich ein großes Chaos.
Der beste Weg wäre, dass der Anwender zum Nutzen der vorhandenen "Beenden"-Schaltfläche (die alle Fehler ausräumt) gezwungen würde, indem es kein X gebe. Das scheint aber nicht so einfach realisierbar, weswegen ich mich an diesen Workaround versucht habe:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'Schließen über x verhindern:
If CloseMode = vbFormControlMenu Then
Cancel = True
Call ufMessage("", "Um einen Datenverlust zu verhindern, schließen Sie die Anwendung  _
bitte über die 'Beenden'-Schaltfläche.", 3)
End If
End Sub
Die Folge ist, dass das Userform zwar nicht geschlossen und der Anwender informiert wird, aber irgendwie komme ich in einen Zustand, der Fehler verursacht. Und diese kann ich dooferweise auch nicht mehr durch den Debugger lokalisieren. Die Mappe scheint nicht mehr "ganz geöffnet" zu sein.
Hat jemand eine Idee, wie ich, wenn ich es schon nicht ausblenden, dass X direkt auf die "Beenden"-Schaltfläche "umleiten" kann?
Grüße
Sven

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform-X-Schaltfläche zum Beenden
19.02.2020 10:41:31
Torsten
Hallo Sven,
du kannst den kompletten Rahmen incl. X der Userform ausblenden.
In das Codefenster der Userform ganz oben diesen Code:

Option Explicit
'API's um den Rahmen der Userform auszulenden
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32.dll" ( _
ByVal hWnd As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Any) As Long
Private Declare Function ReleaseCapture Lib "user32.dll" () As Long
Private Const GC_CLASSNAMEMSEXCELFORM = "ThunderDFrame"
Private Const GWL_STYLE = -16
Private Const WS_CAPTION = &HC00000
Private Const HTCAPTION = 2
Private Const WM_NCLBUTTONDOWN = &HA1
Private hWndForm As Long

un dann im Userform_Initialize diesen Code:

hWndForm = FindWindow(GC_CLASSNAMEMSEXCELFORM, Me.Caption)
If hWndForm  0 Then
SetWindowLong hWndForm, GWL_STYLE, GetWindowLong(hWndForm, GWL_STYLE) And Not WS_CAPTION
DrawMenuBar hWndForm
End If

Probiers mal aus.
Gruss Torsten
Anzeige
AW: Userform-X-Schaltfläche zum Beenden
19.02.2020 13:54:56
Sven
Hallo Torsten,
mein Userform hat trotz des Codes weiterhin Rahmen und X... :o(
Grüße
Sven
AW: Userform-X-Schaltfläche zum Beenden
19.02.2020 13:56:52
Torsten
Bei mir nicht. Wie hast du den Code integriert?
Kannst du deine Datei mal hochladen?
AW: Userform Titelleiste ausblenden
20.02.2020 10:31:34
Axel
Hallo Torsten,
ich habe aktuell ein ähnliches Thema. Mit folgendem Code habe ich die Titelleiste des UserForms ausgeblendet und das Verschieben per Maus gesperrt:
Option Explicit
'Titelleiste des UserForms ausblenden
Private Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, ByVal _
lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias _
"GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex _
As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex _
As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal _
hwnd As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Const GWL_STYLE As Long = -16
Private Const WS_CAPTION As Long = &HC00000
Private Const HTCAPTION = 2
Private Const WM_NCLBUTTONDOWN = &HA1
Private hWndForm As Long
Private bCaption As Boolean
Private Sub UserForm_Initialize()
If Val(Application.Version) >= 9 Then
hWndForm = FindWindow("ThunderDFrame", Me.Caption)
Else
hWndForm = FindWindow("ThunderXFrame", Me.Caption)
End If
bCaption = False
SetUserFormStyle
End Sub

Private Sub SetUserFormStyle()
Dim frmStyle As Long
If hWndForm = 0 Then Exit Sub
frmStyle = GetWindowLong(hWndForm, GWL_STYLE)
If bCaption Then
frmStyle = frmStyle Or WS_CAPTION
Else
frmStyle = frmStyle And Not WS_CAPTION
End If
SetWindowLong hWndForm, GWL_STYLE, frmStyle
DrawMenuBar hWndForm
End Sub
'UserForm mit Maus verschieben können (hier durch ausformulieren gesperrt)
'

Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal _
'       Shift As Integer, ByVal X As Single, ByVal Y As Single)
'If hWndForm = 0 Then Exit Sub
'If Button = 1 Then
'  ReleaseCapture
' SendMessage hWndForm, WM_NCLBUTTONDOWN, HTCAPTION, 0
'End If
'End Sub

Private Sub optCaptionOn_Click()
bCaption = True
SetUserFormStyle
End Sub

Private Sub optCaptionOff_Click()
bCaption = False
SetUserFormStyle
End Sub
Du könntest einen zusätzlichen CommandButton "Schließen" einfügen und einen für Dich passenden Code hinterlegen.
Gruß
Axel
Anzeige
AW: Userform-X-Schaltfläche zum Beenden
19.02.2020 13:08:05
Rudi
Hallo,
einfach so
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'Schließen über x verhindern:
If CloseMode = 0 Then
Cancel = True
MsgBox "Um einen Datenverlust zu verhindern, schließen Sie die Anwendung bitte über die  _
'Beenden'-Schaltfläche.", vbOKOnly
End If
End Sub

Private Sub cmdBeenden_Click()
Me.Hide
Unload Me
ThisWorkbook.Close 'True
End Sub

Gruß
Rudi
AW: Userform-X-Schaltfläche zum Beenden
19.02.2020 14:01:24
Sven
Hallo Rudi,
der Code meiner Beenden-Schaltfläche beinhaltete bereits das hier:
    Application.DisplayAlerts = False
ThisWorkbook.Close
Application.DisplayAlerts = True
Me.Hide
Unload Me
Also habe ich nur aus
If CloseMode = vbFormControlMenu Then
If CloseMode = 0 Then

gemacht.
Danach startet die Arbeitsmappe nicht mehr mit dem Userform, sondern mit der Fehlermeldung "Datei nicht gefunden".
Anzeige
AW: Userform-X-Schaltfläche zum Beenden
19.02.2020 14:18:54
Sven
Ah okay, das Problem scheint der Aufruf meiner eigenen Fehlermeldung zu liegen. Auf die Prozedur ufMessage kann in dem Moment wohl nicht mehr zugegriffen werden.
Ich habe es jetzt einfach noch ein wenig gekürzt:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'Schließen über x verhindern:
If CloseMode = 0 Then
Cancel = True
End If
End Sub
Jetzt hat das X einfach gar keine Funktion mehr. Reicht im Zweifelsfall auch.
Was das mit dem ClodeMode auf sich hat, verstehe ich jedoch noch immer nicht.
Danke!
CloseMode...
19.02.2020 16:22:33
Rudi
Hallo,
ist TRUE, wenn die UF durch eine Prozedur geschlossen wird und FALSE, wenn auf das X geklickt wird.
Bzw. 1 oder 0.
Gruß
Rudi
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige