Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Resizable Form

22 views
Skip to first unread message

Mark Eisele

unread,
Feb 26, 2004, 6:41:30 AM2/26/04
to
Hallo,

gibt es eine Möglichkeit eine Form in Excel VBA resizable
zu machen (oder noch besser in der Titelleiste auch die
Min/Max-Buttons anzeigen). Der Benutzer soll die
Möglichkeit erhalten die Grösse der Form selbst zu
bestimmen. Komischerweise gibt es zwar ein Resize-
Ereignis, aber ich finde keine Möglichkeit die Größe bei
der Programmausführung zu ändern (ausser natürlich über
eine Schaltfläche, die die Height und width -Einstellungen
verändert).

Danke

Mark

stefan onken

unread,
Feb 26, 2004, 7:15:05 AM2/26/04
to
hallo Mark,
eigentlich gibt es auf der Webseite von Stephen Bullen
(http://www.bmsltd.co.uk/) ein wunderbares Bsp dazu
(inkl. Code), dummerweise ist die Seite zZ "under
construction". Bei Bedarf kann ich ich dir die Datei aber
zumailen.

Gruß
stefan

>-----Originalnachricht-----

>.
>

Michael Schwimmer

unread,
Feb 26, 2004, 8:31:10 AM2/26/04
to
Hallo Mark


"Mark Eisele" schrieb:

kein Problem!
Folgendes in das Klassenmodul der Userform:

Option Explicit
'Für Min-Max Schaltfläche und Resize
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 FindWindowA Lib "user32" _
(ByVal lpClassName As String, ByVal lpWindowName _
As String) As Long
Private Declare Function DrawMenuBar Lib "user32" _
(ByVal hwnd As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_THICKFRAME = &H40000

Private Sub MinMaxMenu()
Dim hwndForm As Long, lngStyle As Long
Dim Titel As String
Titel = Me.Caption
Me.Caption = "lhdsgterfsdt"
hwndForm = FindWindowA(vbNullString, "lhdsgterfsdt")
Me.Caption = Titel
lngStyle = GetWindowLong(hwndForm, GWL_STYLE)
lngStyle = lngStyle Or WS_MAXIMIZEBOX
lngStyle = lngStyle Or WS_MINIMIZEBOX
lngStyle = lngStyle Or WS_THICKFRAME
SetWindowLong hwndForm, GWL_STYLE, lngStyle
DrawMenuBar hwndForm
End Sub

Private Sub UserForm_Activate()
MinMaxMenu
End Sub

Private Sub UserForm_Resize()
MinMaxMenu
End Sub

MfG
Michael

--
-------------------------------------------
Michael Schwimmer
Home neu: http://michael-schwimmer.de

Michael Schwimmer

unread,
Feb 26, 2004, 9:16:53 AM2/26/04
to
Hallo,
damit die Titelleiste nicht bei jeder Größenänderung flackert, eine
kleine Änderung:

Option Explicit
'Für Min-Max Schaltfläche und Resize
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 FindWindowA Lib "user32" _
(ByVal lpClassName As String, ByVal lpWindowName _
As String) As Long
Private Declare Function DrawMenuBar Lib "user32" _
(ByVal hwnd As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_THICKFRAME = &H40000

Private hForm As Long

Private Sub MinMaxMenu()
Dim lStyle As Long
Dim sTitel As String
If hForm = 0 Then
sTitel = Me.Caption
Me.Caption = "lhdsgterfsdt"
hForm = FindWindowA(vbNullString, "lhdsgterfsdt")
Me.Caption = sTitel
End If
lStyle = GetWindowLong(hForm, GWL_STYLE)
lStyle = lStyle Or WS_MAXIMIZEBOX
lStyle = lStyle Or WS_MINIMIZEBOX
lStyle = lStyle Or WS_THICKFRAME
SetWindowLong hForm, GWL_STYLE, lStyle
DrawMenuBar hForm
End Sub

Private Sub UserForm_Activate()
MinMaxMenu
End Sub

Private Sub UserForm_Resize()
MinMaxMenu
End Sub

Ich habe die Bleistiftmappe mal auf meiner Homepage zum downloaden
bereitgestellt. Unter http://michael-schwimmer.de , ExcelSpecial und
dort unter Punkt 80.

Mark Eisele

unread,
Feb 27, 2004, 4:05:21 AM2/27/04
to
Hallo Stefan

wäre echt super wenn Du mir die Datei zumailen könntest!
me @ amtec-services.de

Danke

>-----Originalnachricht-----

>.
>

Mark Eisele

unread,
Feb 27, 2004, 4:16:31 AM2/27/04
to
Hallo Michael,

fkt super !

Vielen Dank


>-----Originalnachricht-----

>.
>

stefan onken

unread,
Feb 27, 2004, 4:35:19 AM2/27/04
to
hallo Mark,
sollte angekommen sein.

Gruß
stefan


>-----Originalnachricht-----

>.
>

Michael Schwimmer

unread,
Feb 27, 2004, 5:20:02 PM2/27/04
to
Hallo Mark,

"Mark Eisele" schrieb:
> fkt super !

freut mich :-)
Und danke für die Rückmeldung.

Peter Ostermann

unread,
Feb 29, 2004, 2:25:54 PM2/29/04
to

"Michael Schwimmer" <schw...@t-online.de> schrieb im Newsbeitrag
news:c1ofqi$d7c$03$1...@news.t-online.com...

> Hallo Mark,
>
> "Mark Eisele" schrieb:
> > fkt super !
>
> freut mich :-)
> Und danke für die Rückmeldung.
>
Hallo Leute,
"fkt super !" kann ich nur bestätigen. Danke!

Ich habe aber noch kleines Problem am Rande:
Wenn ich die Userform minimiert habe kann ich die
Excel-Tabellen dennoch nicht bearbeiten ohne die Form
zu schließen. Hat jemand einen Tip parat?

Gruß
Peter


Peter Ostermann

unread,
Feb 29, 2004, 3:23:04 PM2/29/04
to

> Ich habe aber noch kleines Problem am Rande:
> Wenn ich die Userform minimiert habe kann ich die
> Excel-Tabellen dennoch nicht bearbeiten ohne die Form
> zu schließen. Hat jemand einen Tip parat?
>
> Gruß
> Peter

Problem ist gelöst, aber leider nur für Excel 2000:

Die Form muß zu diesem Zeck "nonmodal" sein.
Dazu wird der Show Methode "Falsch" mitgegeben:

userform.Show False

Das gilt für Excel 2000. Angeblich hat Excel 97
nicht diese "einfache" Funktionalität. Frage: Wie ist der
code wenn die Anwendung unter beiden Versionen
laufen soll?

Grüße
Peter


Michael Schwimmer

unread,
Mar 1, 2004, 12:54:59 AM3/1/04
to
Hallo Peter,

"Peter Ostermann" schrieb:


> > Ich habe aber noch kleines Problem am Rande:
> > Wenn ich die Userform minimiert habe kann ich die
> > Excel-Tabellen dennoch nicht bearbeiten ohne die Form
> > zu schließen. Hat jemand einen Tip parat?

> Problem ist gelöst, aber leider nur für Excel 2000:
> Die Form muß zu diesem Zeck "nonmodal" sein.
> Dazu wird der Show Methode "Falsch" mitgegeben:
> userform.Show False
> Das gilt für Excel 2000. Angeblich hat Excel 97
> nicht diese "einfache" Funktionalität. Frage: Wie ist der
> code wenn die Anwendung unter beiden Versionen
> laufen soll?

Option Explicit
'Für Min-Max Schaltfläche, Resize und modeless


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 FindWindowA Lib "user32" _
(ByVal lpClassName As String, ByVal lpWindowName _
As String) As Long
Private Declare Function DrawMenuBar Lib "user32" _
(ByVal hwnd As Long) As Long

Private Declare Function EnableWindow Lib "user32" ( _
ByVal hwnd As Long, _
ByVal bEnable As Long _


) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_THICKFRAME = &H40000


#If VBA6 = 0 Then
'*************************************
Private Sub UserForm_Activate()
Dim hXL As Long
hXL = FindWindowA(vbNullString, Application.Caption)
EnableWindow hXL, True
MinMaxMenu
End Sub
#Else


Private Sub UserForm_Activate()
MinMaxMenu
End Sub

#End If

Private Sub MinMaxMenu()
Dim hForm As Long, lStyle As Long


Dim Titel As String
Titel = Me.Caption
Me.Caption = "lhdsgterfsdt"

hForm = FindWindowA(vbNullString, "lhdsgterfsdt")
Me.Caption = Titel


lStyle = GetWindowLong(hForm, GWL_STYLE)
lStyle = lStyle Or WS_MAXIMIZEBOX
lStyle = lStyle Or WS_MINIMIZEBOX
lStyle = lStyle Or WS_THICKFRAME
SetWindowLong hForm, GWL_STYLE, lStyle
DrawMenuBar hForm

End Sub

Private Sub UserForm_Resize()
MinMaxMenu
End Sub


Die Userform muss nun noch abhängig von der Version mit der Methode Show
angezeigt werden. Dazu eine kleine Hilfsprozedur schreiben und diese
aufrufen, um die Userform anzeigen:

#If VBA6 = 0 Then
Private Sub UserFormAnzeigen()
DeineUserform.Show
End Sub
#Else
Private Sub UserFormAnzeigen()
DeineUserform.Show False
End Sub
#End If

Ich bin eben gerade von der Arbeit gekommen und konnte es deshalb nur
unter XL97 testen. Wenn es nicht funzt, sag bescheid, dann probiere ich
es heute Nacht mal unter anderen Versionen aus.

Peter Ostermann

unread,
Mar 2, 2004, 1:46:20 AM3/2/04
to
Hallo Michael,

um die 97er Version zu testen, muß ich erst
auf dem Dachboden das alte Office suchen
und auf dem Nebenrechner installieren.
Ich brauche alles jedenfalls lauffähig unter
beiden Office Versionen.

Der code den Du früher in diesem thread
gepostet hattest funktioniert jedenfalls unter Office
2k und mußte nur um "USERFORM.show false"
erweitert werden.

- Was bedeuten die Doppelkreuze "#"
vor den if und end stmts.?
- Die Variable VBA6 ist bei mir nicht
bekannt. Wie kann ich sie mit der
Excel-Version "austatten"?

Grüße
Peter

"Michael Schwimmer" <schw...@t-online.de> schrieb im Newsbeitrag

news:c1uj7j$ipq$00$1...@news.t-online.com...

Michael Schwimmer

unread,
Mar 2, 2004, 3:08:29 AM3/2/04
to
Hallo Peter,

"Peter Ostermann" schrieb:


> um die 97er Version zu testen, muß ich erst
> auf dem Dachboden das alte Office suchen
> und auf dem Nebenrechner installieren.
> Ich brauche alles jedenfalls lauffähig unter
> beiden Office Versionen.

Unter XL97 brauchst du nicht zu testen. Dort funzt es.
Ich benutze daheim (aus Überzeugung) immer noch XL97.

> - Was bedeuten die Doppelkreuze "#"
> vor den if und end stmts.?
> - Die Variable VBA6 ist bei mir nicht

Such mal in der Onlinehilfe nach bedingter Kompilierung.
Je nach Wert der Konstanten VBA6 wird nur der Zweig Kompiliert, der auch
Wahr ist. Existiert die Konstante VBA6 (ab XL2000), wird die Methode
Show mit dem Parameter False benutzt.
Unter XL97 gibt es ohne die bedingte Kompilierung einen Fehler, wenn du
bei der Methode Show einen Parameter benutzt. Diesen Fehler kannst du
aber nicht abfangen.

> bekannt. Wie kann ich sie mit der
> Excel-Version "austatten"?

Du brauchst nichts ausstatten, das müsste ohne Änderung Funktionieren.

Peter Ostermann

unread,
Mar 4, 2004, 7:45:37 AM3/4/04
to
Hallo Michael,

> > - Was bedeuten die Doppelkreuze "#"
>

> Such mal in der Onlinehilfe nach bedingter Kompilierung.

Danke für den Hinweis. Wieder was dazugelernt!
Ich hatte in verschiedenen VisualBasic Büchern
gesucht: In keinem Schlagwortverzeichnis ist "#"
erwähnt.

> Unter XL97 brauchst du nicht zu testen. Dort funzt es.
> Ich benutze daheim (aus Überzeugung) immer noch XL97.
>

Unter XL2k hat es auch funktioniert. Zwischen allen beim
Start geöffneten Mappen ist wechselweiser Zugriff möglich.

Jedoch: Das funktioniert so leider nicht unter XL97! Die Mappe
aus der das Userform gestartet wurde ist zwar mit allen Tabellen
im Zugriff. Wird jedoch eine der anderen Mappen "angefaßt" gibts
keinen Weg zurück; die erste Mappe ist jetzt gesperrt. Gibt es
auch dafür eine Lösung?

Grüße
Peter

Michael Schwimmer

unread,
Mar 4, 2004, 9:27:15 AM3/4/04
to
Hallo Peter,


"Peter Ostermann" schrieb:


> Jedoch: Das funktioniert so leider nicht unter XL97! Die Mappe
> aus der das Userform gestartet wurde ist zwar mit allen Tabellen
> im Zugriff. Wird jedoch eine der anderen Mappen "angefaßt" gibts
> keinen Weg zurück; die erste Mappe ist jetzt gesperrt. Gibt es
> auch dafür eine Lösung?

kann ich so nicht nachvollziehen. Mit Strg/F6 kannst du ohne Probleme
zwischen den Mappen wechseln.
Ich habe aber vergessen zu erwähnen, dass du die Menüs erst benutzen
kannst, wenn du einen doppelklick auf irgend ein Menü gemacht hast. Dann
geht das Popup Anpassen auf, wenn du das ohne Änderung geschlossen hast,
funzt auch der Rest. Ich habe auch noch keine Möglichkeit gefunden, das
zu umgehen.

Peter Ostermann

unread,
Mar 4, 2004, 4:24:31 PM3/4/04
to
Hallo Michael,

> > Wird jedoch eine der anderen Mappen "angefaßt" gibts
> > keinen Weg zurück; die erste Mappe ist jetzt gesperrt.
>

Meine Aussage stimmt nicht ganz. Neue Erkenntnis: Wird
eine Schaltfläche im Userform betätigt, welche eine Routine startet,
die Aktionen mit der ersten Mappe durchführt, sie also aktiviert,
dann ist auch diese wieder für Mausklicks verfügbar. Eigentlich
logisch, hätte ich gleich erkennen sollen.

Danke für Deine Hinweise unten! Diese Tips und dann noch
Google/Groups - da ist man gut versorgt. ;-)

Grüße aus dem Norden
Peter

Home neu: www.pkf-ostermann.de

Michael Schwimmer

unread,
Mar 4, 2004, 6:39:35 PM3/4/04
to
Hallo Peter,

"Peter Ostermann" schrieb:


>Meine Aussage stimmt nicht ganz. Neue Erkenntnis: Wird
>eine Schaltfläche im Userform betätigt, welche eine Routine startet,
>die Aktionen mit der ersten Mappe durchführt, sie also aktiviert,
>dann ist auch diese wieder für Mausklicks verfügbar. Eigentlich
>logisch, hätte ich gleich erkennen sollen.

freut mich, dass es funktioniert.

> Danke für Deine Hinweise unten! Diese Tips und dann noch
> Google/Groups - da ist man gut versorgt. ;-)

Das interpretiere ich mal als Lob an diese NG, vielen Dank!

0 new messages