重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【解消】通知が届かない不具合について

【質問したい事】
以下、コードの fileName = Dir() の部分
当該コードはファイル名を2回目に呼びだすコードです

以下のとおり1回目と2回目の呼出し方法が違うのはなぜですか?
1回目の方はしっくりきます。

なぜとか、考えずにそいうものと覚えれば良いのでしょうか?
ご存じの方、ご指南宜しくお願いします

【参考ネットにあった解説↓】
Dir関数は1回目の呼び出しで指定されたファイルを取得しますが
2回目以降の呼び出しでは引数なしで実行する必要がある

【1回目】
fileName = Dir(folderPath & "\*.xls", vbDirectory)

【2回目以降】
fileName = Dir()


【コード説明】
ダウンロード場所フォルダにある、エクセルファイルの
名前を書きだす

コード実行後、シートに以下のとおり書き出される

a_20250529123939.xls
a_20250529123940.xls
a_20250529123941.xls
a_20250529123942.xls

※ダウンロード場所フォルダには上記4つのエクセルファイルがあります


【コード】動きます
Sub フォルダのファイル名取得()

Dim folderPath As String

Dim fileName As String

Dim i As Long

folderPath = "C:\Users\2020\OneDrive\マクロ\ツール\ダウンロード場所"


'1回目の呼び出し
fileName = Dir(folderPath & "\*.xls", vbDirectory)


i = 1

Do While fileName <> ""

Cells(i, 1).Value = fileName

'2回目の呼び出し。なぜ、1回目と呼出し方法が違うのは?
fileName = Dir()

i = i + 1

Loop
End Sub

A 回答 (2件)

こんばんは



>2回目以降の呼び出しでは引数なしで実行する必要がある
説明が必ずしも正確ではありませんね。

Dir関数の引数は、
 Dir (フォルダパス, ファイル属性 )
のような構成になっていますが、ワイルドカードを使って検索し、複数のファイルが該当する場合には、最初のものを返す仕様になっています。
(まとめて全部を返してはくれません:これは仕様です)
https://learn.microsoft.com/ja-jp/office/vba/lan …

では、2番目、3番目が欲しい場合は、どうするのか?
引数を省略して呼び出せば、同じ引数の2番目、3番目を順に返すようになっているということです。

ですので、異なる内容でファイルを検索するような場合は、毎回引数を指定して呼び出す必要があります。(=当然ですが)
例えば、処理に必要なファイルが、ちゃんと全て揃っているかを事前にチェックするような場合などが考えられます。
    • good
    • 2

Dir関数の仕様による。


・便利そうだから、そんな風に関数設計しちゃった
・DOSのDirコマンドの挙動に近い風に
・dir実行した結果は複数ファイル名とかになるけど、配列とかで受け取るのは事前準備とか面倒だから
とかだと思う。

Microsoftサポート - Dir関数
https://support.microsoft.com/ja-jp/topic/dir-%E …

| Dir 関数を初めて呼び出すときに引数 pathname を指定しないと、エラーが発生します。 ファイル属性を指定する場合は、引数 pathname も指定する必要があります。
| Dir 関数は、引数 pathname と一致した最初のファイル名を返します。 引数 pathname と一致するファイル名をさらに取得するには、Dir 関数を引数なしで再度呼び出します。 一致するファイル名がなくなったら、Dir 関数は長さ 0 の文字列 ("") を返します。


2か所のディレクトリから1つずつ、逐次にファイル名取り出して比較処理とか、出来ないんよね。
    • good
    • 1
この回答へのお礼

お返事ありがとうございます。
特に理由等、考えずに仕様という
ことですね。

お礼日時:2025/06/01 13:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!