Ciao Alessandro
Ti allego file (Rale75_2.xlsm) dove
Nel modulo del foglio1 ho inserito questa macro
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, Range("a2:e19")) Is Nothing Then
If Target.Value <> "" Then Exit Sub
UserForm1.Show
End If
End Sub
Che ad ogni selezione di una cella dell'intervallo A2:E19 (ovviamente andrà modificato sulla base delle tue esigenze) fa comparire una maschera che contiene una casella di testo; quando digiterai qualcosa comparirà una casella di riepilogo che mostrerà un elenco filtrato dei comuni sulla base delle lettere digitate.
Se clicchi su uno dei comuni della casella di riepilogo questo verrà copiato nella cella attiva (ossia la cella dove è il cursore.
Questo il codice associato alla maschera ed ai suoi controlli.
Option Explicit
Option Compare Text
Private sh As Worksheet
Private Sub ListBox1_Click()
ActiveCell.Value = UserForm1.ListBox1.Value
UserForm1.ListBox1.Visible = False
UserForm1.Hide
End Sub
Private Sub TextBox1_Change()
UserForm1.ListBox1.Visible = True
Call mCaricaListBox("FiltraDati")
End Sub
Private Sub UserForm_Initialize()
Set sh = ThisWorkbook.Worksheets("Foglio2")
UserForm1.ListBox1.Visible = False
Call mCaricaListBox("CaricaDati")
End Sub
Private Sub mCaricaListBox(ByVal s As String)
Dim lRiga As Long
Dim lng As Long
With sh
lRiga = .Range("A" & .Rows.Count).End(xlUp).Row
End With
With Me.ListBox1
If s = "CaricaDati" Then
For lng = 1 To lRiga
.AddItem (sh.Range("A" & lng).Value)
Next
ElseIf s = "FiltraDati" Then
.Clear
For lng = 2 To lRiga
If InStr(sh.Range("A" & lng).Value, Me.TextBox1.Text) Then
.AddItem sh.Range("A" & lng).Value
End If
Next
End If
End With
End Sub
Private Sub UserForm_Terminate()
Set sh = Nothing
End Sub
Ho seguito un approccio diverso rispetto a quello adottato da by Sal nel file allegato alla precedente discussione ma, per quanti sforzi abbia fatto non sono riuscito a capire la logica di funzionamento di quel file.
Spero che per te non sia un problema.
Prova un po' il file e fai sapere.