Ma se lo scopo è memorizzare in un file l'albero delle cartelle ti basta usare il comando shell tree, magari ridirezionandone l'output su un file.
1) il primo dubbio rimane sempre: esisterà un'implementazione più elegante?
Boh, a me pare di averla scritta il più elegante possibile... la funzione ricorsiva funziona benone in questi casi, pur aggiungendo un certo overhead a causa delle riscritture nello stack causate dalla ricorsione (ma si tratta comunque di un effetto trascurabile).
2) problema problema problema: viene messa l'indentazione anche alla cartella root. Un modo per risolverlo, SENZA mettere un fastidioso "If" che vede se la cartella è la root e SENZA inserire nel codice chiamante il For Each...Next relativo alle sottocartelle, rinunciando all'elegante ListFolders mFso.GetFolder(Root), strSpaces ? A me sembra che non esista
Sposta l'aggiunta dell'indentazione:
codice:
Dim mFso, Drive, fList, strSpaces, strIndent
Root = "c:\"
Set mFso = CreateObject("Scripting.FileSystemObject")
Set fList = mFso.CreateTextFile("C:\ElencoCartelle.txt", true)
strSpazi = "" 'Occhio: qui il nome è sbagliato, anche se si tratta di un'istruzione trascurabile
strIndent = "   "
ListFolders mFso.GetFolder(Root), strSpaces
Set fList = Nothing
Set mFso = Nothing

Sub ListFolders(Fld, strSpazi) 
   On Error Resume Next
   Dim strFolder, subFolder   
   fList.WriteLine(strSpazi & Fld)
   'Imposta la variabile strFolder sulla cartella corrente
   'Enumera le cartelle contenute
   For Each strFolder In Fld.Subfolders
	strSpazi = strSpazi & strIndent
        fList.WriteLine(strSpazi & strFolder)
   	If strFolder.SubFolders.Count > 0 Then
       	   For Each subFolder In strFolder.SubFolders
              'Processa la sottocartella	
              strSpazi = strSpazi & strIndent
              ListFolders subFolder, strSpazi
           Next
        End If
        strSpazi = Left(strSpazi, Len(strSpazi) - Len(strIndent))
   Next
   strSpazi = Left(strSpazi, Len(strSpazi) - Len(strIndent))
End Sub