Aqui te va un ejemplo usando DIR, creando controles durante la ejecucion, ejecutando RECURSIVAMENTE un sub, etc. etc....
Abres VB, nuevo proyecto EXE, pegas el codigo con la forma en blanco (sin controles) y lo ejecutas...
' ..............
Dim bDetener As Boolean
Dim lblArchivo As Label
Dim lblStatus As Label
Dim WithEvents txtArchivo As TextBox
Dim WithEvents listResultado As ListBox
Dim WithEvents cmdIniciar As CommandButton
Dim WithEvents cmdDetener As CommandButton
Dim WithEvents cmdSalir As CommandButton
Private Sub BuscarFolders(cPath As String)
Dim cDir As String
Dim arrayPaths() As String
Dim nLenPaths As Long
' Busco el archivo indicado en el path actual
lblStatus.Caption = cPath & txtArchivo
lblStatus.Refresh
cDir = Dir(cPath & txtArchivo, vbNormal)
' Si lo encuentro lo agrego al listbox (path y archivo)
If cDir <> "" Then
listResultado.AddItem cPath & txtArchivo
End If
' Ejecuto los eventos que hubiese pendientes
DoEvents
If bDetener Then
Exit Sub
End If
' Obtengo lista de directorios disponibles bajo el path indicado
nLenPaths = 0
cDir = Dir(cPath, vbDirectory) 'Primer directorio disponible
Do While cDir <> ""
If cDir <> "." And cDir <> ".." Then
nLenPaths = nLenPaths + 1
ReDim Preserve arrayPaths(nLenPaths)
arrayPaths(nLenPaths) = cPath & cDir & "\"
End If
cDir = Dir ' Siguiente Directorio Disponible
Loop
' Ver si se cargo algun directorio en el array
If nLenPaths <= 0 Then
Exit Sub
End If
' Por cada directorio encontrado ejecuto en forma recursiva
' esta misma funcion hasta que la misma salga por si sola
' al no encontrar mas folders dentro del folder que se le
' indica, o hasta que se encienda la bandera bDetener ...
For nLenPaths = 1 To UBound(arrayPaths)
BuscarFolders arrayPaths(nLenPaths)
DoEvents
If bDetener Then
Exit Sub
End If
Next
End Sub
Private Sub listResultado_Click()
listResultado.ToolTipText = listResultado.List(listResultado.ListIndex)
End Sub