お世話になっております。
あるフォルダに複数のフォルダが格納されており、更にそのフォルダの中にあるファイルの情報を取得するプログラムを書いたのですが、実行すると下記のようなエラーとなってしまいます。
■エラー
プロシージャの呼び出し、または引数が不正です
下から3行目、「buf = Dir()」が問題であることはわかるのですが、
何が問題でどのように解決したらいいかわかりません。
どなたかご教授の程よろしくお願い致します(>_<)
------------------------------------------------------------------------
Sub test()
Dim buf As String
Dim fName As String
Dim msg As String
buf = Dir("*.*", vbDirectory)
Do While buf <> ""
If GetAttr(buf) And vbDirectory Then
If buf <> "." And buf <> ".." Then
fName = Dir(CurDir & "\" & buf & "\" & "*.jpg")
Do While fName <> ""
cnt = cnt + 1
Cells(cnt, 1) = buf
Cells(cnt, 2) = fName
msg = msg & buf & "\" & fName & vbCrLf
fName = Dir()
Loop
MsgBox msg
End If
End If
buf = Dir()
Loop
End Sub
------------------------------------------------------------------------
これが実現できないと細かい作業を毎日繰り返す事となり、
かなり業務不可が高いです。。
繰り返しになってしまいますが、どなたかご回答よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
エラーの理由はNo2さんが回答していますので.....
Dir()関数は入れ子にできないのでフォルダの取得とファイルの取得を別々に考えます。
まずフォルダのみを収集しそのフォルダ内のファイルを取得します。
例:(見やすくするために全角スペースでイデントしています)
Sub test2()
Dim buf As String
Dim fName As String
Dim msg As String
Dim AA() As String
Dim i As Long
'フォルダの取得
ReDim AA(0)
buf = Dir("*.*", vbDirectory)
Do While buf <> ""
If GetAttr(buf) = vbDirectory Then
If buf <> "." And buf <> ".." Then
ReDim Preserve AA(UBound(AA) + 1)
AA(UBound(AA)) = buf
Cells(UBound(AA), 3) = buf
End If
End If
buf = Dir()
Loop
'ファイルの取得
For i = 1 To UBound(AA)
fName = Dir(CurDir & "\" & AA(i) & "\" & "*.jpg")
Do While fName <> ""
cnt = cnt + 1
Cells(cnt, 1) = AA(i)
Cells(cnt, 2) = fName
msg = msg & buf & "\" & fName & vbCrLf
fName = Dir()
Loop
MsgBox msg
Next i
End Sub
No.2
- 回答日時:
VBAのヘルプ、Dir関数の説明にある、
| 一致するファイル名がない場合は、Dir 関数は長さ 0 の文字列を返します。長さ 0 の文字列が返された場合は、次に Dir 関数を呼び出すときに引数 pathname を再び指定しなければなりません。指定しないとエラーが発生します。
の通りのエラーです。
ループの中で、
fName = Dir()
が空白になった際、内側のループを抜けた後の、
buf = Dir()
がエラーになります。
Dir関数は入れ子にして使う、再帰的に呼び出すなんかの場合は、ちょっと工夫が要るかも?
DIR関数 - Visual Basic - 教えて!goo
http://oshiete.goo.ne.jp/qa/3040393.html
No.1
- 回答日時:
そりゃそうでしょう。
かなり間違った解釈をされています。
>buf = Dir("*.*", vbDirectory)
bufはstring型ですから、一つのファイル名しか入りませんよ。
それに複数のファイル名を入れようとしているんですからエラーになって当然ですね。
>Do While buf <> ""
この解釈も同様の誤りに起因しています。
まずはファイル名を一つ一つ取り込むプログラムを書かれてはいかがでしょう。
ここでこういう風にプログラム書いたら良いよってのは匿名でやっている関係上責任持てませんので出来ません。あくまでも自助努力のお助けをするだけです。
早々のご回答ありがとうございました。
ファイル名を一つずつ取り込むところはできたんですけど、
それを全フォルダでって言うところが難しくて・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) Excel VBA でデータ転記について 1 2023/03/07 19:11
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでFormat がうまく使えない
-
NET USE コマンドでエ...
-
IEのエラーについて
-
VB5のEXEの起動時エラー
-
ExcelVBAでODBCドライバを使っ...
-
WNetAddConnection*()の使い方
-
OWCの設定について
-
Debug Assertion Failed?
-
Access ADOで文字列を日付型へi...
-
FileUploadを利用しての画像保存
-
ASPでoo4o接続ができません。
-
シェルスクリプトの実行エラー...
-
POV-Ray についての質問です!
-
Eclipseでのエラー検出の機能に...
-
ACCESS VBAのOpenForm書き方
-
プリンターCanon BJC-80v印刷...
-
pythonをjupiter notebookからm...
-
CreateObjectでエラー
-
ショートカットファイルが開け...
-
jw cadの名前をつけて保存・・...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Debug Assertion Failed?
-
VBAでFormat がうまく使えない
-
NET USE コマンドでエ...
-
Excel ファイルに保存すると実...
-
シェルスクリプトの実行エラー...
-
Web.Config 構成ファイルのエラー
-
ホームページビルダーの”全体の...
-
エラーコード 70 「書き込み...
-
vbaでファイルを開くパス名に変...
-
C# HttpWebRequestのエラーにつ...
-
ACCESS VBAのOpenForm書き方
-
VBAで印刷するとエラーになって...
-
POV-Ray についての質問です!
-
不明なソフトウェア例外(0xe06...
-
Access ADOで文字列を日付型へi...
-
WNetAddConnection*()の使い方
-
LTspiceのTime Stepエラーについて
-
bcpadがうまく実行できないので...
-
xmlドキュメントから別拡張子で...
-
VB2010ビルドできるが配...
おすすめ情報