• ベストアンサー

DIR関数について教えてください。

現在、テキストボックスに入力した文字が、テキストファイル等の中身に存在するかを調べるプログラムの問題を解いているのですが。 選択したフォルダの下の階層にある全てのフォルダに対しても 検索を行うプログラミングでかなり悩んでいます。 特に、Dir関数の意味が???です。 例えば現在のパスをC:\テスト01\テスト02\としたときに、 変数Mypathに Mypath=C:\テスト01\テスト02\と代入して、 変数MyNameに MyName = Dir(setPath & "*.*", vbDirectory)とすると 変数MyNameには、1回目は"."が入り、2日目は".."が入ります。 なぜ、"."や".."が入るのか分からず悩んでいます。 "."は、現在のフォルダを表して、".."は親(1つ上)のフォルダを表していると、 と言うことは、ヘルプを調べて分かったのですが。 なぜ?こういった値が入るのか理解できない状態です。 3回目は、まともなファイル名が(例えばtest.txt)などのちゃんとした ファイル名が入ってくれるのですが。 特に、".."(親フォルダ)をなぜ見に行くのか??よく分かっていません。 良かったら教えてください。 よろしくお願いします。m(__)m

質問者が選んだベストアンサー

  • ベストアンサー
  • BlueRay
  • ベストアンサー率45% (204/453)
回答No.3

私も少なからずはよく理解は出来てないですが、イメージとしてとらえてください。 (イメージしてください。) 地上1階・地下1階・地下2階の家があるとします。 各階は、階段によって繋がっています。 地上1階には、地下1階に下りる階段があります。 地下1階には、地上1階に上る階段と地下2回に下りる階段があります。 地下2階には、地下1階に上る階段があります。 地下1階・地下2階を見てもらうとわかると思いますが上に上る階段が有りますよね。 これが、「..」に当たるわけです。 それと、今自分がどこにいるのかを知る為のものとして「.」があるわけです。 地下2階に行く為には、必ずこの家の地上1階からしか入れないわけです。 この地下2階はどの家の地上1階・地下1階と繋がっているか? と言うものとしてあるわけです。 「.」も「..」もない場合は、地上1階に居ると言う事です。 「..」が無いと言う事は、地上1階にいるのがわかっているので「.」は無くても良いのです。 地上1階 … C:\ 地下1階 … C:\テスト01\ 地下2階 … C:\テスト01\テスト02\ と言う風に、表現してみました。如何でしょうか。 イメージをとららえることが出来れば、幸いです。

mineral01
質問者

お礼

BlueRayさん、とても分かりやすい説明ありがとうございました。m(__)m おかげさまで、なっとくできました。 地下に例える説明、気に入ってしまいました。(^_^) 現在、自分が居る位置を知るためのものと、 考えればとても、分かりやすいです。 また、地上1階では、".."や"."見たいな方位時針見たい物は要らないですよね。 本当に、分かりやすい説明ありがとうございました。 感謝です!!m(__)m ありがとうございました。m(__)m

その他の回答 (3)

noname#2685
noname#2685
回答No.4

