Fidatevi che quello che per voi è semplice, per noi comuni mortali non lo è però mi ci metterò d'impegno
Noi non sfuggiamo alla regola di essere "comuni mortali" e tutti siamo partiti dal punto che non si sapeva nulla di queste cose.
Con l'occasione (so di essere testardo

) propongo una macro un po' più semplice della precedente commentata rigo per rigo
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ur As Long
Dim cel As Range
If Not Intersect(Target, Range("B2")) Is Nothing Then
Foglio2.Range("B3:B1000").ClearContents
For Each cel In Foglio1.Range("B3:D" & Foglio1.Cells(Rows.Count, 2).End(xlUp).Row)
ur = Foglio2.Cells(Rows.Count, 2).End(xlUp).Row
If Foglio1.Cells(2, cel.Column).Value = Target.Value Then
Foglio2.Cells(ur + 1, 2).Value = cel.Value
End If
Next cel
End If
End Sub
Righe 2 e 3: dichiarazione delle variabili necessarie
Riga 4: verifico che la cella che sto modificando sia la B2 (dove c'è la convalida)
Riga 5: cancello l'intervallo B3:B1000 del foglio2
Riga 6: inizio un ciclo For Each con cui esamino, cella per cella l'intervallo che va B3 all'ultima cella piena in colonna D
Riga 7: memorizzo il numero di riga dell'ultima cella piena in colonna B del Foglio2
Riga 8: se il valore presente in riga 2 colonna della variabile cel del ciclo For Each è uguale al valore scelto in convalida allora
Riga 9: nella prima cella vuota libera in colonna B del foglio mette il valore della cella (variabile cel del ciclo For Each
Riga 10: chiusura If
Riga 11: chiusura ciclo For Each
Riga 12: chiusura secondo If
Anche questo codice, come il precedente, va nel modulo del foglio2 non in un modulo standard