全てのファイル、フォルダ名を抽出して最後に拡張子のあるものを削除するしかないでしょうか。
↑
この方法に近いですが、DOSコマンドのDirコマンドに/adオプションをつければフォルダ情報のみ
取り出すことができます。さらに/sオプションでサブフォルダも検索すれば指定フォルダ以下のすべての
フォルダ情報を得られます。
Dir xxxxx /ad /s
↓
C:\Users\hogehoge\AppData\Roaming\Microsoft のディレクトリ
020/03/13 09:47 <DIR> .
020/03/13 09:47 <DIR> ..
020/08/07 09:12 <DIR> Credentials
016/03/04 14:59 <DIR> Crypto
020/08/03 10:53 <DIR> Forms
020/03/06 15:33 <DIR> Protect
016/03/07 17:06 <DIR> SystemCertificates
0 個のファイル 0 バイト
C:\Users\h.horikoshi\AppData\Roaming\Microsoft\Credentials のディレクトリ
2020/08/07 09:12 <DIR> .
2020/08/07 09:12 <DIR> ..
0 個のファイル 0 バイト
:
あとはこれを解析すればいかがかと…
サンプルコード
Private Sub CommandButton1_Click()
Dim root As String: root = "C:\Users" ' ルートパス
'
' Dirコマンドを発行して結果をtxtに格納
'
Dim wSh As Object: Set wSh = CreateObject("WScript.Shell")
Dim wEx As Object: Set wEx = wSh.exec("%ComSpec% /c Dir """ & root & """ /ad /s")
Dim txt As String: txt = wEx.StdOut.ReadAll
Set wEx = Nothing
Set wSh = Nothing
'
' txtを1行ごとに分解。※フォルダ名はフルパスで入っている。
'
Dim lines As Variant
lines = Split(txt, vbCrLf)
'
' 1行ごと解析
'
Dim dc As Long
Dim folx As Long
Dim rx As Long: rx = 0
Dim ix As Long
For ix = 0 To UBound(lines)
Select Case (True)
Case (InStr(lines(ix), "のディレクトリ") > 0):
dc = 0
folx = ix
Case (InStr(lines(ix), "<DIR>") > 0):
dc = dc + 1 ' <DIR>がいくつあるか数える
Case (InStr(lines(ix), "個のファイル") > 0):
If (dc > 2) Then ' 2は[.]と[..]のぶん
'
' 子フォルダを含むフォルダを発見。フォルダ名はlines(folx)に入っている。
'
rx = rx + 1 ' 書き出し位置+1
Me.Cells(rx, "A") = lines(folx) ' セルに書き出してみる
End If
End Select
Next ix
End Sub
Caseの判定が適当すぎますが。
ちなみにこのコードではファイルもフォルダも入っていない空のフォルダは検出できません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。