Condividi tramite

dimensionamento colonne listbox in funzione della userform

Anonimo
2018-01-25T08:13:43+00:00

Buongiorno a tutti,

avrei un ennesimo problema sul dimensionare la larghezza di tre colonne in funzione della userform.

Ho creato una userform con una listbox a tre colonne.

Per motivi di visualizzazione ho impostato la larghezza delle prime due colonne ed esattamente la prima a 365 punti mentre la seconda a 25 punti.

Inoltre la userform ove risiede la listbox ha una grandezza naturale di 800 x 600 e sfruttando la proprietà resize della stessa all'ingrandimento della userform i vari controlli in essa si dimensionano in base a dei valori che ho impostato sfruttando me.insidewidth e me.insideheight.

Detto questo, non ho proprio idea a come far aumentare (se possibile) i punti della prima colonna della listbox all'ingrandimento della userform e viceversa.

Posto due foto per farvi vedere la differenza tra la userform a grandezza naturale ed una volta ingrandita.

Tutti i controlli ed altre listbox sul form sono state gestite al meglio, l'unico problema visivo è su questa in basso perchè ho la larghezza colonna preimpostata.

Anticipatamente ringrazio

Saluti

Giuseppe

Userform a grandezza naturale le due colonne si trovano a fine listbox:

Userform ingrandita le ultime due colonne si trovano al centro causa dimensionamento della prima colonna:

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2018-01-25T15:23:59+00:00

Ciao Giuseppe,

il mio voleva essere solo un banale esempio di come impostare, in fase di lancio della userform, la proprietà.

Poco contava il popolamento. Avevo spiegato cosa facevo per far capire il codice.

Diciamo che quello che contà è l'evento Inizialize (o Activate) della UserForm.

Nel tuo caso specifico prova ad aggiungere anche la misura della terza colonna della listbox.

Ad es.

