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:
