🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

4287閲覧

二重DoWhileができない

Kazu_p8619

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2019/09/10 06:04

前提・実現したいこと

excelVBAで2つのフォルダに存在するファイルのファイル名を順番に取得し、処理を行うプログラムを作ろうとしています。
Do While文を二重にしてしまうとエラーが発生してしまうようなので、何か対処する方法はないでしょうか?

実行をすると1週目の"nameA = Dir()"で次のファイル名を取得することができず、「プロシージャの呼び出し または引数が不正です」というエラーが出ます。

該当のソースコード

VBA

1 2Sub test() 3 4Dim pathA As String 5Dim pathB As String 6Dim nameA As String 7Dim nameB As String 8 9pathA = "C:\~\testA" 10pathB = "C:\~\testB" 11nameA = Dir(pathA & "*.txt") 12nameB = Dir(pathB & "*.txt") 13 14 Do While nameA <> "" 15 '/*処理A*/ 16 Do While nameB <> "" 17 '/*処理B*/ 18 nameB = Dir() 19 Loop 20 nameA = Dir() 21 Loop 22End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Dir関数では2つのフォルダを同時に処理することはできません。
Dir()ではどちらのフォルダを対象にしているのかわかりませんよね)
よって他の回答にあるように戻り値が""のあとに更にDir()を行ってしまいエラーになっています。

2つのフォルダに存在するファイルのファイル名を順番に取得し

このような前提条件があるので、DirでAフォルダを検索し、取得したファイルがBフォルダにあるかどうかをチェック、存在する場合のみ処理を行えばよいかと思います。
Bフォルダ内にあるかどうかのチェックにDirで回す必要はないです。
FileSystemObjectFileExistsを使うと良いでしょう。
参考

投稿2019/09/10 07:01

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kazu_p8619

2019/09/10 07:23

ご回答いただきありがとうございます。
guest

0

ベストアンサー

Dir()と引数を省略して実行すると直前のDirの引数を引き継いでその次のファイル名を取得します。

ですので、 Do ... Loop内のDir()はすべてpathBフォルダーを検索することになります。

pathA内のファイルには処理A、pathB内のファイルには処理Bなら、ネストさせる必要はないとおもいますが、どうでしょうか。

ネストさせる必要か本当にあるなら、
最初に、pathA内のファイルを配列に格納して、その配列をループさせて、その中でpathBを対象にループをネストさせることになります。

あるいは、FileSystemObject を使うことになります。

投稿2019/09/10 06:56

hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kazu_p8619

2019/09/10 07:22

ご回答いただきありがとうございました。 FileSystemObjectを使いエラーなく処理が完了しました。 ただファイル名を取得する際に、処理が少し遅れているようなので配列を用いた方法でも試してみたいと思います。
guest

0

エラーは、dir()が空文字列を返した後にさらにdir()を呼んでいるからです。

内側のループを抜けた段階でdir()""なので、そのあとにnameA = Dir()するとエラーになります。

dir()の仕様の勘違いがあるようです。
プログラム構造を作り直す必要があります。

投稿2019/09/10 06:52

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kazu_p8619

2019/09/10 07:23

ご回答いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問