LB_CertificateOnBoard.ColumnWidths = LB_CertificateOnBoard.Width / 3 * 2 + GAP * 25 & ";25**;25**"

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2018-01-25T15:38:11+00:00

    Ciao casanmaner,

    infatti l'errore era proprio li.

    Facendo i miei test mi sono reso conto che omettevo la terza colonna e quando l'ho messa tutto si allineava come volevo.

    Poi mi è arrivato il tuo messaggio che mi ha confermato il mio dubbio.

    Grazie come al solito, mi aprite sempre la mente.

    Buona serata a tutti.

    Giuseppe

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2018-01-25T13:49:34+00:00

    Ciao Casanmaner,

    ho provato il tuo codice su una userform pulita e va benissimo ma dove devo applicarla io non va bene perchè non prendo i valori dal foglio direttamente da un range ma da un controllo effettuato sul tutto il foglio in funzione di alcuni parametri.

    Il codice che sto usando per popolare le listbox me lo creasti proprio tu.

    Ti posto una parte del codice:

    For I = 1 To NumColumnCR2 - 1

          '<--- caricamento dati in LB_Mandatory e LB_Racommended --->

          If Left(UCase(FindCertificateFromWsCertificate.Offset(0, I).Value), 1) = "M" Then

            .LB_Mandatory.AddItem Ws2Rng1.Offset(0, I).Value

          End If

          If Left(UCase(FindCertificateFromWsCertificate.Offset(0, I).Value), 1) = "R" Then

            .LB_Racommended.AddItem Ws2Rng1.Offset(0, I).Value

          End If

            '<--- caricamento dati in LB_CertificateOnBoard e LB_CertificateExpired --->

            For t = 1 To NumColumnCR1 - NumColPersonalData

              '<--- certificati obbligatori --->

              If Left(UCase(FindCertificateFromWsCertificate.Offset(0, I).Value), 1) = "M" Then

                '<--- corrispondenza tra certificato nel foglio Certificate e Foglio Crew --->

                If Ws1Rng1.Offset(0, t + DeltaOffWs1Rng1).Value = Ws2Rng1.Offset(0, I).Value Then

                  '<--- presenza di un valore nel foglio crew in corrispondenza di un membro dell'equipaggio --->

                  If FindCertificateFromWsCrew.Offset(0, t + DeltaOffFindCertFromWsCrew).Value <> "" Then

                    '<--- carica i certificati a bordo a prescindere che siano scaduti, in scadenza o non abbiano scadendenza --->

                    With .LB_CertificateOnBoard

                      .AddItem

                      .List(.ListCount - 1, 0) = Ws1Rng1.Offset(0, t + DeltaOffWs1Rng1).Value

                      .List(.ListCount - 1, 1) = "M"

                      .List(.ListCount - 1, 2) = FindCertificateFromWsCrew.Offset(0, t + DeltaOffFindCertFromWsCrew).Text

                    End With

                    '<--- se il valore è una data verifica se rispetto alla data odierna il certificato è scaduto o in scadenza --->

                    If IsDate(FindCertificateFromWsCrew.Offset(0, t + DeltaOffFindCertFromWsCrew).Value) Then

                      If FindCertificateFromWsCrew.Offset(0, t + DeltaOffFindCertFromWsCrew).Value <= Today + 90 Then

                        With .LB_CertificateExpired

                          .AddItem

                          .List(.ListCount - 1, 0) = Ws1Rng1.Offset(0, t + 2).Value

                          .List(.ListCount - 1, 1) = FindCertificateFromWsCrew.Offset(0, t + DeltaOffFindCertFromWsCrew).Text

                          If FindCertificateFromWsCrew.Offset(0, t + DeltaOffFindCertFromWsCrew).Value - Today > 0 Then

                            .List(.ListCount - 1, 2) = FindCertificateFromWsCrew.Offset(0, t + DeltaOffFindCertFromWsCrew).Value - Today

                          Else

                           .List(.ListCount - 1, 2) = "Expired!"

                          End If

                        End With

                      End If

                    End If

                  Else '<--- assenza di un valore nel foglio crew in corrispondenza di un membro dell'equipaggio --->

                    With .LB_CertificateExpired

                      .AddItem

                      .List(.ListCount - 1, 0) = Ws1Rng1.Offset(0, t + DeltaOffWs1Rng1).Value

                      .List(.ListCount - 1, 1) = "To be done!"

                      .List(.ListCount - 1, 2) = "To be done!"

                    End With

                  End If

                End If

    Detto questo, ho trovato una mezza soluzione che mi da un risultato decente ma non so se è fatta bene o meno.

    Ecco come ho impostato io il codice in modo che la larghezza della prima colonna varia a secondo della dimensione della userform:

    LB_CertificateOnBoard.ColumnWidths = LB_CertificateOnBoard.Width / 3 * 2 + GAP * 25 & ";25"

    Gap è un valore che ho per avere sempre la stessa distanza tra i controlli.

    L'unico problema è che così, se pur ho inserito il valore della seconda colonna, non la gestisce e quindi la terza colonna è un po' più lontana. 

    Ti allego anche i due nuovi shoot per farti vedere il risultato.

    Grazie

    Peppe

    Dimensione originale:

    Dimensione tutto schermo:

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2018-01-25T10:23:38+00:00

    Dovresti impostare via codice almeno il primo valore della proprietà ColumnWidths della ListBox.

    Ad es. in una UserForm dove ho inserito una list box che prende i valori dalla "CurrentRegion" della cella A1.

    Imposto la proprietà Width della ListBox in base al 95% della proprietà InsideWidth della UserForm.

    Successivamente imposto una ulteriore variabile pari al 75% e la applico come primo valore della proprietà ColumnWidths della ListBox

    Private Sub UserForm_Initialize()

      Dim ListBoxWidth As Double

      Dim ListBoxFirstColumnWidths As Double

      With Me

        ListBoxWidth = .InsideWidth * 0.95

        ListBoxFirstColumnWidths = ListBoxWidth * 0.75

        With .ListBox1

          .Width = ListBoxWidth

          .Height = 100

          .ColumnCount = 2

          .List = Range("A1").CurrentRegion.Value

          .ColumnWidths = ListBoxFirstColumnWidths & ";25"

        End With

      End With

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento