Ciao Claudio,
Come faccio a Filtrare in una ListBox un elenco di nominativi presenti in una Colonna ( "A") di una Tabella di un Foglio Excel , immettendo una lettera in una TextBox .
Esempio
Inserisco nella TextBox la lettera "C" e Vorrei .... che nella ListBox venga caricato SOLO l'elenco dei Nominativi che Iniziano per "C"
..... ho imparato a popolare correttamente le ListBox ... ma non conosco il modo corretto per dare l'istruzione VB per filtrare i dati di un Range di celle
In un modulo standard, incolla il seguente codice:
'=========>>
Option Explicit
'--------->>
Public Sub Tester()
UserForm1.Show vbModeless
End Sub
'--------->>
Public Function SortedList(V As Variant)
Dim oSortedList As Object
Dim arrOut() As Variant
Dim sStr As String
Dim i As Long
Set oSortedList = CreateObject("System.Collections.Sortedlist")
With oSortedList
For i = LBound(V) To UBound(V)
sStr = V(i) ', 1)
If Not sStr = vbNullString Then
If Not .ContainsKey(sStr) Then
.Add Key:=sStr, Value:=i
End If
End If
Next i
ReDim arrOut(1 To .Count)
For i = 0 To .Count - 1
arrOut(i + 1) = .GetKey(i)
Next i
End With
SortedList = arrOut
End Function
'--------->>
Public Function LastRow(SH As Worksheet, _
Optional Rng As Range, _
Optional minRow As Long = 1)
If Rng Is Nothing Then
Set Rng = SH.Cells
End If
On Error Resume Next
LastRow = Rng.Find(What:="*", _
after:=Rng.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0
If LastRow < minRow Then
LastRow = minRow
End If
End Function
'<<=========
Crea una Userform con i seguenti controlli:
- Una ListBox (lbDatiFiltrati)
- Una TextBox (tbCriterioFiltraggio)
- Un CommandButton (cbFiltra)
- Un secondo CommandButton (cbEsce)
- Un Label (lblCriterioFiltro)
Nel Modulo di codice della Userform, incolla il seguente codice:
'=========>>
Option Explicit
Option Compare Text
Dim WB As Workbook
Dim srcSH As Worksheet
Dim RngTabella As Range
Dim arrIn As Variant
'--------->>
Private Sub UserForm_Initialize()
Dim i As Long, j As Long, k As Long
Dim LRow As Long
Const sFoglio As String = "Foglio1" '<=== Modifica
Set WB = ThisWorkbook
Set srcSH = WB.Sheets(sFoglio)
With srcSH
LRow = LastRow(srcSH, .Columns("A:A"))
Set RngTabella = .Range("A2:A" & LRow)
End With
arrIn = RngTabella.Value
With Me
.BackColor = &HC0FFFF
.Caption = "Filtra Tabella"
With .cbEsce
.Caption = "Esce"
.ForeColor = &HFF&
End With
With .cbFiltra
.Caption = "Filtra Dati!"
.ForeColor = &HFF&
.TabIndex = 2
End With
With .lbDatiFiltrati
.MatchEntry = fmMatchEntryComplete
.Font = "Tahoma"
With .Font
.Size = 10
End With
.List = SortedList(Application.Transpose(arrIn))
End With
With .lblCriterioFiltro
.Caption = "Lettere Iniziali del Filtro"
.BackColor = Me.BackColor
.ForeColor = &HFF0000
.Font = "Tahoma"
With .Font
.Bold = True
.Size = 7
End With
End With
With .tbCriterioFiltraggio
With .Font
.Bold = True
.Size = 10
End With
.ForeColor = &HFF0000
.TabIndex = 1
.SetFocus
End With
End With
End Sub
'--------->>
Private Sub cbFiltra_Click()
Dim arrFiltrati() As Variant
Dim sCriterio As String
Dim iLen As Long, i As Long, j As Long
With Me
sCriterio = .tbCriterioFiltraggio.Text
If sCriterio = vbNullString Then
Call MsgBox( _
Prompt:="Non hai imesso alcun criterio di filtaggio" _
& vbNewLine & vbNewLine _
& "I dati non sono filtrati!", _
Buttons:=vbInformation, _
Title:="REPORT")
.lbDatiFiltrati.List = arrIn
Me.tbCriterioFiltraggio.SetFocus
Exit Sub
Else
iLen = Len(sCriterio)
End If
For i = 1 To UBound(arrIn)
If Left(arrIn(i, 1), iLen) = sCriterio Then
j = j + 1
ReDim Preserve arrFiltrati(1 To j)
arrFiltrati(j) = (arrIn(i, 1))
End If
Next i
With .lbDatiFiltrati
If CBool(j) Then
.List = SortedList(arrFiltrati)
Else
.Clear
Call MsgBox(Prompt:="Dati non trovati - controlla il criterio!", _
Buttons:=vbInformation, _
Title:="REPORT")
Me.tbCriterioFiltraggio.SetFocus
End If
End With
End With
End Sub
'--------->>
Private Sub cbEsce_Click()
Unload Me
End Sub
'<<=========
Nota i seguenti punt:
- All'avvio della Userform. i dati della prima colonna della tabella verranno caricati nel controllo ListBox in modo ordinato;
- I dati filtati saranno sempre ordinati;
- Nel controllo ListBox, si può selezionare dati digitando il primo carattere
- Si può raffinare la ricerca ulteriormente digitando dei caratteri successivi
- Il filtraggio non fa distinzione tra maiuscole e minuscole (case insensitive)
- I dati della tabella possono essere filtrati utilizzando il primo carattere come il criterio di filtro o il filtraggio può essere reso più preciso stipulando più caratteri.
- Sul Foglio1 si trova un pulsante per avviare la Userform:

Potresti scaricare il mio file di prova Claudio20161021.xlsm a:
https://www.dropbox.com/s/ahfzy0zfoj63ig8/Claudio20161021.xlsm?dl=0
===
Regards,
Norman
