Live-Forum - Die aktuellen Beiträge
Datum
Titel
16.10.2025 17:40:39
16.10.2025 17:25:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Userform komplett ohne Rand

Forumthread: Userform komplett ohne Rand

Userform komplett ohne Rand
21.11.2015 16:14:51
Luggesch
Hallo zusammen,
ich versuche schon seit längerem eine Userform komplett ohne Rand darzustellen.
Bisher ist mit dies auch einigermaßen gut gelungen; der komplette Rand ist weg, auch die Schaltflächen in der rechten oberen Ecke sind nicht mehr vorhanden.
Was jetzt nur noch vorhanden ist sind die zwei bzw. drei Reihen Pixel an den Formularkanten, die die Userform dreidimensional erscheinen lassen.
Diesen 3D-Effekt bei Userformen möchte ich möglichst auch noch ausblenden.
Die Userform soll möglich eine ebene Fläche von Bildpunkten darstellen, ohne Rand und sonstigen 3D-Effekten.
Ich habe den aktuellen Stand in einer Beispieldatei zusammengefasst (siehe Anhang).
https://www.herber.de/bbs/user/101701.xlsm
Würde mich freuen, wenn sich zu diesem Thema ein Ansatz finden lassen würde :)
mfg
Luggesch

Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform komplett ohne Rand
21.11.2015 17:43:53
Nepumuk
Hallo,
ich würde den Rahmen einfach abschneiden:
' **********************************************************************
' Modul: UserForm1 Typ: Userform
' **********************************************************************

Option Explicit

Private Declare PtrSafe Function CreateRectRgnIndirect Lib "gdi32.dll" ( _
    ByRef lpRect As RECT) As LongPtr
Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function GetWindowLongA Lib "user32.dll" ( _
    ByVal hWnd As LongPtr, _
    ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLongA Lib "user32.dll" ( _
    ByVal hWnd As LongPtr, _
    ByVal nIndex As Long, _
    ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function DrawMenuBar Lib "user32.dll" ( _
    ByVal hWnd As LongPtr) As Long
Private Declare PtrSafe Function SendMessageA Lib "user32.dll" ( _
    ByVal hWnd As LongPtr, _
    ByVal wMsg As Long, _
    ByVal wParam As LongPtr, _
    lParam As Any) As LongPtr
Private Declare PtrSafe Function SetWindowRgn Lib "user32.dll" ( _
    ByVal hWnd As LongPtr, _
    ByVal hRgn As LongPtr, _
    ByVal bRedraw As Long) As Long
Private Declare PtrSafe Function ScreenToClient Lib "user32.dll" ( _
    ByVal hWnd As LongPtr, _
    lpPoint As POINTAPI) As Long
Private Declare PtrSafe Function GetWindowRect Lib "user32.dll" ( _
    ByVal hWnd As LongPtr, _
    ByRef lpRect As RECT) As Long
Private Declare PtrSafe Function ReleaseCapture Lib "user32.dll" () As Long

Private Type POINTAPI
    X As Long
    Y As Long
End Type

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Const GWL_STYLE As Long = -16
Private Const WS_CAPTION As LongPtr = &HC00000
Private Const HTCAPTION As LongPtr = 2
Private Const WM_NCLBUTTONDOWN As Long = &HA1
Private Const GC_CLASSNAMEMSFORM As String = "ThunderDFrame"

Private mlngptrHwnd As LongPtr

Private Sub CommandButton1_Click()
    Unload Me
End Sub

Private Sub UserForm_Activate()
    
    Dim udtRect As RECT, udtPoint As POINTAPI
    Dim lngptrStyle As LongPtr, lngptrRegion As LongPtr
    
    mlngptrHwnd = FindWindowA(GC_CLASSNAMEMSFORM, Caption)
    
    lngptrStyle = GetWindowLongA(mlngptrHwnd, GWL_STYLE)
    Call SetWindowLongA(mlngptrHwnd, GWL_STYLE, lngptrStyle And Not WS_CAPTION)
    Call DrawMenuBar(mlngptrHwnd)
    
    Call GetWindowRect(mlngptrHwnd, udtRect)
    udtPoint.X = udtRect.Right
    udtPoint.Y = udtRect.Bottom
    
    Call ScreenToClient(mlngptrHwnd, udtPoint)
    
    With udtRect
        .Bottom = udtPoint.Y
        .Left = 4
        .Right = udtPoint.X
        .Top = 4
    End With
    
    lngptrRegion = CreateRectRgnIndirect(udtRect)
    Call SetWindowRgn(mlngptrHwnd, lngptrRegion, 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(mlngptrHwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    End If
    
End Sub

Gruß
Nepumuk

Anzeige
OT @ Nepumuk
21.11.2015 18:02:46
Michael
Hi Nepumuk,
da sieht man schon wieder den API-Profi!
Auf Deinen Rat hin habe ich mir den Appleman besorgt (hat gedauert).
Man liest ja keine 1400 Seiten, aber ich gebe mir die paar Einführungskapitel und schnüffle dann von Fall zu Fall rum, die Codeschnipsel finde ich ja heutzutage easy im Netz...
Vielen Dank nochmal und schöne Grüße,
Michael

Anzeige
AW: Userform komplett ohne Rand
21.11.2015 18:14:41
Luggesch
Hallo Nepumuk,
das ist genau das, was ich gesucht habe :))))
funktioniert brilliant!
Besten Dank für die schnelle Rückantwort.
mfg
Luggesch
;
Anzeige
Anzeige

Infobox / Tutorial

Userform in Excel ohne Rand gestalten


Schritt-für-Schritt-Anleitung

Um eine Userform in Excel ohne Rand zu erstellen, kannst du die folgenden Schritte befolgen:

  1. VBA-Editor öffnen:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Neue Userform erstellen:

    • Klicke im VBA-Editor mit der rechten Maustaste auf "VBAProject (deine Datei)" und wähle Einfügen > UserForm.
  3. Code einfügen:

    • Füge den folgenden Code in das Codefenster der Userform ein, um den Rand zu entfernen:
    Private Declare PtrSafe Function FindWindowA Lib "user32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Private Declare PtrSafe Function SetWindowLongA Lib "user32.dll" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    Private Const GWL_STYLE As Long = -16
    Private Const WS_CAPTION As LongPtr = &HC00000
    
    Private Sub UserForm_Activate()
       Dim hWnd As LongPtr
       hWnd = FindWindowA("ThunderDFrame", Me.Caption)
       Call SetWindowLongA(hWnd, GWL_STYLE, 0)
    End Sub
  4. Userform aktivieren:

    • Stelle sicher, dass die Userform aktiviert wird, wenn du sie öffnest, um den Code auszuführen.
  5. Testen:

    • Schließe den VBA-Editor und starte die Userform, um sicherzustellen, dass sie ohne Rand angezeigt wird.

Häufige Fehler und Lösungen

  • Fehler: Userform zeigt dennoch einen Rand:

    • Überprüfe, ob der GWL_STYLE-Wert korrekt gesetzt wird. Stelle sicher, dass der Code in der UserForm_Activate-Prozedur korrekt aufgerufen wird.
  • Fehler: Excel stürzt ab:

    • Achte darauf, dass du die richtige Excel-Version verwendest, die PtrSafe-Deklarationen unterstützt (Excel 64-Bit).

Alternative Methoden

Wenn du eine andere Methode zur Erstellung einer randlosen Userform in Excel ausprobieren möchtest, kannst du folgende Ansätze verwenden:

  • Verwendung von Form-Design:

    • Anstatt eine Userform zu verwenden, kannst du ein Arbeitsblatt gestalten, das wie eine Benutzeroberfläche aussieht. Passe die Zellformatierungen an, um den 3D-Effekt zu minimieren.
  • Verwendung von Shapes:

    • Erstelle Shapes (z.B. Rechtecke) in Excel und verwende VBA, um diese als Buttons oder Eingabefelder zu verwenden.

Praktische Beispiele

Hier sind einige Szenarien, in denen eine randlose Userform nützlich sein könnte:

  • Eingabemasken: Für Daten, die eine saubere, ablenkungsfreie Benutzeroberfläche erfordern.
  • Benutzeranpassbare Dashboards: Wenn du eine visuelle Darstellung von Daten in Excel erstellen möchtest, ohne die Standard-UI-Elemente.

Tipps für Profis

  • API-Kenntnisse erweitern: Beschäftige dich intensiver mit Windows-APIs, um noch mehr Anpassungen an deiner Userform vornehmen zu können.
  • GUI-Design: Experimentiere mit verschiedenen Designs und Layouts, um die Benutzererfahrung zu verbessern.

FAQ: Häufige Fragen

1. Kann ich eine Userform ohne Rand in jeder Excel-Version erstellen? Ja, jedoch benötigst du für die Verwendung der PtrSafe-Deklarationen Excel 64-Bit.

2. Was mache ich, wenn die Userform nach dem Schließen nicht mehr reagiert? Stelle sicher, dass du den Code korrekt implementiert hast und dass keine Endlosschleifen im VBA-Code existieren.

3. Ist es möglich, die Userform an die Bildschirmgröße anzupassen? Ja, du kannst die Resize-Ereignisse verwenden, um die Größe der Userform dynamisch anzupassen.

4. Wie kann ich die Userform nach dem Schließen wieder öffnen? Du kannst einen Button auf einem Arbeitsblatt erstellen, der die Userform erneut zeigt, indem du UserForm.Show aufrufst.

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