恐らく、目的とされている 「選択したフォルダの下の階層にある全てのフォルダに対して」 の動作は大丈夫な上で、どうして?と悩んでおられると思います。 フロッピーディスクや、ハードディスク、そのものには 「階層的なディレクトリ構造」 を実現する手段を備えていません。 もちろん、ファイルシステムに依存しますが、 「階層構造を実現するための特殊ファイル」 として「. や ..」が導入されたのだと考えて下さい。 それらは FAT エントリ他ディレクトリ構造を実現するための情報を持った、 あくまでも通常のファイルと同じようなファイルですので、 Dir 関数で拾えてしまっても仕方がないのです。 そこで、ヘルプにあるように 「ファイル名が . や .. だったら処理を飛ばす」 ことでこの特殊なファイルをパスしているだけです。 お気づきのようにルートの処理はまた別なのですが、 もしとことん突き詰めようと思われるなら、 FAT MS-DOS ファイルシステム などのキーワードで検索してみて下さい。 頑張って下さいね(^^;。

mineral01
質問者

お礼

x89さん、お返事ありがとうございます。 皆さんのおかげさまで、納得いきました。 頭の中がすっきりした状態になりました。(^_^) また、ルートについても時間があるとき調べて見たいと思います。 情報、ありがとうございまいた。m(__)m

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

下記テストプログラムを実行して感じを掴んでください。 Sub Sample() Dim FName As String FName = Dir("C:\My Documents\HTMLプロ") Debug.Print FName End Sub Dirのカッコ内を次に変えてテストしてみてください。 (1)DIR()としたとき、エラー (2)()内に”C:"としたとき (3)()内に”C:¥”としたとき (4)()内に”c:\My Documents”としたとき (5)()内に”c:\My Documents\"としたとき (6)()内に"c:\My Documents\YY"としたとき     「YY」は自分のコンピュターでc:\My Documents\の中    に存在する1つのフォルダ名を入れる。 -------------------- Sub Sample() Dim FName As String FName = Dir("c:\My Documents\")   Do While FName <> "" Debug.Print FName FName = Dir()   Loop End Sub  Dirのカッコ内を次に変えてテストしてみてください.  (1)DIR()としたとき、エラー (2)()内に"C:"としたとき (3)()内に"C:¥"としたとき (4)()内に"c:\My Documents"としたとき (5)()内に"c:\My Documents\"としたとき (6)()内に"c:\My Documents\YY"としたとき     「YY」は自分のコンピュターでc:\My Documents\の中    に存在する1つのフォルダ名を入れる。 結局Dir(X)はそのフォルダ(X)内のファイル名を取得する。 なければ""を返す。終わりであれば""を返す(なければの一種)。 Dir()で直前に指定しているフォルダの直前に指していたファイルの次のファイル名を取ってくる。 最初だけはDir()は「直前に指定しているフォルダ」がないので、エラーになる。 こう言うことでしょうか。 さてお尋ねの「.」「..」の件ですが、DOS時代のDir やCDならさておき、経験したことがないのですが、上記 テストプログラムで()内に入れてやって見てそうなるか 試してください。vbDirectoryが関係しているかもしれない。上記のテストプログラムはAttributeをりゃくしているので、vbNormal(標準ファイル)のケースです。 >「変数Mypathに Mypath=C:\テスト01\テスト02\と代入して、 変数MyNameに MyName = Dir(setPath & "*.*", vbDirectory)とすると 」とあるがMypathとsetPathの関係は?

mineral01
質問者

お礼

お返事ありがとうございます。m(__)m そして、訂正です。m(__)m setPathは、MyPathでした。すいません。 上記のサンプルありがとうございました。m(__)m 試させてもらいました。 結局Dir(X)はそのフォルダ(X)内のファイル名を取得する。 なければ""を返す。終わりであれば""を返す(なければの一種)。 と言うのは、あやふやに理解していたのですが、 imogasiさんの説明のおかげで理解×2です。 でもやっぱり、"."や".."がWhat?って感じです。 Dir関数のパスを「C:\」とか「D:\」とかルートディレクトリにすると "."や".."は返ってこなくなるのですが。 「C:\テスト\」見たく、ドライブ名にフォルダを付けると返って来ます。 imogasiさんのサンプルでも確認させてもらいました。 う~ん、なぜなんだろう? こうなると、覚えた方がいいのでしょうか?

noname#2685
noname#2685
回答No.1

MS-DOS のファイルシステム上、ディレクトリも単なるファイルです。 "." や ".." という特別なファイルを用いて階層的なディレクトリ構造を実現しています。 従って、Dir 関数でこれらが返ってくるのは当然の動作です。 お手元に VB のヘルプ(MSDN 等)があれば、 「Dir 関数の使用例」 というのを参照してみて下さい。 例の最後にある処理が参考になると思います。

mineral01
質問者

お礼

お返事ありがとうございます。 せっかくアドバイス頂いたのですが、やっぱり、What?って感じです。 頭が固い状態で申し訳ないです。m(__)m 現在のフォルダ(カレントフォルダ)より下のフォルダが、 返ってくるのは分かるのですが。 どうしても、親フォルダやカレントフォルダが、なぜ返ってくるのかが、 分からない状態です。 ヘルプは、すでに同じ場所を見て、色々フォルダを変更しながらDebugを 試したのですが・・・やっぱり分からず Dir関数のパスを「C:\」とか「D:\」とかルートディレクトリにすると "."や".."は返ってこなくなるのですが。 「C:\テスト\」見たく、ドライブ名にフォルダを付けると返って来ます。 ヘルプのコード ******************************************************** ' 現在のフォルダと親フォルダは無視します。 ' If Myname <> "." And Myname <> ".." Then ******************************************************** は、コメントにして試しています。 やっぱり?って考えてしまいます。(^_^;)

関連するQ&A

  • Dir関数について

    MyPath = "c:\test\" MyName = Dir(MyPath, vbDirectory) Do While MyName <> "" If MyName <> "." And MyName <> ".." Then Debug.Print MyName End If MyName = Dir Loop ------------------------------------------------- いきなりコーディングを紹介しましたが、 上記だと"C:\test\"の直下のファイル・フォルダしかデバッグアウトされませんが、 "C:\test\sample"のように、"C:\test\"配下にまだフォルダがあり、 それらを表示させるにはどのようにしたらよろしいでしょうか? 大変見づらくて申し訳ありませんが、宜しくお願い致します。

  • フォルダー名に特殊文字?が存在する場合にエラー発生

    以下のコードでフォルダー名を取得しています。 しかし、フォルダー名に特殊文字?が存在する場合に下記でエラーが発生します。  例えば「Oxygène」 でeの上に’があるなど   If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then      実行エラー 53: ファイルが見つかりません。 これは、excelの仕様で処理できないのでしょうか ? 他のコードで処理できれば教えて下さい。 --------------------------------------- Sub フォルダ名取得() Dim MyName Dim MyPath Dim i As Long ’仮の消込(初期化: 前回の記入文をクリアー) Range("A5:H50").Clear i = 1 ' フォルダーを自由に選べること。 参考:officeTANAKA With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then ' MsgBox .SelectedItems(1) If Len(.SelectedItems(1)) = 3 Then ' c:\の場合とサブフォルダーの場合 MyPath = .SelectedItems(1) Else MyPath = .SelectedItems(1) & "\" End If End If End With If MyPath = Empty Then MsgBox "フォルダー名表示をキャンセルしました。": Exit Sub 'Range("b2:c2").ShrinkToFit = True ' 縮小してセル内に表示 MyName = Dir(MyPath, vbDirectory) ' 最初のフォルダ名を返します。 '親フォルダー Range("A2") = MyPath Do While MyName <> "" ' ループを開始します。 ' 現在のフォルダと親フォルダは無視します。 If MyName <> "." And MyName <> ".." Then ' ビット単位の比較を行い、MyName がフォルダかどうかを調べます。 If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then Range("a" & i + 4) = MyPath & MyName ' アクティブシートA5セルから下方にフルパス表示。 Range("b" & i + 4) = MyName ' アクティブシートB5セルから下方にフォルダ名表示 i = i + 1 End If End If MyName = Dir ' 次のフォルダ名を返します。 Loop MsgBox MyPath & "の中にフォルダーは" & (i - 1) & "個のフォルダーがありました。" End Sub

  • エクセル(VBA)でファイル名(サブフォルダ含む)、更新日時を表示させたい

    エクセルのVBAであるフォルダ以下の全てのファイル名と更新時間をエクセルシート上に表示させたく、以下のプログラムを作成したのですが 、サブフォルダ内のファイルを表示させることができません。何か良い方法がありましたら教えていただけないでしょうか?宜しくお願いいたします。 Sub SAMPLE() Dim serchPass As String j = 1 Mypath = "C:\My Documents\" MyName = Dir(Mypath, vbDirectory) Do While MyName <> "" ' ループを開始します。 ' 現在のフォルダと親フォルダは無視します。 If MyName <> "." And MyName <> ".." Then ' ビット単位の比較を行い、MyName がフォルダかどうかを調べます。 If (GetAttr(Mypath & MyName) And vbDirectory) = vbDirectory Then Debug.Print MyName ' フォルダであれば、それを表示します。 Else: GoTo 10 End If serchPass = Mypath & MyName With Application.FileSearch .NewSearch .LookIn = serchPass If .Execute() > 0 Then For i = 1 To .FoundFiles.Count Cells(i + j, 1).Value = .FoundFiles(i) Cells(i + j, 3) = FileDateTime(.FoundFiles(i)) Next i j = i + j End If End With 10 End If    MyName = Dir ' 次のフォルダ名を返します。 Loop End Sub

  • DIR関数を使ったファイル名の取得

    おはようございます。 txtファイル名とdocファイル名を取得したく、以下のコードを作成してみました。 DIR関数を使って、ファイルリストボックスのPatternプロバディのように、複数の形式のファイル名を同時に取得する方法はあるのでしょうか? 是非、教えてください。よろしくお願いします。 ----------------------------- Private Sub Form_Load() Dim MyName MyName = Dir("C:\My Documents\*.txt") Do While MyName <> "" MsgBox MyName MyName = Dir Loop MyName = Dir("C:\My Documents\*.doc") Do While MyName <> "" MsgBox MyName MyName = Dir Loop End End Sub -------------------------------------

  • VBのDir関数について

    VB6.0について質問です. Dir関数にてフォルダ内のファイルを参照したいのですがうまくいきません>< 最初のファイルは参照できるのですが次のファイルへの参照ができません。。。 下記のコードでおかしいところはあるでしょうか? path = "d:\ABC\data" item = Dir(path & "\*.mdb", vbDirectory) Do While item <> "" ' ループを開始します。 item = Dir ' 次のフォルダ名を返します。 Loop

  • VBAの「Dir」コマンドを使用してフォルダ名変換を行ったのですが。。

    OS:Windows2000 VBA:Excel2003 任意のフォルダを指定し、そのフォルダ内のフォルダ名を全て変換するものを作成しようとしました。 問題点は、「Dir」関数を使用して、任意のフォルダ内のディレクトリを取得する時に、 strFName = Dir("C:\test\", vbDirectory) 上記のコードを実行すると、strFNameには「.」が入ってます。 strFName = Dir() を繰り返し行うと、strFNameには以下 「.」→「..」→「test01」→「test02」… となります。 C:\test\フォルダには「test01」以降のフォルダは存在するのですが、「.」及び「..」は見当たりません。 コマンドプロンプトで、 C:\test>dir で確認すると、「.」「..」が存在します。 しかし、 C:\test>tree では「.」「..」は見当たりません。 このDir("C:\test\", vbDirectory)で取れてくる「.」「..」とは一体何なのでしょうか? カテゴリ違い(Windows OS かも…)の質問かもしれませんが、ご存知の方がいらっしゃいましたら、よろしくお願いします。

  • File = Dir は何をしてるのでしょう?

    vbaです。 ---------------------------- Sub フォルダの中にあるファイルとフォルダを書き出す() Dim File As String File = Dir("C:\*.*", vbDirectory) Do While File <> "" Debug.Print File File = Dir Loop End Sub ---------------------------- このコードを実行すると、 フォルダの中にあるファイルとフォルダを書き出されるのですが File = Dir のコードは何をしているのでしょうか? 引数なしのDirの使い方もよくわからないし File = Dirがある事によってどういう効果があるのかもわかりません。

  • Excel2003VBA Dir関数について

    Excel2003VBAを勉強中の者です。早速ですが質問させて頂きます。 C:\Documents and Settings\All Users\Documents\親フォルダ\の中に複数のフォルダと標準ファイルが混在しており、 フォーム上のコマンドボタンを押す事で、リストボックスにフォルダだけを表示させたく下のコードを作成しました。 動作としては一旦FileDateという配列に、取得したフォルダ名をセットし、それをリストボックスに出力する事としました。 配列FileDateはDir関数でフォルダ名をひとつ取得する度に、1つずつ要素数を増やしております。 自分のフォルダを表す記号”.”と一つ上のフォルダを表す記号”..”は省きます。 このコードを実行してみた結果、”.”と”..”は省く事ができました。 しかし次に標準のフォルダが変数bufに入った状態からエラーが発生してしまいます。 ■エラー発生■の部分で「実行エラー53 ファイルが見つかりません。」と出てしまうのです。 Dir関数が正しく使えていないのだと思います。 ローカルウィンドウで確認しましたが、変数bufにはフォルダ名がちゃんとセットされている事からファイルそのものは認識してくれている様に思えます。 自分なりにかなり調べ、色々と試してみましたがどうにも手に負えませんでした。 エラーの発生原因と対策をご教示頂きたく、どなたかご助力をお願い致します。 Private Sub CommandButton1_Click() Dim buf As String Dim i As Long i = 1 Dim FileDate() As Variant ReDim FileDate(1 To i) As Variant buf = Dir("C:\Documents and Settings\All Users\Documents\親フォルダ\", vbDirectory) Do If GetAttr(buf) And vbDirectory Then '■エラー発生■ If buf <> "" And buf <> "." And buf <> ".." Then FileDate(i) = buf i = i + 1 ReDim Preserve FileDate(1 To i) End If End If buf = Dir() Loop While buf <> "" ListBox1.List = FileDate End Sub

  • ACCESS2013で複数ファイルのインポート

    お世話になっております。 環境は windows7 ACCESS2013 ACCESS2013を使って特定フォルダにある、AAA1.csv AAA2.csv・・・・とファイル名下一桁が連番になっているデータをACCESS2013のT_AAAという名前のテーブルにインポートをさせたいです。 テーブルのフィールド名やデータ型はどのファイルも同一です。 色々とネットで検索したのですが、あまりに初心者レベルのために理解できずにおります。 アドバイスをお願いいたします。 ネットで調べて真似して書いてみましたがエラーになります。 DoCmdでエラーになります。 どこが悪いのかさっぱり解りません。 Private Sub コマンド0_Click() Dim MyPath As String Dim MyCSV As String MyPath = "C:\Users\OOO_OOO\Desktop\test\AAA*.csv" MyName = Dir(MyPath, vbNormal) Do While MyName <> "" DoCmd.TransferText acImportDelim, "T_AAA", _ "C:\Users\OOO_OOO\Desktop\test\" & MyName, False MyName = Dir Loop End Sub 大変申し訳ございませんが、アドバイスをお願い申し上げます。

  • 最終保存日時の表示方法について

    現在、下記のようなマクロで指定ディレクトリ内のフォルダ名を検索し、A3から下に標記 取得したフォルダ名の中にある「いろは.XLS」の「C9」の値をB3から下に標記 としております。「いろは.XLS」が必ずあるという前提でのマクロです。 Sub main() Const myPath As String = "D:\テスト\" Dim myFolder As String myFolder = Dir(myPath, vbDirectory) Dim r As Integer r = 3 Do While myFolder <> "" If myFolder <> "." And myFolder <> ".." Then If (GetAttr(myPath & myFolder) And vbDirectory) = vbDirectory Then Cells(r, 1).Value = myFolder Cells(r, 2).Value = ExecuteExcel4Macro("'" & myPath & myFolder & "\[いろは.XLS]Sheet1 '!R9C3") r = r + 1 End If End If myFolder = Dir Loop End Sub 今回、C3から下に”各フォルダ内の「いろは.XLS」の最終保存日時”を標記し、「いろは.XLS」がない場合、ファイル名だけ取得したいのですが、どのようにすれば可能でしょうか? ExecuteExcel4Macroについてはファイルを開かないで操作するそうなのですが、サイトのコピペで造っていくしかまだ出来ない知識ですので、この形になっております。

専門家に質問してみよう