Private Sub UserForm_Activate()
Dim col As Object
ur = Range("S:S").End(xlDown).Row
UC = ActiveSheet.UsedRange.SpecialCells(xlLastCell, xlNumbers).Column - 4
cont = 4
ListBox1.ColumnCount = cont 'ora impostiamo il numero di colonne da visualizzare nella ListBox1
Dim iCol() As Variant 'ora si imposta la matrice "iCol" di tipo Variant
Dim A
ReDim iCol(1 To cont) 'dimensioniamo la matrice indicando il numero di elementi che la comporranno (da 1 e fino a '"cont") (matrice dinamica)
A = 1 'inizializiamo il contatore "A" della matrice a 1
For Each cell In ActiveSheet.Range(Cells(1, 19), Cells(1, UC)) 'e per ogni cella nell'intervallo specificato
If cell.Columns.Hidden = False Then 'se la colonna della cella ora letta è visibile, allora
iCol(A) = cell.Column 'aggiungiamo alla variabile "iCol" nell'indice di matrice corrispondente ad "A", il numero di 'colonna ora letta
A = A + 1 'quindi si incrementa di 1 il contatore "A"
End If
Next 'e si passa alla cella successiva
'sotto: ora si inizia un doppio ciclo For Next: il ciclo esterno si occupa di definire quante righe scorrere, e dovremo 'iniziarlo da zero perchè lo stesso contatore "N" servirà anche per impostare l'indice iniziale di List nella ListBox che 'inizia appunto da zero e non da 1
For n = 0 To ur - 1
l = iCol(LBound(iCol)) 'con "L" prendiamo il numero di colonna memorizzato nel limite inferiore (LBound) della 'matrice "iCol", e ci serve per definire quale colonna ("L") della cella N + 3 (cioè dalla riga 3 del foglio) iniziare il 'metodo AddItem
ListBox1.AddItem ActiveSheet.Cells(n + 3, l)
'ora inizia il ciclo interno che scorrerà i numeri di colonna memorizzati nella matrice "iCol", caricando la ListBox1 'tramite List(indice riga, indice colonna) con i valori contenuti nelle celle(riga N+3, colonna "A" di "iCol")
For A = LBound(iCol) To UBound(iCol)
ListBox1.List(n, A - 1) = Cells(n + 3, iCol(A))
Next: Next
End Sub |