In vielen professionellen Excel Anwendungen sollen Dialoge bewusst „aufgeräumt“ wirken. Die klassische Titelleiste einer VBA UserForm mit Symbol, Rahmen und Schließen Button passt dabei nicht immer zum gewünschten Design.
Über die Windows API lässt sich die Titelleiste gezielt entfernen – und zwar sowohl unter Excel 32 Bit als auch unter Excel 64 Bit.
Der unten stehende Code ist vollständig VBA7 kompatibel und funktioniert unter Excel 365 ebenso wie unter älteren 32 Bit Versionen. Er entfernt die Titelleiste der UserForm und ermöglicht weiterhin das Verschieben der Form per Maus.
Was bewirkt der Code?
Beim Initialisieren der UserForm wird:
- das Fenster Handle der UserForm ermittelt
- der aktuelle Fensterstil ausgelesen
- die Titelleiste und das Systemmenü entfernt
- der neue Stil gesetzt und neu gezeichnet
Zusätzlich sorgt ein MouseDown Ereignis dafür, dass die Form trotz fehlender Titelleiste per Drag verschoben werden kann.
Das Ergebnis sieht wie folgt aus. Die Userform lässt sich trotz ausgeblendeter Titelleiste wie gewohnt per Drag & Drop verschieben.

Wo wird der Code eingefügt?
Der gesamte Code gehört in das Code-Modul der jeweiligen UserForm. Öffnen Sie dazu den VBA-Editor mit ALT + F11, wählen Sie die gewünschte UserForm im Projekt-Explorer aus und öffnen Sie deren Codefenster per Doppelklick.
Der Code darf nicht in ein Standardmodul, Tabellenmodul oder in DieseArbeitsmappe eingefügt werden.
Vorteile in der Praxis
Eine UserForm ohne Titelleiste eignet sich besonders für:
- geführte Eingabedialoge
- Dashboard Steuerungen
- modale Assistenten
- unternehmensweite Tools mit einheitlichem Design
Wird die Titelleiste entfernt, entfällt automatisch das Schließen über das „X“. Dadurch wird der Anwender gezwungen, die vorgesehenen Schaltflächen wie OK, Abbrechen oder Speichern zu verwenden. Das verhindert inkonsistente Zustände oder ungewollte Abbrüche.
Technischer Hintergrund
VBA selbst bietet keine direkte Eigenschaft zum Entfernen der Titelleiste. Deshalb wird auf Funktionen aus der Windows Bibliothek user32.dll zurückgegriffen. Wichtig ist die korrekte Deklaration der API Funktionen mit PtrSafe und LongPtr, damit der Code unter 64 Bit Excel fehlerfrei läuft. Ältere Codebeispiele im Internet sind häufig nur für 32 Bit geeignet und verursachen unter modernen Excel Versionen Compile Fehler.
Wichtiger Hinweis
Der Code funktioniert ausschließlich unter Windows. Auf Mac Systemen stehen die benötigten Windows API Funktionen nicht zur Verfügung. Zudem sollte die UserForm eine eindeutige Caption besitzen, da das Fenster über diesen Titel identifiziert wird.
Fazit
Mit wenigen Zeilen API Code lässt sich das Erscheinungsbild einer UserForm deutlich professioneller gestalten. Gerade in komplexeren Excel Tools mit mehreren Dialogen entsteht so eine moderne, kontrollierte Benutzerführung – vollständig kompatibel zu Excel 32 Bit und 64 Bit.
VBA-Code für Userform:
Option Explicit '** Nur einmal zentral im Modul
'***************************************************************************************************
' https://excel-inside.de
' Prozedur-Beschreibung
' Entfernt die Titelleiste (Caption) einer UserForm per Windows-API (32/64 Bit kompatibel)
' und ermöglicht das Verschieben der Form per Drag (MouseDown).
'***************************************************************************************************
#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" ( _
ByVal hwnd As LongPtr, _
ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" ( _
ByVal hwnd As LongPtr, _
ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function DrawMenuBar Lib "user32" ( _
ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" ( _
ByVal hwnd As LongPtr, _
ByVal wMsg As Long, _
ByVal wParam As LongPtr, _
ByVal lParam As LongPtr) As LongPtr
Private Declare PtrSafe Function ReleaseCapture Lib "user32" () As Long
#Else
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, _
ByVal lParam As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
#End If
Private Const GWL_STYLE As Long = -16
Private Const WS_CAPTION As LongPtr = &HC00000 '** Titelleiste (Border + DialogFrame)
Private Const WS_SYSMENU As LongPtr = &H80000 '** Systemmenü (Icon/Alt+Space)
Private Const WS_THICKFRAME As LongPtr = &H40000 '** Größenänderungsrahmen (optional)
Private Const WM_NCLBUTTONDOWN As Long = &HA1
Private Const HTCAPTION As LongPtr = 2
#If VBA7 Then
Private wHandle As LongPtr
#Else
Private wHandle As Long
#End If
'--------------------------------------------------------------------------------------
Private Sub CommandButton1_Click()
Unload Me
End Sub
'--------------------------------------------------------------------------------------
Private Sub UserForm_Initialize()
Dim className As String
Dim style As LongPtr
If Val(Application.Version) >= 9 Then
className = "ThunderDFrame"
Else
className = "ThunderXFrame"
End If
wHandle = FindWindow(className, Me.Caption)
If wHandle = 0 Then Exit Sub
'** aktuellen Stil holen
#If VBA7 Then
style = GetWindowLongPtr(wHandle, GWL_STYLE)
#Else
style = GetWindowLong(wHandle, GWL_STYLE)
#End If
'** Titelleiste und Systemmenü entfernen (optional auch Resize-Rahmen)
style = style And Not WS_CAPTION
style = style And Not WS_SYSMENU
'style = style And Not WS_THICKFRAME '** nur wenn du auch Resize verhindern willst
'** Stil setzen
#If VBA7 Then
SetWindowLongPtr wHandle, GWL_STYLE, style
#Else
SetWindowLong wHandle, GWL_STYLE, style
#End If
DrawMenuBar wHandle
End Sub
'--------------------------------------------------------------------------------------
Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If wHandle = 0 Then Exit Sub
If Button = 1 Then
ReleaseCapture
'** Form bewegen, als ob man die Titelleiste zieht
#If VBA7 Then
SendMessage wHandle, WM_NCLBUTTONDOWN, HTCAPTION, 0
#Else
SendMessage wHandle, WM_NCLBUTTONDOWN, HTCAPTION, 0
#End If
End If
End Sub

