
No.8ベストアンサー
- 回答日時:
> やってみましたがmsoFileDialogFolderPickerがエラーになります。
それは失礼しました。
自宅の2003でテストしたため、エラーにならず、気づきませんでした。
今、2000で試しました。
これでどうでしょう?
あくまでご提示のコードのフォルダーの指定部分だけを2000で動くように修正しただけです。
再帰動作等、他の部分はわたしもよく理解できていません。現にCドライブで試すとエラーになりました。
(^^;;
' [参照設定]・Microsoft Scripting Runtime
Option Explicit
Private g_cntFILE As Long
Private g_cntPATH As Long
Sub SEARCH_FOLDER()
Dim objFSO As FileSystemObject
Dim strPATHNAME As String
Dim myObj As Object
Dim myDir As String
Set myObj = CreateObject("Shell.Application"). _
BrowseForFolder(0, "フォルダを選択してください", 0)
If myObj Is Nothing Then Exit Sub
If myObj = "デスクトップ" Then
myDir = CreateObject("WScript.Shell").SpecialFolders("Desktop")
Else
myDir = myObj.Items.Item.Path
End If
strPATHNAME = myDir
Cells.ClearContents
Set objFSO = New FileSystemObject
Call SEARCH_SUB_FOLDER(objFSO.GetFolder(strPATHNAME), 0, 0)
Set objFSO = Nothing
MsgBox "処理が完了しました。" & vbCr & vbCr & _
"フォルダ数=" & g_cntPATH & vbCr, vbInformation
End Sub
'フォルダ単位のサブ処理(再帰動作,引数はFile-Object,行,カラム)
Private Sub SEARCH_SUB_FOLDER(ByVal objPATH As Folder, ByRef GYO As Long, ByVal COL As Long)
Dim objPATH2 As Folder
g_cntPATH = g_cntPATH + 1 '参照フォルダ数を加算
GYO = GYO + 1 ' 行を加算
COL = COL + 1 ' カラムを加算
Cells(GYO, COL).Value = "[" & objPATH.Name & "]"
For Each objPATH2 In objPATH.SubFolders 'サブフォルダを探索するループ処理
Call SEARCH_SUB_FOLDER(objPATH2, GYO, COL) 'フォルダ単位のサブ処理(再帰呼び出し)
Next objPATH2
Set objPATH = Nothing ' 参照OBJECTを破棄
End Sub
No.9
- 回答日時:
>re:#5
>つまり第二階層以下のフォルダーが存在する第一階層名は重複になってしまいます。
『..フォルダパスを書き出すサンプル。』ですからね。
一旦シートに書き出せば、いかようにも加工できるかと思ってましたが。
Sub try_3()
Const arg = "tree ""c:\"""
Dim ret As String
Dim v() As String
ret = CreateObject("WScript.Shell").Exec("%ComSpec% /c " & arg).StdOut.ReadAll
v = Split(ret, vbCrLf)
Sheets.Add.Cells(1).Resize(UBound(v) + 1).Value = Application.Transpose(v)
End Sub
こんなのもありますし。
最終的にどんな形式で書き出したいのか、に合わせて工夫してください。
Sub try_4()
Dim arg As String
Dim brf As Object
Dim wsh As Object
Dim ret As String
Dim v() As String
Dim r As Range
Dim i As Long
Dim n(1) As Long
Dim ary(1 To 255)
Set brf = CreateObject("Shell.Application") _
.BrowseForFolder(0, "SelectFolder", 0)
If brf Is Nothing Then Exit Sub
arg = Replace(brf.self.Path & "\", "\\", "\")
arg = "dir """ & arg & """ /a:d/b/s"
Set wsh = CreateObject("WScript.Shell")
ret = wsh.Exec("%ComSpec% /c " & arg).StdOut.ReadAll
v = Split(ret, vbCrLf)
Set r = Sheets.Add.Cells(1).Resize(UBound(v) + 1)
r.Value = Application.Transpose(v)
r.Sort Key1:=r.Cells(1)
With r.Offset(, 1)
.Value = r.Value
.Replace "*\", "\", xlPart
n(1) = 2
For i = 1 To 255
n(0) = i
ary(i) = n
Next
.TextToColumns DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, _
Tab:=False, _
Semicolon:=False, _
Comma:=False, _
Space:=False, _
Other:=True, _
OtherChar:="\", _
FieldInfo:=ary
End With
Set r = Nothing
Set brf = Nothing
Set wsh = Nothing
End Sub
No.7
- 回答日時:
> modAPIBrowseForFolder2
> の部分が、変数が定義されていないというエラーになってしまうのです。
わたしも2000です。
試したら同様にエラーになりました。
で、自宅に帰り2003で試してもやはり同じエラーが出ました。
バージョンの違いではなさそうです。
エラーになる部分は検査対象を選択させる部分ですよね。
ならば、その部分を
Sub SEARCH_FOLDER02()
Dim objFSO As FileSystemObject
Dim strPATHNAME As String
'対象とするフォルダの指定
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
strPATHNAME = .SelectedItems(1)
Else
MsgBox "キャンセル"
Exit Sub
End If
End With
' 処理開始
Cells.ClearContents
Set objFSO = New FileSystemObject
' ルートフォルダから探索開始
Call SEARCH_SUB_FOLDER(objFSO.GetFolder(strPATHNAME), 0, 0)
' 参照OBJECTを破棄
Set objFSO = Nothing
' 処理完了(結果表示)
MsgBox "処理が完了しました。" & vbCr & vbCr & _
"フォルダ数=" & g_cntPATH & vbCr, vbInformation
End Sub
と変えてみました。
これならその部分ではエラーにならないはずです。
MyDocumentをためしたらちゃんと所得できました。
ただ、Cドライブを選択して試したらべつの部分でエラーになってしまいました。
原因はまだ究明できていませんが。
ありがとうございます。
やってみましたがmsoFileDialogFolderPickerがエラーになります。
エラーになる部分は検査対象を選択させる部分 とのいことなのでパスを直接手書きしたら動いたので一応は成功なのですが、手書きじゃない方が便利ですよね。
エクセル2000の場合はどう直せばよいのでしょうか?
No.6
- 回答日時:
modAPIBrowseForFolder2 は初めて聞きましたが、
検索すると一つのサイトが見つかりました。この
サイトに補足されたコードと完成されたExcelファイルが
ありました。
以下です。確認してみてください。
サイト
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …
ファイル
http://www.asahi-net.or.jp/~ef2o-inue/download/s …
一応、こちらで動作の確認はしてみました。
No.5
- 回答日時:
コマンドプロンプトのdirコマンドを使えば比較的簡単です。
シート追加しA列にフォルダパスを書き出すサンプル。
Sub try()
Const arg = "dir ""e:\"" /a:d/b/s"
Dim wsh As Object
Dim ret As String
Dim v() As String
Set wsh = CreateObject("WScript.Shell")
ret = wsh.Exec("%ComSpec% /c " & arg).StdOut.ReadAll
v = Split(ret, vbCrLf)
Sheets.Add.Cells(1).Resize(UBound(v) + 1).Value = Application.Transpose(v)
Set wsh = Nothing
End Sub
フォルダごとにセルを分けたければメニュー[データ]-[区切り位置]でA列を『\』で区切れば良いです。
一瞬表示されるコンソールが気になるなら一旦テキストファイルに書き出します。
Sub try_2()
Const arg = "dir ""e:\"" /a:d/b/s"
Dim wrk As String
Dim v() As String
Dim n As Long
wrk = Application.DefaultFilePath & "\temp000.dat"
CreateObject("WScript.Shell") _
.Run "%ComSpec% /c " & arg & ">" & """" & wrk & """", 0, True
n = FreeFile
Open wrk For Input As #n
v = Split(StrConv(InputB(LOF(n), #n), vbUnicode), vbCrLf)
Close #n
Kill wrk
Sheets.Add.Cells(1).Resize(UBound(v) + 1).Value = Application.Transpose(v)
End Sub
ありがとうございます。
ためしてみました。
まず第一階層のフォルダー名の一覧がでました。
次に第二階層以下のフォルダーがあれば、再度第一階層のフォルダー名(その後に第二階層以下も表示されますが)が出ました。
つまり第二階層以下のフォルダーが存在する第一階層名は重複になってしまいます。
No.4
- 回答日時:
先ほどは失礼しました。
サブフォルダを含めたフォルダの検索はWEB上に
たくさんサンプルがあります。
http://www7.big.or.jp/~pinball/discus/vb/63655.h …
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr; …
など、まだあります。要点は再帰関数を作って
再帰的にフォルダを下層に下っていくことです。
excel サブフォルダ 再帰
でググるといろいろ出てきます。コードは
長くなるのでサンプルを探して試してみてください。
この回答への補足
ありがとうございます。
実は以下のコードをひとからもらいました。
でも
modAPIBrowseForFolder2
の部分が、変数が定義されていないというエラーになってしまうのです。
Windows2000 エクセルも2000です。
' [参照設定]・Microsoft Scripting Runtime
Option Explicit
Private g_cntFILE As Long
Private g_cntPATH As Long
Sub SEARCH_FOLDER()
Dim objFSO As FileSystemObject
Dim strPATHNAME As String
' ルートとなるフォルダの指定(※modAPIBrowseForFolder2.bas)
strPATHNAME = modAPIBrowseForFolder2.BrowseForFolder("ルートフォルダを指定して下さい。", True)
If strPATHNAME = "" Then Exit Sub
' 処理開始
Cells.ClearContents
Set objFSO = New FileSystemObject
' ルートフォルダから探索開始
Call SEARCH_SUB_FOLDER(objFSO.GetFolder(strPATHNAME), 0, 0)
' 参照OBJECTを破棄
Set objFSO = Nothing
' 処理完了(結果表示)
MsgBox "処理が完了しました。" & vbCr & vbCr & _
"フォルダ数=" & g_cntPATH & vbCr, vbInformation
End Sub
'フォルダ単位のサブ処理(再帰動作,引数はFile-Object,行,カラム)
Private Sub SEARCH_SUB_FOLDER(ByVal objPATH As Folder, ByRef GYO As Long, ByVal COL As Long)
Dim objPATH2 As Folder
' 現在フォルダをシート上に表示
g_cntPATH = g_cntPATH + 1 ' 参照フォルダ数を加算
GYO = GYO + 1 ' 行を加算
COL = COL + 1 ' カラムを加算
Cells(GYO, COL).Value = "[" & objPATH.Name & "]"
'サブフォルダを探索するループ処理
For Each objPATH2 In objPATH.SubFolders
' フォルダ単位のサブ処理(再帰呼び出し)
Call SEARCH_SUB_FOLDER(objPATH2, GYO, COL)
Next objPATH2
' 参照OBJECTを破棄
Set objPATH = Nothing
End Sub
No.2
- 回答日時:
#4です。
ついでなので最終列の取得も変更しておきます。Sub test5()
Dim L1 As Long
Dim L2 As Long
Dim R1 As Long
Dim x As Long
Dim y As Long
R1 = 2
L2 = 2
x = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row '最終行
y = Sheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column '最終列
For L1 = 2 To x
'A列のデータが尽きたところで終了
If Worksheets("Sheet1").Cells(L1, 1).Value = "" Then
Exit Sub
End If
For R1 = 2 To y
'A1のデータが尽きたところでループを抜ける
If Worksheets("Sheet1").Cells(1, R1).Value = "" Then
Exit For
End If
'A列に結合したデータを表示
Worksheets("Sheet2").Cells(L2, 1).Value = Worksheets("Sheet1").Cells(L1, 1).Value & _
Worksheets("Sheet1").Cells(1, R1).Value
'B列にデータを表示
Worksheets("Sheet2").Cells(L2, 2).Value = Worksheets("Sheet1").Cells(L1, R1).Value
L2 = L2 + 1
Next R1
Next L1
End Sub

No.1
- 回答日時:
自分の知識では下記コードだけです
サブフォルダまでは無理だと思われます
エクセルVBAの全コードが記載されてる1000ページくらいに及ぶ解説
にも載ってません
なお参照設定でmicrosoft scripting runtimeを追加してください
Dim myFSO As New FileSystemObject
Dim myFolders As Folders
Dim myFolder As Folder
Dim i As Integer
Set myFolders = myFSO.GetFolder(" ").SubFolders
かっこの中にはドライブ指定する
i = 1
For Each myFolder In myFolders
i = i + 1
Cells(i + 1, 1) = myFolder.Name
Next
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Excel(エクセル) Excel VBA 3 2023/04/22 10:46
- Google Drive Googleドライブについて 3 2023/08/06 12:19
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- Visual Basic(VBA) vbaサブフォルダーをワイルドカードで取得したい 2 2022/11/15 08:04
- Google Drive Googleドライブでのファイルの移動 2 2022/11/01 14:23
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2022/03/31 12:46
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- その他(プログラミング・Web制作) バッチファイルでPCのモデル名を取得したい 1 2022/03/31 10:58
- Excel(エクセル) 複数のブックをひとつのブック(複数のシートにまとめる)場合にシートとの順番について 5 2022/12/28 20:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
お助けください!VBAのファイル...
-
マクロで"#N/A"のエラー行を削...
-
UserForm1.Showでエラーになり...
-
【VBA】ワークブックを開く時に...
-
E2206のエラーについて
-
ACCESSで値を代入できないとは?
-
On ErrorでエラーNoが0
-
続・PerlのメッセージBOXについて
-
VBAでfunctionを利用しようとし...
-
VBA データ(特定値)のある最...
-
【VB.NET】 パワポ操作を非表示で
-
PerlでMAPIについて
-
日付書式のString型からData型...
-
String""から型'Double'への変...
-
エクセルVBAで埋め込みグラフ(C...
-
フランスの生年月日(jj/mm/aaaa)
-
VBA エラーが出てしまいます。...
-
マクロOn Error GoTo ErrLabel...
-
現在、QueryTableが設定されて...
-
【VBAエラー】Nextに対するFor...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロOn Error GoTo ErrLabel...
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
String""から型'Double'への変...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
インポート時のエラー「データ...
-
【VBAエラー】Nextに対するFor...
-
ACCESSで値を代入できないとは?
-
【Access】Excelインポート時に...
-
VBでSQL文のUPDATE構文を使った...
-
【VB.NET】 パワポ操作を非表示で
-
「実行時エラー '3167' レコー...
-
実行時エラー 438 の解決策をお...
-
実行時エラー'-2147467259(8000...
おすすめ情報