Anzeige
Archiv - Navigation
1916to1920
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

Schwebende Userform

Schwebende Userform
25.01.2023 16:15:53
Dr.Gert
Ich arbeite an einem Workbook mit mehreren Blättern mit schlichten Tabellen ohne Formeln. Darüber möchte ich eine Userform mit einem Button und einem Textfeld mit konstantem Hilfetext auf allen Blättern (also gewissermaßen "schwebend") anzeigen. Wegen der Sicht auf die Daten muss es aber möglich sein, die Userform über den x-Button vorübergehend auszublenden. Dafür muss nicht in die Platzierung eingegriffen werden. Beim sequentiellen Ergänzen von Blättern sollen extra Worksheet_Activate-events vermieden werden. Ich habe übrigens schon genug Userformen entworfen, so dass da nichts schief gehen sollte. Aber die Recherche zum Kernproblem brachte bisher keine Lösung.
Offenbar spielt eine zentrale Rolle das Kommando SchwebForm.Showmodal = False. Das leuchtet auch ein, denn ich muss die Tabelle ggf. komplett einsehen und auch von Hand ändern können. Jedenfalls bin ich am Ende meines Lateins. Wo im VBA-Projekt-Explorer und in welchen Ereignissen muss wie eingegriffen werden? Notfalls liefere ich noch ein Beispiel

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

Betreff
Datum
Anwender
Anzeige
AW: Schwebende Userform
25.01.2023 16:49:30
Nepumuk
Hallo Gert,
teste mal in einem neuen Userform:
Option Explicit
#If Win64 Then
    Private Declare PtrSafe Function GetWindowLongPtr Lib "user32.dll" Alias "GetWindowLongPtrA" ( _
        ByVal Hwnd As LongPtr, _
        ByVal nIndex As Long) As LongPtr
    Private Declare PtrSafe Function SetWindowLongPtr Lib "user32.dll" Alias "SetWindowLongPtrA" ( _
        ByVal Hwnd As LongPtr, _
        ByVal nIndex As Long, _
        ByVal dwNewLong As LongPtr) As LongPtr
#Else
    Private Declare PtrSafe Function GetWindowLongPtr Lib "user32.dll" Alias "GetWindowLongA" ( _
        ByVal Hwnd As LongPtr, _
        ByVal nIndex As Long) As LongPtr
    Private Declare PtrSafe Function SetWindowLongPtr Lib "user32.dll" Alias "SetWindowLongA" ( _
        ByVal Hwnd As LongPtr, _
        ByVal nIndex As Long, _
        ByVal dwNewLong As LongPtr) As LongPtr
#End If
Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function ShowWindow Lib "user32.dll" ( _
    ByVal Hwnd As LongPtr, _
    ByVal nCmdShow As Long) As Long
Private Const SW_HIDE As Long = 0
Private Const SW_SHOW As Long = 5
Private Const GWL_EXSTYLE As Long = -20
Private Const GWL_STYLE As Long = -16
Private Const WS_EX_APPWINDOW As LongPtr = &H40000
Private Const WS_MAXIMIZEBOX As LongPtr = &H10000
Private Const WS_MINIMIZEBOX As LongPtr = &H20000
Private Const WS_THICKFRAME As LongPtr = &H40000
Private Const WS_SYSMENU As LongPtr = &H80000
Private Const GC_CLASSNAME_USERFORM As String = "ThunderDFrame"
Private mlngptrHandle As LongPtr
Private Sub UserForm_Activate()
    Dim lngptrStyle As LongPtr
    Call ShowWindow(Handle, SW_HIDE)
    lngptrStyle = GetWindowLongPtr(Handle, GWL_EXSTYLE)
    lngptrStyle = lngptrStyle Or WS_EX_APPWINDOW
    Call SetWindowLongPtr(Handle, GWL_EXSTYLE, lngptrStyle)
    Call ShowWindow(Handle, SW_SHOW)
End Sub
Private Sub UserForm_Initialize()
    Dim lngptrStyle As LongPtr
    Handle = FindWindowA(GC_CLASSNAME_USERFORM, Caption)
    lngptrStyle = GetWindowLongPtr(Handle, GWL_STYLE)
    lngptrStyle = lngptrStyle Or WS_SYSMENU Or WS_MINIMIZEBOX
    Call SetWindowLongPtr(Handle, GWL_STYLE, lngptrStyle)
End Sub
Private Property Get Handle() As LongPtr
    Handle = mlngptrHandle
End Property
Private Property Let Handle(ByVal pvlngptrHandle As LongPtr)
    mlngptrHandle = pvlngptrHandle
End Property
Gruß
Nepumuk
Anzeige
AW: Schwebende Userform
26.01.2023 07:53:43
Dr.Gert
Hallo Nepumuk
Teste mal in einem neuen Userform

