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

Forumthread: Userform ohne Titelleiste

Userform ohne Titelleiste
28.01.2019 18:21:31
philipp
Guten Abend,
ich habe eine Datei gefunden (ausForum), da wird die UF ohne
Rahmen dargestellt.
Nun weiß ich nicht, was ich ändern muss um die UF in die Richtige
Position zu bringen.
Ich möchte gern das die UF genau passend in meine Zeile1 eingepaßt
wird und sich dann nicht verschiebt.
Anbei das Makro, welches dazu gehört.
mfg
philipp
Option Explicit
' Userform mit einem CommandButton (CoEnde), um die Userform
' zu schließen. Mit rechtsklick auf die Maus in der Userform
' wird diese ebenfalls geschlossen. Abschnitt:
' UserForm_MouseDown zum Schließen, dieser Teil ist auskommentiert
' von GraFri
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, _
ByVal wCmd As Long) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As _
Long, lpRect As RECT) As Long
Private Declare Function ReleaseCapture Lib "user32" () 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 CreateRectRgn Lib "gdi32" (ByVal X1 As Long, _
ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, _
ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private FensterRegion&, Region&
Private Hauptfensternummer&, Clientfensternummer&
Private dummy As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Const GW_CHILD = 5
Private Const WM_NCLBUTTONDOWN = &HA1
Private Const HTCAPTION = 2
Private Sub UserForm_Initialize()
Call FensterOhneKopf
End Sub
Sub FensterOhneKopf()
Dim Abmessung As RECT
Dim Abmessung1 As RECT
Dim Pos1x&, Pos1y&, Pos2x&, Pos2y&
If FensterRegion 0 Then Exit Sub
UserForm1.BorderStyle = fmBorderStyleSingle
Call Fensternummer(UserForm1, Abmessung, Abmessung1)
Pos1x = 0
Pos1y = (Abmessung1.Top - Abmessung.Top)
Pos2x = Abmessung.Right - Abmessung.Left
Pos2y = Abmessung.Bottom - Abmessung.Top
Region = CreateRectRgn(Pos1x, Pos1y, Pos2x, Pos2y)
FensterRegion = SetWindowRgn(Hauptfensternummer, Region, True)
End Sub 'Fensterhandles und Infos über Fenster holen
Private Sub Fensternummer(Form As Object, Abmessung As RECT, Abmessung1 As RECT)
Dim Fenstername$, Suchstring$
Suchstring = "UserForm ohne Titelzeile"
Fenstername = Form.Caption
Form.Caption = Suchstring
Hauptfensternummer = FindWindow(vbNullString, Suchstring)
Form.Caption = Fenstername
Clientfensternummer = GetWindow(Hauptfensternummer, GW_CHILD)
dummy = GetWindowRect(Hauptfensternummer, Abmessung)
dummy = GetWindowRect(Clientfensternummer, Abmessung1)
End Sub
'Folgendes ist notwendig, um die Form ohne Titelleiste zu verschieben
'

Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
'ByVal X As Single, ByVal Y As Single)
'    If Button = 1 Then
'        If Hauptfensternummer  0 Then
'            dummy = ReleaseCapture()
'            dummy = SendMessage(Hauptfensternummer, WM_NCLBUTTONDOWN, HTCAPTION, 0)
'        End If
'    Else
'        Unload UserForm1 ' zum Schließen, beim Ausprobieren.
'    End If
'End Sub

Private Sub CoEnde_Click()
Unload Me
End Sub

Anzeige

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform ohne Titelleiste, hab übersehen
28.01.2019 18:38:00
philipp
Hallo zusammen,
habe übersehen, das letzte Makro ist für das Festnageln.
Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
'ByVal X As Single, ByVal Y As Single)
'    If Button = 1 Then
'        If Hauptfensternummer  0 Then
'            dummy = ReleaseCapture()
'            dummy = SendMessage(Hauptfensternummer, WM_NCLBUTTONDOWN, HTCAPTION, 0)
'        End If
'    Else
'        Unload UserForm1 ' zum Schließen, beim Ausprobieren.
'    End If
'End Sub

Aber wo kann ich jetzt einstellen, damit die UF direkt neben der Zeile 1 und Spalte A
positioniert wird also direkt in der Ecke.
gruß philipp
Anzeige
Ich habs aber die Auflösung...
28.01.2019 18:51:07
philipp
Hallo zusammen,
so habe ich eingesetzt:
With UserForm1
.StartUpPosition = 0
.Top = 124
.Left = 20
End With
Funktioniert bei Aflösung: 1920X1200 in Excel 2007
Aber das Problem, bei der Auflösung 1920x1080 auch Excel 2007
beim anderen PC nicht, da ist die UF genau über die ABC Beschriftungsleiste.
gruß philipp
Anzeige
AW: Userform ohne Titelleiste, hab übersehen
28.01.2019 19:21:31
Nepumuk
Hallo Philipp,
teste mal:
Option Explicit

Private Declare Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLongA Lib "user32.dll" ( _
    ByVal hWnd As Long, _
    ByVal nIndex As Long) As Long
Private Declare Function SetWindowLongA Lib "user32.dll" ( _
    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 SendMessageA Lib "user32.dll" ( _
    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 Declare Function MoveWindow Lib "user32.dll" ( _
    ByVal hWnd As Long, _
    ByVal X As Long, _
    ByVal Y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal bRepaint As Long) As Long
Private Declare Function IsThemeActive Lib "uxtheme.dll" () As Long

Private Const GC_CLASSNAMEMSUSERFORM As String = "ThunderDFrame"
Private Const GWL_STYLE As Long = -16&
Private Const WS_CAPTION As Long = &HC00000
Private Const HTCAPTION As Long = 2&
Private Const WM_NCLBUTTONDOWN As Long = &HA1
Private Const POINT_TO_PIXEL As Double = 0.75

Private mlngHwndForm As Long

Private Sub CommandButton1_Click()
    Call Unload(Object:=Me)
End Sub

Private Sub UserForm_Initialize()
    Dim lngStyle As Long
    mlngHwndForm = FindWindowA(GC_CLASSNAMEMSUSERFORM, Caption)
    lngStyle = GetWindowLongA(mlngHwndForm, GWL_STYLE)
    lngStyle = lngStyle And Not WS_CAPTION
    Call SetWindowLongA(mlngHwndForm, GWL_STYLE, lngStyle)
    Call DrawMenuBar(mlngHwndForm)
    If IsThemeActive = 1 Then
        Height = Height - 16
    Else
        Height = Height - 14
    End If
End Sub

Private Sub UserForm_Layout()
    Dim lngLeft As Long, lngTop As Long
    With ActiveSheet.Cells(1, 1)
        lngLeft = ActiveWindow.PointsToScreenPixelsX(.Left / POINT_TO_PIXEL)
        lngTop = ActiveWindow.PointsToScreenPixelsY(.Top / POINT_TO_PIXEL)
    End With
    Call MoveWindow(mlngHwndForm, lngLeft, lngTop, _
        Width / POINT_TO_PIXEL, Height / POINT_TO_PIXEL, 1)
End Sub

Private Sub UserForm_MouseDown(ByVal Button As Integer, _
        ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

    If Button = 1 Then
        Call ReleaseCapture
        Call SendMessageA(mlngHwndForm, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    End If
End Sub

Gruß
Nepumuk
Anzeige
Leider nichts angezeigt
28.01.2019 19:38:44
philipp
Hallo Nepumuk,
habe kompl. deine Makros in die UF reinkopiert.
Leider sehe ich keine UF und ich kann auch die Tabelle nicht schließen.
mfg
philipp
AW: Leider nichts angezeigt
28.01.2019 19:45:55
Nepumuk
Hallo Philipp,
kann ich nicht nachvollziehen. Siehe: https://www.herber.de/bbs/user/127225.xlsm
Ich kenne deine Userform nicht.
Gruß
Nepumuk
Anzeige
Sorry aber ich sehe nicht die UF
28.01.2019 19:50:48
philipp
Hallo Nepumuk,
habe deine Datei geladen, sehe aber keine UF !!!
Habe hier mit F8 gestartet: Private Sub UserForm_Initialize()
Was ist den Falsch bei mir ?
gruß philipp
Habe jetzt...
28.01.2019 19:55:00
philipp
Hallo Nepumuk,
habe jetzt das VB Projekt klein gemacht, sobald ich mit F8 starte sehe ich links die
UF, gehe ich darauf ist diese weg !
Und ich kann nichts betätigen.
gruß
philipp
Anzeige
AW: Habe jetzt...
28.01.2019 19:58:06
Nepumuk
Hallo Philipp,
bei mir (Excel 2013) funktioniert das ohne Probleme. Ich lass die Frage mal offen.
Gruß
Nepumuk
AW: Habe jetzt...
28.01.2019 19:58:53
philipp
Hallo,
habe jetzt rausgenommen:
'

Private Sub UserForm_MouseDown(ByVal Button As Integer, _
'    ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'    If Button = 1 Then
'       Call ReleaseCapture
'      Call SendMessageA(mlngHwndForm, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
'   End If
'End Sub
sehe UF kann aber in Tabelle nicht arbeiten.
gruß philipp
Anzeige
AW: Habe jetzt...
28.01.2019 20:02:14
Nepumuk
Hallo Philipp,
setze die ShowModal-Eigenschaft des Userforms auf False.
Und gib bitte beim nächsten mal etwas umfangreichere Informationen oder lade eine Mustermappe hoch.
Gruß
Nepumuk
Habe ich gemacht, leider ...
28.01.2019 20:10:32
philipp
Hallo Nepumuk,
wenn ich jetzt mit F8 im VB Makro starte, geht sofort in Tabelle
aber keine UF ?
Ich habe ja 2007.
Kann auch nicht von Tabelle aus starten !
gruß philipp
Anzeige
Habe ich gemacht, leider ...
28.01.2019 20:10:34
philipp
Hallo Nepumuk,
wenn ich jetzt mit F8 im VB Makro starte, geht sofort in Tabelle
aber keine UF ?
Ich habe ja 2007.
Kann auch nicht von Tabelle aus starten !
gruß philipp
AW: Habe ich gemacht, leider ...
28.01.2019 20:12:11
Nepumuk
Hallo Philipp,
mit F8 startest du die erste Codezeile. Versuch es mal mit F5.
Gruß
Nepumuk
Anzeige
Ja aber keine UF
28.01.2019 20:30:11
philipp
Hallo Nepumuk,
hab mit F5 gestartet, geht zur Tabelle aber keine UF, aber kann Zellen anklicken.
Habe commandbutton auf Tabelle erstellt;
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
auch keine UF.
gruß philipp
AW: Ja aber keine UF
28.01.2019 20:41:24
Nepumuk
Hallo Philipp,
kann ich immer noch nicht nachvollziehen. Bei mir sieht das so aus:
Userbild
Ein letzter Versuch dann gebe ich auf: https://www.herber.de/bbs/user/127228.xlsm
Gruß
Nepumuk
Anzeige
Sorry Nepumuk
28.01.2019 20:51:55
philipp
Hallo,
Makro bleibt hier stehen:
With ActiveSheet.Cells(1, 1)
wenn ich mit F5 starte.
Von der Tabelle aus, keine Reaktion.
gruß
philipp
AW: Sorry Nepumuk
28.01.2019 20:58:05
Nepumuk
Hallo Philipp,
was heißt "bleibt stehen" ? Mit Fehlermeldung oder …?
Aber wie schon geschrieben, mehr als eine funktionierende Mappe kann ich nicht machen. Ich kapituliere.
Gruß
Nepumuk
Anzeige
AW: Sorry Nepumuk
28.01.2019 21:08:33
philipp
Hallo,
ja bleibt stehen.
Kann ich verstehen das Du genervt bist.
mfg
philipp
Neuer Versuch
29.01.2019 07:56:10
Nepumuk
Hallo Philipp,
kann es sein, dass in deiner Tabelle die Zelle A1 gar nicht sichtbar ist?
Versuch es mal damit:
Private Sub UserForm_Layout()
    Dim lngLeft As Long, lngTop As Long
    With ActiveWindow.VisibleRange.Cells(1, 1)
        lngLeft = ActiveWindow.PointsToScreenPixelsX(.Left / POINT_TO_PIXEL)
        lngTop = ActiveWindow.PointsToScreenPixelsY(.Top / POINT_TO_PIXEL)
    End With
    Call MoveWindow(mlngHwndForm, lngLeft, lngTop, _
        Width / POINT_TO_PIXEL, Height / POINT_TO_PIXEL, 1)
End Sub

Gegen einfach stehenbleiben im Code habe ich kein Rezept.
Gruß
Nepumuk
Anzeige
Danke Nepumuk !!! -)
29.01.2019 09:49:51
philipp
Guten Morgen Nepumuk,
herzlichen Dank für die große Hilfe !!!
Leider brachte das Makro auch nichts, ist jetzt egal, werde mir ein Textfeld
installieren.
schönen Tag noch philipp
AW: Danke Nepumuk !!! -)
29.01.2019 12:03:25
Mullit
Hallo,
ich erhalte den Fehler bei Start aus dem Editor(F5) auch, da scheint irgendwas bei Nepumuks TabBlatt in der Mappe korrupt zu sein, aus Sicht von xl2010 / xl2007 zumindest, der ActiveX-Button funktioniert da bei mir(xl2010) auch nicht, mit einem Formular-Button geht's und Cells(1,1) ohne ActiveSheet funktioniert.
Füg mal ein ein neues TabBlatt mit einem neuen ActiveX-Button und dem Form.Show-Aufruf ein, da gehts, läuft bei mir wie geschn. Brot...
@Nepumuk: Müsstest Du, wenn Du Zeit dafür hast...;-).. höchstens mal mit einer virt. Machine und xl2010 / xl2007 testen, da sollte der Fehler auch auftauchen...weiß der Teufel, warum...?!
Userbild
Gruß, Mullit
Anzeige
Hab getestet, leider auch keine UF zu sehen... -)
29.01.2019 11:48:28
philipp
;
Anzeige
Anzeige

Infobox / Tutorial

Userform ohne Titelleiste in Excel erstellen


Schritt-für-Schritt-Anleitung

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

  2. Userform erstellen: Klicke im Projektfenster mit der rechten Maustaste auf dein Projekt, wähle Einfügen und dann UserForm.

  3. Userform anpassen: Gehe zu den Eigenschaften der Userform und setze BorderStyle auf fmBorderStyleSingle.

  4. Code einfügen: Füge den folgenden Code in die Userform ein, um die Titelleiste zu entfernen:

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, _
    ByVal wCmd As Long) As Long
    Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, _
    ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
    
    Private Sub UserForm_Initialize()
       Call FensterOhneKopf
    End Sub
    
    Sub FensterOhneKopf()
       ' Hier kommt der restliche Code für die Anpassung der Userform
    End Sub
  5. Positionierung der Userform: Setze die Top- und Left-Eigenschaften der Userform, um sie direkt neben Zeile 1 und Spalte A zu positionieren.

    With UserForm1
       .Top = 0
       .Left = 0
    End With
  6. Userform anzeigen: Erstelle einen Button auf einem Arbeitsblatt und füge den folgenden Code hinzu, um die Userform anzuzeigen:

    Private Sub CommandButton1_Click()
       UserForm1.Show
    End Sub

Häufige Fehler und Lösungen

  • Userform wird nicht angezeigt: Stelle sicher, dass die ShowModal-Eigenschaft der Userform auf False gesetzt ist. Dies kannst du im Eigenschaftenfenster der Userform tun.
  • Userform verschiebt sich: Wenn die Userform nicht an der gewünschten Position bleibt, überprüfe die Top und Left Werte und passe sie an die Bildschirmauflösung an.
  • Fehler mit Cells(1, 1): Wenn der Code bei With ActiveSheet.Cells(1, 1) stehen bleibt, könnte das daran liegen, dass die Zelle A1 nicht sichtbar ist. Verwende ActiveWindow.VisibleRange.Cells(1, 1) anstelle von ActiveSheet.Cells(1, 1).

Alternative Methoden

Eine alternative Methode zur Erstellung einer Userform ohne Titelleiste ist die Verwendung von API-Funktionen, um die Fensterstile zu ändern. Hierbei kannst du Funktionen wie GetWindowLong und SetWindowLong verwenden, um die Eigenschaften der Userform zur Laufzeit zu steuern.

Private Sub UserForm_Initialize()
    Dim lngStyle As Long
    lngStyle = GetWindowLong(Me.hwnd, GWL_STYLE)
    lngStyle = lngStyle And Not WS_CAPTION
    SetWindowLong Me.hwnd, GWL_STYLE, lngStyle
End Sub

Praktische Beispiele

  • Beispiel 1: Um die Userform bei einer Auflösung von 1920x1080 korrekt zu positionieren, kannst du die Position dynamisch anpassen:

    If Application.Width = 1920 Then
       UserForm1.Left = 20
       UserForm1.Top = 124
    Else
       UserForm1.Left = 10
       UserForm1.Top = 100
    End If
  • Beispiel 2: Verwende das MoveWindow API, um die Userform während der Laufzeit zu verschieben.

Private Declare Function MoveWindow Lib "user32" ( _
   ByVal hWnd As Long, _
   ByVal X As Long, _
   ByVal Y As Long, _
   ByVal nWidth As Long, _
   ByVal nHeight As Long, _
   ByVal bRepaint As Long) As Long

Tipps für Profis

  • Nutze die UserForm_MouseDown-Ereignisprozedur, um die Userform zu bewegen, ohne dass eine Titelleiste vorhanden ist. Achte darauf, dass du die entsprechenden API-Funktionen für das Verschieben der Userform korrekt implementierst.
  • Experimentiere mit verschiedenen Bildschirmauflösungen, um sicherzustellen, dass die Userform in jeder Umgebung gut aussieht.

FAQ: Häufige Fragen

1. Warum kann ich die Userform nicht schließen?
Stelle sicher, dass du die Unload-Methode im Code für den Schließen-Button der Userform verwendest.

2. Wie kann ich die Userform dynamisch positionieren?
Verwende die Top und Left Eigenschaften und passe sie an die aktuelle Bildschirmauflösung an. Du kannst auch die VisibleRange verwenden, um die Sichtbarkeit sicherzustellen.

3. Funktioniert das in allen Excel-Versionen?
Die beschriebenen Methoden und API-Funktionen sollten in Excel 2007 und neueren Versionen funktionieren. Es kann jedoch Unterschiede in der Implementierung geben, insbesondere in älteren Versionen.

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