UserForm - Autodimensionamento per variazione Risoluzione Schermo. - dal 04/09/04 pagina vista: volte

Sappiamo tutti cosa è la "Dimensione Video": è la "Risoluzione Schermo", che viene espressa in Pixel e che normalmente viene impostata alla risoluzione di 800 x 600 sugli home-computer, mentre sui portatili normalmente è impostata a 1024 x 768. Ovviamente è possibile modificare queste impostazioni su altri valori, valori che sono determinati dalle capacità e dalle dimensioni del monitor usato (14", 15", 17", 19", 21", 24") e soprattutto dalle possibilità della scheda video installata sul computer, nel gestire un numero maggiore di possibili risoluzioni schermo.

In pratica la "risoluzione schermo" influisce sulla dimensione degli oggetti che vediamo sul monitor, e maggiore è il valore della risoluzione, maggiore è la quantità di area visiva che vediamo, con la conseguenza che vedremo gli oggetti più piccoli. Quindi ad esempio, in una cartella Excel aperta a tutto schermo, vedremo un maggior numero di righe e di colonne (maggior area visibile), ma le celle, colonne, barre menu, testo, ecc, li vedremo più piccoli.

L'argomento di questo esercizio è : realizzare istruzioni che rilevino le dimensioni della risoluzione schermo impostata, e che adattino, al variare della risoluzione, le dimensioni di una UserForm alla nuova risoluzione impostata.

Va comunque precisato che i valori e i suggerimenti che seguiranno, vanno intesi come valori di esempio in quanto, per ogni computer-monitor, le dimensioni dell'area visiva (a tutto schermo) sono influenzati da altri parametri che è impossibile predeterminare (frequenza di refresh impostata per la scheda video, posizionamento verticale o orizzontale, ecc.. tutte impostazioni che ogni utente può aver settato a valori diversi, e che modificano sensibilmente l'effettiva dimensione della videata tra un computer ed un altro).

Esistono già sul Web degli OCX (librerie di istruzioni) che svolgono la funzione di regolare automaticamente le dimensioni di una Form, e degli "oggetti" nella Form inseriti (TextBox, CommandButton, Label, ecc. ecc.), al variare della risoluzione dello schermo, ma noi ci affideremo ad istruzioni specifiche per il VBA di Excel.

Sfrutteremo due proprietà dell'oggetto Application e dell'oggetto Window, e sono:

  • la proprietà UsableHeight - che restituisce l'altezza disponibile per una finestra all'interno dell'area della finestra dell'applicazione. L'altezza è espressa in punti. Proprietà di tipo Double di sola lettura.

  • la proprietà UsableWidth - che restituisce la larghezza disponibile per una finestra all'interno dell'area della finestra dell'applicazione. La larghezza è espressa in punti. Proprietà di tipo Double di sola lettura

Sarà appunto all'apertura della UserForm (evento Activate) che rileveremo le dimensioni della finestra, ed useremo i valori restituiti per determinare le nuove misure da tenere. Comunque per capire meglio l'area a cui si riferiscono le due proprietà, vediamo l'immagine sotto: l'area bordata di rosso è l'area letta dalle due proprietà, e si riferisce alla finestra (window) che corrisponde al solo foglio di lavoro e non a tutto Excel.

Bisogna fare un presupposto: considereremo le misure standard della window, risultanti alla risoluzione 800 x 600, e per conoscerle, potremo usare queste semplici istruzioni:

  • Sub DimmiMisure()
    x = Application.UsableWidth
    h = Application.UsableHeight
    MsgBox x & " x " & h
    End Sub

ed otterremo il messaggio che ci avvisa con le seguenti misure : 597 x 309 (ripeto, sono misure che possono variare tra computer e computer, ma possiamo assumerle come valori base per le spiegazioni che seguono).

Se la risoluzione la impostiamo a 1024 x 768, le misure saranno : 765 x 435, chiaramente maggiori rispetto alle misure viste con l'altra risoluzione.

Passiamo ora a fare alcune considerazioni: quando inseriamo una UserForm nel nostro progetto, generalmente la dimensioniamo in modo adeguato, e soprattutto la rendiamo atta a contenere i vari "oggetti" ActiveX che ci serviranno (textBox, CommandButton, Label, ListBox, ecc.); tutti questi "oggetti" prendono il nome di "Controls" (Controlli ActiveX).

Normalmente usiamo dimensionare la Userform direttamente nell'editor di visual basic, salvo aggiustamenti quando proviamo poi a chiamarla sul foglio. Probabilmente lo facciamo senza accorgerci che stiamo agendo su quattro proprietà della UserForm, proprietà che ci serviranno se vorremo usare l'autodimensionamento, queste proprietà sono:

  • Height - indica e determina l'altezza della UserForm

  • Width -  indica e determina la larghezza della UserForm

  • Top - indica in punti la distanza tra la finestra di Excel (non del Foglio) e il bordo superiore della UserForm

  • Left - indica in punti la distanza dal bordo sinistro della finestra di Excel e il bordo sinistro della UserForm

In genere le ultime due proprietà, se non le modifichiamo, consentono l'autocentraggio della UserForm all'interno di Excel, in quanto sono impostate con valore a zero, e viene sfruttata un'altra proprietà della UserForm, la proprietà StatUpPosition che di default è impostata a CenterOwner (praticamente: al centro dello schermo in funzione delle misure altezza e larghezza impostate dall'utente).