Danke für den detaillierten VBA-Code
Ich habe in einer trivialen .xlsm mit 3 leeren Blättern eine neue Userform angelegt. Es ist nur eine leere Box. Und unter deren Code habe ich Deinen gesamten Quelltext eingeführt. Beim Start der .xlsm passiert nichts.
An welcher (einen?) Stelle wäre denn der Code einzufügen?

AW: Schwebende Userform
26.01.2023 08:56:06
Nepumuk
Hallo,
der Code muss in das Modul des Userforms. Er erzeugt im Systemmenü des Userforms einen Minimieren-Button, mit dem du das Userform minimieren kannst. Zusätzlich wird das Userform in der Taskleiste angezeigt mit dem du es wieder sichtbar machen kannst.
Gruß
Nepumuk
Anzeige
AW: Schwebende Userform
25.01.2023 17:29:50
onur
Was ich deiner Beschreibung nicht eindeutig entnehmen konnte:
"muss es aber möglich sein, die Userform über den x-Button vorübergehend auszublenden" - und wann bzw wie wieder eingeblendet werden ?
"konstantem Hilfetext auf allen Blättern" - heisst das, dass der Text immer der selbe bleibt, egal in welcher Zelle bzw auf welchem Blatt man ist?
AW: Schwebende Userform
26.01.2023 07:17:47
Dr.Gert
Hallo Onur,
"muss es aber möglich sein, die Userform über den x-Button vorübergehend auszublenden" - und wann bzw wie wieder eingeblendet werden ?
Wieder eingeblendet werden könnte beim Wechsel in ein anderes Blatt

"konstantem Hilfetext auf allen Blättern" - heisst das, dass der Text immer der selbe bleibt, egal in welcher Zelle bzw auf welchem Blatt man ist?
Der Text bleibt als Hilfetext konstant.
Anzeige
AW: Schwebende Userform
26.01.2023 08:26:45
Dr.Gert
Beim Aufruf der Excel-Datei werden zwar die Blätter angezeigt, aber die besonders farbig angelegte Userform ist nirgends zu sehen. Ich wollte erreichen, dass die Userform über jedem angewählten Blatt zu sehen ist. Muss ich noch irgend etwas beachten?
AW: Schwebende Userform
26.01.2023 10:52:50
Daniel
Hi
erstmal, etwas klassische höflichkeit würde deinem Beitrag nicht schaden.
1. ja du musst die Userformeigenschaft ShowModal = False setzen (am besten in der Eigenschaftsliste)
2. damit du die Userform einfach Starten kannst und das von jedem Tabellenblatt aus, kannst du im Modul "DieseArbeitsmappe" das Event
Workbook_SheetBeforeDoubleClick verwenden. (oder RightClick, je nach geschmack). Das läuft dann in jedem Blatt der Mappe, auch wenn du weitere Blätter hinzufügst.
Gruß Daniel
Anzeige
AW: Schwebende Userform
26.01.2023 14:50:26
Dr.Gert
An alle die sich an diesem Thread beteiligt haben erstmal ein Dankeschön. Am Ende ergab sich durch vielfaches Probieren die folgende relativ simple Lösung:
Unter 'Modul1' die Sub 'VorZurück', die von der Schaltfläche auf der Userform aufgerufen wird und eine beliebige Funktionalität beinhalten kann.
Unter 'DieseArbeitsmappe' im event Workbook_Open u.a. der Aufruf der Userform 'SchwebForm':

Option Explicit
Private Sub Workbook_Open()
  Sheets(1).Activate
  SchwebForm.Show
End Sub

Unter Tabellen kein relevanter Code.
Im Code der Userform 'SchwebForm' das Button-Event und die Initialisierung der Userform
Private Sub CommandButton1_Click()
  Call VorZurück
End Sub
Private Sub UserForm_Initialize()
  With SchwebForm
    .StartUpPosition = 0 'links oben
    
    Me.Top = Application.Top + (Application.UsableHeight) - (Me.Height)
    Me.Left = Application.Left + Application.UsableWidth - 400
  End With
End Sub

Das Verhalten:
Die Userform 'Schwebform' wird nach dem Start an einer vorbestimmten Stelle ortsfest angezeigt.
Sie behält ihre Position auch, wenn das Excel-Fenster verschoben oder die Tabelle gescrollt wird.
Andererseits lässt sich die Userform beliebig verschieben und behält dann auch beim Blättern ihre Position bis zum Neustart. Der x-Button führt zum Schließen und lässt sich nur nach Neustart reaktivieren. Bisher existiert weder ein zwingender Bedarf, das Schließen des Fensters zu verhindern noch den x-Button zu sperren.
Anzeige
AW: Schwebende Userform
26.01.2023 14:56:32
Dr.Gert
Nachtrag: Es soll nicht unerwähnt bleiben, das unter den Eigenschaften der Schwebform die Option ShowModal = False eingestellt wurde

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige