Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : Microsoft 365)
Dir()に関して
投稿日時: 23/11/09 01:34:32
投稿者: mtszt7ea

Dir関数を利用してフォルダ内の複数あるファイルの名前を取得するときのコードに関しての質問です。
以下に例のコードを記載します。
 

変数 = Dir("C:\*.xls")
Do While 変数 <> ""
  '処理
  変数 = Dir()
Loop

 
この場合のLoop前の最後の行、「変数 = Dir()」はどのような意味を持つのでしょうか。
調べましたが当行の詳細を記載しているサイトはなかったです。
自分は配列ではないかと思いますが、Dir(i) のようにインデックスを指定する必要があるような気がしてしましました。
 
初心者なため教えてください。

回答
投稿日時: 23/11/09 06:48:50
投稿者: simple

(1)
例えば、下記を参考にしてください。
http://officetanaka.net/excel/vba/function/Dir.htm
 
主要なところを引用します。
> Dir関数は、引数pathnameで指定したファイル名と一致した最初のファイル名を返します。
> 続けて次のファイルを取得するときには、Dir関数に引数を与えずに実行します。

 
これは、Dir関数の機能として定められているものです。
そのように作られている、決まっているのです。
それを前提にして、その道具をいかに活用するか、に注力してください。
 
(あなたが参照されたNet上の記事なり書籍にも、上と同じような記載が必ずあるはずです。確認してみて下さい。)
 
(2)【ヘルプの活用】
なお、Dir()のどこかにカーソルを置いた状態で F1キーを押すと、ヘルプが表示されるはずです。
理解しにくいところもありますが、原典にあたって確認する習慣をつけることも必要かもしれません。
> Dir は、pathname に一致する最初のファイル名を返します。
> pathname に一致する追加のファイル名を取得するには、引数なしで Dir を再度呼び出します。
> 一致するファイル名がなくなると、Dir は長さ 0 の文字列 ("") を返します。
> 長さ 0 の文字列が返された後の呼び出しで、pathname を指定しないとエラーが発生します。

などと書かれています。
 
手元にある参考書籍などにも書いてありますし、そのほうが理解しやすく、
ヘルプはとっつきにくいことも事実ですが、やはり原典なので、
何か不明なことがあればそれを確認する、
といったことにも徐々に慣れていかれたら良いと思います。

回答
投稿日時: 23/11/13 06:36:26
投稿者: simple

# 23/11/10 12:39:46 に投稿(投稿者: simple )しましたが、一部修正して再度アップしました。
 
納得いきませんか?どのあたりか、更に追記してください。
  
Dir関数というのは、予めVBAに装備されている関数で、
その中身のコードはユーザーからは見ることができないので少し面倒ですよね。
ヘルプ等をよく読むしかないでしょうか。
 
(1)
f = Dir("D:\test\abc.xlsx") とすると、
"D:\test\abc.xlsx"というファイルがあれば"abc.xlsx"を返し、
なければ、""を返します。
したがって、ファイルが実際にあるかどうかを確認することができます。
これが一つの使い方です。
 
(2)
またワイルドカード(*や?など)を使うことによって、特定のパターンのファイルがあるかどうかを
探すこともできます。
 
(3)
よく使われるのは、特定のフォルダ傘下のファイルを列挙する、という使い方です。
今回の質問はこれに関連したものですね。
     

 Sub test()
    Dim f As String 
    f = Dir("D:\test\*.xlsx")   '@
    Do While f <> ""             
        Debug.Print f            
        f = Dir()               'A
    Loop                         
 End Sub

 @の Dir("D:\test\*.xlsx") とすると、"D:\test"フォルダに"xlsx"ファイルがあれば、
    最初に該当した、例えば、"aaa.xlsx"と言う文字列を返します。
 Aでは、Dir関数の引数("ひきすう"と読みます)が何もないので、以下の動作になります。
    ・直前に実行した同じ命令("D:\test"フォルダに"xlsx"ファイルを探す)を再実行します。
      これは、VBA側が仕様をそのように決めているのです。
    ・同一の検索の続きを行い、一つ目以外にもあれば、それを取得します。
    ・つまり、Dir関数の実行の経緯を覚えていて、実行して得られたファイル以外に、
      該当するファイルがあれば、そのファイル名(例: "aaa2.xlsx")を返すのです。
    ・こうした作業を Do Loopの中で繰り返します。
      もうこれ以上該当するものがなくなれば、
      f = Dir() を実行した結果、f は ""となり、Do Loopから脱出します。
       
このように、Dir関数を使いまわすことで、特定のパターンのファイル名を列挙できるのです。
 
# 折角質問されたのですから、短くても結構なので、なにか返事をされるとよいですよ。

投稿日時: 23/11/16 22:42:08
投稿者: mtszt7ea

返答が遅くなり申し訳ございません。
 
丁寧な回答ありがとうございます。
要約してしまうと「そのようなルールだから」って感じですかね。
 
>Dir()のどこかにカーソルを置いた状態で F1キーを押すと、ヘルプが表示されるはずです
 
上記、初めてしりました。ご教授ありがとうございます。