Se passeremo quindi da una risoluzione 800x600 a una 1024x768 vorremo che la dimensione della nostra UserForm si adegui, ingrandendosi in proporzione al fattore di ingrandimento che esiste tra le due risoluzioni. Dovremo tenere presente però, che ingrandendo le dimensioni della UserForm, avremo bisogno che vengano ridimensionati anche i "controlli" inseriti nella userform. Anche tutti i "Controls" possiedono le stesse proprietà della UserForm che determinano larghezza ed altezza, come pure possiedono le proprietà Top e Left, che indicano la loro posizione all'interno della UserForm (e non più all'interno della finestra di Excel), cioè con Top si indica la distanza del controllo dal bordo superiore della UserForm, e con Left la distanza dal suo bordo sinistro. Regolando anche le nuove dimensioni per i Controls manterremo pressochè invariate le proporzioni tra UserForm e i suoi Controls.

Possiamo esaminare due esempi: una UserForm che avremo impostato ad una certa dimensione, lasciando che si autocentri automaticamente adeguandosi alla nuova risoluzione,  ed una userform che avremo già impostato a tutto schermo e che vorremo ancora a tutto schermo all'aumentare della risoluzione.

In entrambi i casi dovremo stabilire il coefficiente di variazione (fattore di conversione). Vediamo il primo esempio, in verde le spiegazioni: in questo caso, non disponendo di posizioni fisse per determinare "dove si trova" la UserForm sullo schermo(Top e Left), dovremo utilizzare altri parametri per impostare le nuove posizioni, mentre per larghezza ed altezza della userform utilizzeremo l'ingrandimento dato dal fattore di conversione:

esempio con UserForn NON a tutto schermo:

Private Sub UserForm_Activate()
x = Application.UsableWidth
'con "x"otteniamo l'attuale larghezza della window
h = Application.UsableHeight
'con "h" otteniamo l'attuale altezza della window
If x > 597 Then  
'se x è maggiore della larghezza testata per 800x600, allora
xa = x / 597 
'impostiamo con "xa" il fattore di conversione tra le due risoluzioni (per la larghezza)
ha = h / 309
  'e con "ha" il fattore di conversione tra le due risoluzioni (per l'altezza)
'sotto: ora diamo le nuove dimensioni moltiplicando altezza e larghezza per i f.d.c., usando in 'questo caso l'istruzione With (vedi articolo sull'altro sito)
With UserForm1
.Height = .Height * ha
.Width = .Width * xa

'per quanto riguarda la posizione a schermo, disponiamo di due parametri: la larghezza attuale 'della window, e la nuova larghezza della UserForm; facendo la sottrazione tra queste due misure 'e dividendo per 2, otteniamo il valore da assegnare alla proprietà Left della UserForm
lefta = (x - .Width) / 2 
.Left = lefta

'per quanto riguarda invece la distanza dal bordo superiore della finestra Excel, disponiamo solo 'di due misure non coerenti: l'altezza attuale della window (quindi NON di tutta la finestra Excel), 'e l'attuale altezza della userform. Possiamo però avvicinarci al centraggio in verticale della 'userform, facendo la differenza tra queste due altezze e moltiplicandolo poi per il f.d.c. otteniamo 'così il valore da assegnare alla proprietà Top della userform
toppa = (h - .Height) * ha
.Top = toppa
End With

'Ora dobbiamo ridimensionare anche le misure dei controlli inseriti nella userform, in modo che si 'riallineino non sovrapponendosi; in questo caso useremo un ciclo che per ogni Control (ctr) 'nell'insieme dei Controls, si incrementino le quattro misure che li identificano, moltiplicandole per i 'f.d.c.; comprenderemo nell'ingrandimento pure i Font, per adeguarli alle nuove misure
For Each ctr In UserForm1.Controls
ctr.Width = ctr.Width * xa
ctr.Height = ctr.Height * ha
ctr.Font.Size = ctr.Font.Size * xa
ctr.Top = ctr.Top * ha
ctr.Left = ctr.Left * xa
Next
End Sub

Il centraggio della UserForm orizzontale è assicurato, se noteremo invece necessità di aggiustamenti per il centraggio verticale basterà aggiungere un valore in punti alla variabile "toppa", per esempio:

  • .Top = toppa + 10

Esempio con UferForm a tutto schermo:

In questo esempio invece consideriamo una UserForm che, manualmente, avremo impostato a tutto schermo ad una risoluzione 800x600,  e che vorremo sempre a tutto schermo se aumenteremo la risoluzione video. Le istruzioni sono simili a quelle appena viste; dovremo solo intervenire in maniera diversa sull' altezza della Userform, per aggiungere un valore al rapporto di conversione; non ci scordiamo che per quanto riguarda l'altezza, il termine di confronto non è l'altezza schermo, ma l'altezza della window. Per i Controls le istruzioni saranno uguali. Vediamo la routine e le spiegazioni solo sulle istruzioni modificate:

Private Sub UserForm_Activate()
x = Application.UsableWidth
h = Application.UsableHeight
If x > 597 Then
xa = x / 597
ha = h / 309
With UserForm1
.Top = 1
'impostiamo il bordo superiore della userform ad inizio videata dall'alto
.Left = 1 
'impostiamo il bordo sinistro della userform ad inizio videata da sinistra
.Height = Application.UsableHeight  + 130
'per quanto riguarda la nuova altezza, aggiungiamo il 'valore di 130 punti che corrisponde grosso modo alla differenza tra l'altezza della window e 'l'altezza della finestra di Excel. Variando questo valore ognuno potrà ottimizzare le proprie misure
.Width = Application.UsableWidth
End With
For Each ctr In UserForm1.Controls
ctr.Width = ctr.Width * xa
ctr.Height = ctr.Height * ha
ctr.Font.Size = ctr.Font.Size * xa
ctr.Top = ctr.Top * ha
ctr.Left = ctr.Left * xa
Next
End If

Spero di essere stato chiaro e di aver suggerito un metodo "fai da te" senza ricorrere ad OCX specifici.

Buon lavoro.

prelevato sul sito www.ennius.altervista.org