--
Marco
marcotog...@inwind.it
Marco ha scritto:
> Vorrei chi l'userform si adatti alla risoluzione dello schermo, ma
> insieme, tutti i suoi comandi e, se si puň, la dimensione del Font
> dei comandi. E' possibile?
Non mi risulta che ci siano automatismi per fare questo.
Dovresti gestire il ridimensionamento da codice.
Per VB6 avevo utilizzato dei componenti OCX aggiuntivi che permettevano il
ridimensionamento dei controlli sul form, ma non li ho mai utilizzati sugli
UserForm di VBA perchč la distribuzione e la registrazione dei componenti
non risultava troppo snella e ad essere sinceri dopo qualche test non si
sono dimostrati completamente funzionanti sugli UserForm stessi.
Per quanto riguarda la gestione via codice bisognerebbe ricorrere
all'utilizzo di un paio di API di sistema per rilevare la dimensione, poi
procedere alla variazione della posizione e delle dimensioni di ogni singolo
controllo; idem per i font. Non cosě banale se non hai sufficiente
dimestichezza con la programmazione.
Ciao
Roberto
> Non mi risulta che ci siano automatismi per fare questo.
Ho fatto una ricerca, chiedo scusa ma l'ho fatta dopo, su google ed ho visto
che è come dici tu.
C'era un esempio che mi restituiva la risoluzione dello schermo in quel
momento, questa:
Dim HRes As Integer, VRes As Integer
HRes = Screen.Width / Screen.TwipsPerPixelY
VRes = Screen.Height / Screen.TwipsPerPixelX
MsgBox "Risoluzione dello schermo: " & HRes & " x " & VRes, vbInformation
ma non funziona, o non sono capace io, o non funziona con excel.
Sai se questo è possibile?
Grazie
--
Marco
marcotog...@inwind.it
> C'era un esempio che mi restituiva la risoluzione dello schermo in quel
> momento, questa:
>
> Dim HRes As Integer, VRes As Integer
> HRes = Screen.Width / Screen.TwipsPerPixelY
> VRes = Screen.Height / Screen.TwipsPerPixelX
> MsgBox "Risoluzione dello schermo: " & HRes & " x " & VRes, vbInformation
>
> ma non funziona, o non sono capace io, o non funziona con excel.
>
> Sai se questo è possibile?
Potresti provare con un trucco tipo:
Dim HExcel As Integer, VExcel As Integer
Application.WindowState = xlMaximized
HExcel = Application.Width
VExcel = Application.Height
--
Tiziano Marmiroli
Microsoft MVP - Office
Prova a vedere se riesci a ricavare qualcosa da questo abbozzo.
************************************************************
From: "Maurizio Borrelli"
Newsgroups: it.comp.lang.visual-basic
Subject: Re: Caratteri del sistema
Date: Mon, 13 May 2002 20:00:53 +0200
(Excel2000. Ridimensionamento UserForm)
Il codice che segue mi sembra vada meglio. Fammi sapere, grazie.
Per agevolare il test, nel foglio attivo ho assegnato a due celle i nomi:
"Desktop" e "UserForm". In queste celle ho messo i valori, per esempio, 5 e
1; 5 e 3, ecc. (Il rapporto cioe' che si vuole ottenere fra le due
larghezze). Ovviamente vale per finestre in cui larghezza > altezza. Vedi un
po' se puoi generalizzarlo, ammesso che il tutto realmente funzioni.
Option Explicit
' HWND GetActiveWindow(VOID)
Private Declare Function GetActiveWindow _
Lib "user32" () As Long
' HWND GetDesktopWindow(VOID)
Private Declare Function GetDesktopWindow _
Lib "user32" ( _
) As Long
' typedef struct _RECT {
' LONG left;
' LONG top;
' LONG right;
' LONG bottom;
' } RECT;
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
' BOOL GetWindowRect(
' HWND hWnd, // handle to window
' LPRECT lpRect // address of structure for window
' // coordinates
' );
Private Declare Function GetWindowRect _
Lib "user32" ( _
ByVal hwnd As Long _
, lpRect As RECT _
) As Long
Private Sub UserForm_Initialize()
Dim uRect As RECT
Dim fPixelsToPointsRatio As Single
Dim bDisplayFullScreen As Boolean
Dim fDesktopWidth As Single
Dim fUserFormCurWidth As Single
Dim fUserFormCurHeight As Single
Dim fUserFormNewWidth As Single
Dim fUserFormNewHeight As Single
Dim iUserFormZoom As Integer
Call GetWindowRect(GetActiveWindow, uRect)
With uRect
fPixelsToPointsRatio _
= Application.Width / (.Right - .Left)
End With
Call GetWindowRect(GetDesktopWindow, uRect)
With uRect
fDesktopWidth = (.Right - .Left) * fPixelsToPointsRatio
End With
With Application.ActiveWorkbook.Names
fUserFormNewWidth _
= fDesktopWidth _
* (.Item("UserForm").RefersToRange.Value _
/ .Item("Desktop").RefersToRange.Value)
End With
With Me
fUserFormCurWidth = .Width
fUserFormCurHeight = .Height
End With
iUserFormZoom = fUserFormNewWidth / fUserFormCurWidth * 100
Select Case True
Case iUserFormZoom < 10
iUserFormZoom = 10
Case iUserFormZoom > 400
iUserFormZoom = 400
Case Else
End Select
fUserFormNewWidth = iUserFormZoom * fUserFormCurWidth / 100
fUserFormNewHeight _
= fUserFormNewWidth * fUserFormCurHeight _
/ (fUserFormCurWidth)
With Me
.Zoom = iUserFormZoom
.Width = fUserFormNewWidth
.Height = fUserFormNewHeight
End With
End Sub
E facci sapere se trovi qualcosa di meno macchinoso, mi raccomando.
************************************************************
--
Ciao :o)
Maurizio Borrelli, Microsoft MVP Access
--------
?SPQR(C)
X
--------
Marco ha scritto:
> C'era un esempio che mi restituiva la risoluzione dello schermo in
> quel momento, questa:
> [CUT]
> HRes = Screen.Width / Screen.TwipsPerPixelY
> VRes = Screen.Height / Screen.TwipsPerPixelX
> [CUT]
> ma non funziona, o non sono capace io, o non funziona con excel.
L'oggetto "Screen" non è disponibile in VBA; funziona invece con Visual
Basic. Quindi non dipende da te! ;-)
Esistono delle API di sistema per risalire alla risoluzione, vedi ad
esempio:
http://www.mvps.org/vbnet/index.html?code/core/getdesktopmaximumwidth.htm
"GetDesktopMaximumWidth"
http://www.mvps.org/vbnet/index.html?code/core/getdesktopmaximumheight.htm
"GetDesktopMaximumHeight"
Prova anche a seguire il suggerimento di Tiziano.
Ciao
Roberto
Tiziano Marmiroli ha scritto:
> Potresti provare con un trucco tipo:
> Dim HExcel As Integer, VExcel As Integer
> Application.WindowState = xlMaximized
> HExcel = Application.Width
> VExcel = Application.Height
Sono una noticina: attenzione che il tipo restituito dalle proprietà
".Width" e ".Height" è di tipo Double (anche perchè dipende dall'unità di
misura utilizzata).
Ciao
Roberto
> Microsoft MVP - Office+
Questo funziona, non mi dà i pixel, ma va bene ugualmente
--
Marco
marcotog...@inwind.it
Il tuo funziona benissimo, le API no (anche se sono sicuro che è colpa della
mia completa ignoranza in materia), non so proprio dove mettere il codice:
Public Const SM_CYVIRTUALSCREEN As Long = 79
Public Const SM_CMONITORS As Long = 80
Public Declare Function GetSystemMetrics Lib "user32" _
(ByVal nIndex As Long) As Long
Public Function GetDesktopMaximumHeight() As Long
'Return the maximum height of
'all monitors on the desktop. If
'only one monitor, return screen
'height.
If IsMultiMonitorSystem() Then
GetDesktopMaximumHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN)
Else
GetDesktopMaximumHeight = Screen.Height \ Screen.TwipsPerPixelY
End If
End Function
Public Function IsMultiMonitorSystem() As Boolean
'Returns True if a multi-monitor system
IsMultiMonitorSystem = GetSystemMetrics(SM_CMONITORS) > 1
End Function
--
Marco
marcotog...@inwind.it
Questo codice deve essere scritto in un modulo visual basic della
cartella. Hai presente?... Inserisci > Modulo
Quindi richiamerai queste funzioni pubbliche (del progetto visual basic
della tua cartella di lavoro excel) dal modulo che ha bisogno di usarle. Nel
tuo caso lo userform, immagino.
Per esempio:
If (IsMultiMonitorSystem = True) Then
' ...
Else
' ...
End If