
お世話になっております。
あるフォルダに複数のフォルダが格納されており、更にそのフォルダの中にあるファイルの情報を取得するプログラムを書いたのですが、実行すると下記のようなエラーとなってしまいます。
■エラー
プロシージャの呼び出し、または引数が不正です
下から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で質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
プログラミングを学べる!?進化している子どものおもちゃについて専門家に聞いた!
プログラミングを学べるレゴブロックがあることはご存知だろうか。レゴに限らず最近のおもちゃには、プログラミングの要素がどんどん取り入れられているようだ。「教えて!goo」にも、「プログラミングを学べる子供...
-
隣の枝がはみ出してきたら切ってもいい?最もやってはいけないことは?
「隣の木が越境してきて困るが、勝手に切ってはいけないと聞くし…」そう思っている方も多いだろう。実は、2023年4月1日に民法が改正され、この「越境枝」のルールが大きく変わった。 教えて!gooでも「境界から出て...
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pythonでのローカルファイルか...
-
Excel ファイルに保存すると実...
-
シェルスクリプトの実行エラー...
-
flash.ocxエラーについて
-
NET USE コマンドでエ...
-
VBAで印刷するとエラーになって...
-
ホームページビルダーの”全体の...
-
不明なソフトウェア例外(0xe06...
-
既にVBアプリが入っているP...
-
Debug Assertion Failed?
-
VBAでFormat がうまく使えない
-
LTspiceのTime Stepエラーについて
-
EXCELを開くとエラーがでます。
-
WNetAddConnection*()の使い方
-
DVD-Rなのに再書き込みや削除が...
-
ショートカットファイルが開け...
-
フォルダを間違って削除しない...
-
jw cadの名前をつけて保存・・...
-
ZIPファイルがwordになります
-
表示はZIPファイルなのに「アー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pythonでのローカルファイルか...
-
Web.Config 構成ファイルのエラー
-
VBAでFormat がうまく使えない
-
シェルスクリプトの実行エラー...
-
Debug Assertion Failed?
-
ホームページビルダーの”全体の...
-
NET USE コマンドでエ...
-
POV-Ray についての質問です!
-
aspxをサーバーで表示すること...
-
不明なソフトウェア例外(0xe06...
-
flash.ocxエラーについて
-
ACCESS VBAのOpenForm書き方
-
ASPでoo4o接続ができません。
-
LTspiceのTime Stepエラーについて
-
既にVBアプリが入っているP...
-
EXCELを開くとエラーがでます。
-
WNetAddConnection*()の使い方
-
図形のクリアで実行時の1004エ...
-
VBAで印刷するとエラーになって...
-
aspxが動作しない
おすすめ情報