restringere un userform



  • restringere un userform
    di accordix data: 07/03/2016 20:44:29

    E' possibile restringere una userform dato che sullo schermo del portatile non mi ci entra?



  • di tanimon data: 07/03/2016 21:21:51

    ciao,
    certo che lo puoi fare.
    Devi impostare le proprietà larghezza (Width) e altezza(Height) ai valori necessari.
    Un pò come quando noi volevamo entrare in una 500 (l'auto)



  • di alfrimpa data: 07/03/2016 21:35:04

    Ciao Accordix

    Innanzitutto consentimi di salutare Tanimon: ciao Frank è sempre un piacere leggerti.

    A mio avviso potresti usare una funzione delle API di Windows (la specifica function si chiama GetComputerName se fai una ricerca con Google trovi) per discriminare i nomi dei due computer (che ovviamente devono essere diversi) e quindi settare in automatico la dimensione della userform in base al computer in uso.

    Alfredo





  • di accordix data: 07/03/2016 22:25:02

    .........GetComputerName????
    Perche' dovrei conoscere i nomi dei PC?
    scusami potresti farmi capire meglio?



  • di alfrimpa data: 07/03/2016 22:37:35

    Premetto che la mia è solo un'idea che va verificata.

    Ammesso e non concesso che questa funzione restituisca il "nome" del pc in uso a quel punto è un gioco da ragazzi metterla in una cella di un foglio di lavoro e condizionare le dimensioni della userform al valore di quella cella.

    Ma, ripeto, è tutta da testare; magari domani faccio qualche prova.

    Alfredo





  • di alfrimpa data: 07/03/2016 22:54:07

    Comunque, riflettendo, credo che la cosa non sia tanto semplice.

    Non tanto per il dimensionamento della form (che probabilmente si può anche fare) quanto per la "riduzione" dei controlli in essa contenuti che non possono rimanere invariati.

    Quindi anche per i controlli si dovranno determinare le dimensioni "rimpicciolite".

    Alfredo





  • di accordix data: 08/03/2016 06:00:01

    trovato nome del pc in uso

    ..... continuo a non capire

    scusa



  • di patel data: 08/03/2016 07:58:27

    non è chiara la tua domanda, vuoi adattare la userform secondo il dispositivo che usi o la vuoi ridurre e basta ?





  • di accordix data: 08/03/2016 08:16:07


    Se metto sul portatile, essendo il monitor con risoluzione diversa, non ci entra cosi pure se metto sul pc dell'ufficio mi visualizza la userform in modo diverso.
    Quindi pensavo a qualcosa che mi adattasse a secondo della risoluzione.

    E' possibile?



  • di patel data: 08/03/2016 09:06:10

    prova questa macro e adattala alla tua situazione
     
    Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
    '---------------------------------
    Public Function GetSR() As Variant
    GetSR = Array(GetSystemMetrics(0), GetSystemMetrics(1))
    End Function
    '-----------------
    Sub ResizeForm_R1()
    ' Adjusts userform size to compensate for screen resolution changes.
    
    'Call function to get actual screen resolution
    varSize = GetSR
    resX = varSize(0)
    resY = varSize(1)
    
    'Determine ratio of actual screen resolution to
    'the original or base resolution.
    RatioX = resX / UserForm1.Width
    RatioY = resY / UserForm1.Height
    RY = 3.5
    RX = 1.66
    
    Fact = 1 ' 1 = full screen
    'Adjust userform magnification and size.
    UserForm1.Zoom = 100 * RatioX / 1.66 / Fact
    UserForm1.Width = UserForm1.Width * RatioX / RX / Fact
    UserForm1.Height = UserForm1.Height * RatioY / RY / Fact
    UserForm1.Show
    End Sub
    






  • di accordix data: 08/03/2016 10:02:49

    i controlli non seguono il resize della userform
    ho trovato questa in rete

    ma pure con questa ho problemi con il testo che non si diminuisce
     
    Public Declare Function GetDesktopWindow Lib "user32.dll" () As Long
    
    Public Declare Function GetWindowRect Lib "user32.dll" ( _
         ByVal hwnd As Long, _
         ByRef lpRect As RECT) As Long
    
    Public Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
    End Type
    
    
    Sub AdattaForm(frm As String)
    
    Dim hwndDesk As Long
    Dim DeskRect As RECT
    Dim DeskH As Long, DeskW As Long
    Dim ProjW As Integer, ProjH As Integer
    Dim OrigW As Integer, OrigH As Integer
    Dim r As Integer, nz As Integer
    Dim i As Integer, frmIndex As Integer
    
    For i = 0 To UserForms.Count
        If UserForms(i).Name = frm Then
            frmIndex = i
            Exit For
        End If
    Next i
            
    ProjW = 1600   'imposto la risoluzione di progettazione
    ProjH = 900
    
    hwndDesk = GetDesktopWindow
    GetWindowRect hwndDesk, DeskRect
    DeskW = DeskRect.Right - DeskRect.Left
    DeskH = DeskRect.Bottom - DeskRect.Top
    
    OrigW = UserForms(frmIndex).Width
    OrigH = UserForms(frmIndex).Height
    
    UserForms(frmIndex).Width = (OrigW * DeskW) / ProjW
    UserForms(frmIndex).Height = (OrigH * DeskH) / ProjH
    nz = (UserForms(frmIndex).Zoom * DeskH) / ProjH
    NewZoom = IIf(nz > 400, 400, IIf(nz < 10, 10, nz))
    UserForms(frmIndex).Zoom = NewZoom
    
    End Sub
    



  • di patel data: 08/03/2016 10:43:23

    devi fare il contrario, disegnare la userform per la risoluzione più bassa ed ingrandirla per quella più alta





  • di accordix data: 08/03/2016 10:54:32

    Beh, il problema si e' presentato dopo e rifare la form e' na faticaccia
    Non si puo intervenire sulla grandezza del font che e' sempre lo stesso?



  • di patel data: 08/03/2016 12:00:15

    non credo che sia sufficiente, anche le posizioni e le dimensioni dei vari controlli cambiano, l'unico modo è usare lo zoom partendo dalla userform più piccola





  • di Marius44 data: 08/03/2016 18:58:46

    Salve a tutti
    Qualche tempo fa l'amico scossa (che saluto) postò una macro che ingrandiva Una Form.
    Empiricamente ho "adattato" quella macro per "ridurre" l'ampiezza della Form, giocando sia con Height e Width ma anche con lo Zoom. In altre parole non ho fatto altro che mettere /2 (cioè diviso 2) a quelle proprietà.
    Vedi se ti va bene.
    Ciao,
    Mario

     
    Private Sub CommandButton1_Click()
        Unload Me
    End Sub
    Private Sub UserForm_Initialize()
    'by scossa e marius
    
    Dim nWd As Double
      With Me
        nWd = Application.Width / .Width
        .Top = Application.Top
        .Left = Application.Left
        .Width = Application.Width / 2
        .Height = Application.Height / 2
        .Zoom = (Round(nWd, 1) * 100) / 2
      End With
    End Sub



  • di accordix data: 08/03/2016 19:25:44

    la procedura che ho trovato e sto usando funziona bene solo sulle caption e il testo in generale ho problemi
    con la procedura di marius rimangono fuori i controlli

    cmq grazie per l'interessamento



  • di accordix data: 08/03/2016 19:57:16

    ........e sembra che con questa procedura ho risolto anche per i controlli
    trovata su ExcelVba su una vecchia discussione

    sul mio monitor funge domani provero' su altri  



    p.s. Risolto e' una parola moooolto grande -.-
    in parte funziona ma mi diminuisce tutte le caption 
    chissa s si potrebbe integrarla con lil ridimensionamento della Userform
     
    Dim controlli As Control
    For Each controlli In Me.Controls
        If TypeOf controlli Is MSForms.Frame Then
             controlli.Font.Size = 11
         Else
             controlli.FontSize = 10
        End If
    Next controlli



  • di accordix data: 09/03/2016 08:53:13

    Anche questa trovata su ExcelVba
    con un po di prove ho raggiunto il risultato che volevo

    Partendo da questo chiedo agli esperti
    " Magari cercare di legare la grandezza del font in funzione della risoluzione?"
    cioe dovrebbe variare al variare della risoluzione ma in automatico


    Quale collegamento si potrebbe trovare per far cio'

     
    Sub UserForm_Initialize()
    Application.WindowState = xlMaximized
        Zo_W = Application.Width / UserForm1.Width
        Zo_H = Application.Height / UserForm1.Height
        If Zo_W < Zo_H Then
            mZoom = Zo_W
        Else
            mZoom = Zo_H
        End If
        
        mZoom = mZoom * 1 ' < < = = = = =  1 è un fattore di aggiustamento cambia al variare della risoluzione
        mH = UserForm1.Height
        mW = UserForm1.Width
        UserForm1.Width = UserForm1.Width * mZoom
        UserForm1.Height = UserForm1.Height * mZoom
        
        Zo_W = UserForm1.Width / mW
        Zo_H = UserForm1.Height / mH
        For Each ctr In UserForm1.Controls
            ctr.Width = ctr.Width * Zo_W
            ctr.Height = ctr.Height * Zo_H
            ctr.Font.Size = ctr.Font.Size * Zo_H * 1
            ctr.Top = ctr.Top * Zo_H
            ctr.Left = ctr.Left * Zo_W
        Next
    End Sub



  • di patel data: 09/03/2016 09:11:14

    la risoluzione la ottieni con la prima macro che ti ho postato, cerca una relazione tra mZoom e la risoluzione





  • di accordix data: 09/03/2016 16:28:10

    cit. di patel iniziata il 09/03/2016 09:11:14
    la risoluzione la ottieni con la prima macro che ti ho postato, cerca una relazione tra mZoom e la risoluzione

    vorrei pure ma non riesco a capire come



  • di patel data: 09/03/2016 18:26:23

    a tentativi, hai le risoluzioni dei tuoi dispositivi, provi vari livelli di mzoom e poi con un
    if risoluzione = x then
    mzoom = y
    elseif risoluzione = z then
    mzoom = h
    end if





  • di Marius44 data: 09/03/2016 21:41:34

    Buona sera a tutti
    Vedendo le varie macro postate ci ho ragionato un po' sopra. In altre parole credo che stiamo cercando qualcosa che consenta di ridimensionare, compresi i vari controls eventualmente presenti, una UserForm:
    a) ingrandendola se è troppo piccola per il nostro schermo/risoluzione;
    b) rimpicciolendola nel caso contrario.
    La macro che posto - molto simile a tutte quelle sin qui postate - ha una particolarità: assume altezza/larghezza della UserForm e, a seconda che sia più grande o più piccola dello schermo visibile la adatta alle misure dello schermo.
    Ho impostato la UserfForm a 400/400 con dentro una Label e CommandButton; la apro ed è a tutto schermo.
    Ho impostato la UserForm a 600/900 (va fuori dal mio schermo); la apro ed è a tutto schermo.
    Il "trucco" sta nelle due variabili alta e larga che, a seconda dell'apiezza dello schermo, aumento o diminuisco.
    Vi dispiace dare uno sguardo e dirmi se va bene.

    Ciao,
    Mario
     
    Option Explicit
    
    Private Sub UserForm_Initialize()
    Dim x As Double, h As Double, alta As Double, larga As Double
    Dim xa As Double, ha As Double, rap1 As Double, rap2 As Double
    x = Application.UsableWidth
    h = Application.UsableHeight
    alta = Me.Height
    larga = Me.Width
    If x > 597 Then
        xa = x / 597
        ha = h / 309
        With Me
            .Top = 1
            .Left = 1
            .Height = Application.UsableHeight + 140
            .Width = Application.UsableWidth
            If .Height > alta Then rap1 = ha Else rap1 = 1 / ha
            If .Width > larga Then rap2 = xa Else rap2 = 1 / xa
        End With
        For Each ctr In Me.Controls
            ctr.Width = ctr.Width * rap2
            ctr.Height = ctr.Height * rap1
            ctr.Font.Size = ctr.Font.Size * rap2
            ctr.Top = ctr.Top * rap1
            ctr.Left = ctr.Left * rap2
        Next
    End If
    End Sub
    
    Private Sub CommandButton1_Click()
        Unload Me
    End Sub
    



  • di accordix data: 10/03/2016 08:25:45

    La mia userform e' impostata a H=618 e W=1007.25 e sul mio monitor con risoluzione 1600x900 sta dentro.
    se uso la procedura di Marius44 lasciando cosi' com'e' la userform rimane nello schermo ma i controlli vengono ingranditi e non rientrano nella userform.
    Allego il file con la userform e la procedura postata da Marius44
    Sul portatile non ho ancora visto perche non e' nelle mie disponibilità al momento.



  • di patel data: 10/03/2016 09:23:41

    ripeto
    devi fare il contrario, disegnare la userform per la risoluzione più bassa ed ingrandirla per quella più alta





  • di Marius44 data: 10/03/2016 11:02:03

    Buon giorno a tutti
    @Accordix
    per favore, metti uno stop prima di questa riga "" If x > 597 Then ""
    poi guardi i valori (passandoci sopra col mouse) di x, h, alta e larga e ti regoli di conseguenza.
    Se ti allarga i controlli è perchè l'ampiezza della Form è maggiore dell'area utilizzabile di Excel (cioè UsableHeight e UsableWidth). Attenzione che la proprietà UsableHeight NON è l'altezza delle schermo ma la misura della base dello schermo fino alla barra della formula di Excel.

    Poi prova a impostare una Form molto più piccola del tuo schermo e lancia la macro; poi imposta la Form molto più grande del tuo schermo e lancia la macro.

    Prova e fai sapere. Ciao,
    Mario



  • di accordix data: 10/03/2016 20:49:51

    Il problema sono sempre i controlli che non rientrano
    non volevo ma sembra che dovro rifare la form

    la prossima volta lavorero' su un monitor piu piccolo
    -.-

    grazie a tutti per l'aiuto fornito



  • di Oscar (utente non iscritto) data: 16/03/2016 23:27:19

    Prova così se ci riesci , ho allegato anche un File
     
    Option Explicit
    Const ZoomStep = 1
    Dim Grow As Single
    
    Sub ctlResize(ByVal ctl As MSForms.Control)
        With ctl
            .Height = .Height / Grow
            .Width = .Width / Grow
            .Left = .Left / Grow
            .Top = .Top / Grow
        End With
    End Sub
    
    Private Sub CommandButton2_Click()
        Unload Me
    End Sub
    
    Private Sub ListBox1_Click()
    
    End Sub
    
    Private Sub SpinButton1_Change()
    Dim oldZ As Long
        With Me
            oldZ = Zoom
            .Zoom = .SpinButton1.Value
            Grow = Zoom / oldZ
            .Height = .Height * Grow
            .Width = .Width * Grow
            ctlResize .SpinButton1
            ctlResize .Label1
            With .Label1
                .Font.Size = .Font.Size / Grow
            End With
        End With
    End Sub
    
    Private Sub UserForm_Initialize()
        With Me.SpinButton1
            .Value = Me.Zoom
            .SmallChange = ZoomStep
        End With
    End Sub



  • di accordix data: 17/03/2016 09:10:46

    *Oscar La tua procedura funziona ma non capisco come applicarla alla mia
    non e' solo il restringimento o meno della userform ma l'adattamento alle varie risoluzioni

    Cmq visto le dimensioni della mia form ho deciso di cambiare sistema e ho inserito una multipage cosi ho spostato i controlli su varie pagine e ridotto le dimensioni della userform

    Grazie all'aiuto di quanti hanno partecipato e cmq le varie soluzioni postate potranno venire utili in altri momenti



  • di Oscar (utente non iscritto) data: 20/03/2016 02:21:01

    Si certo ma non è farina del mio sacco non ricordo più il nome del autore ma è bravo