• ベストアンサー

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 -------------------------------------

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

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

VBのForm1の上にドライブ、ディレクトリ、ファイルリストボックスを 貼りつけ、それぞれのコントロールをダブルクリックして Private Sub Drive1_Change() Dir1.Path=Drive1.Drive End Sub Private Sub Dir1_Change() File1.Path = Dir1.Path File1.Pattern = "*.txt;*.doc" End Sub Private Sub File1_Click() flnam= File1.FileName MsgBox flnam End Sub と入力して見ました。実行すると ファイルリストボックスに拡張子が「txt」と「doc」の2つが 現われます。そしてクリックして指定したファイル名が MsgBoxに現われます。 本件の質問は、この「Pattern」プロパティと、拡張子を列記する 方法「;」に付いての質問ではないのでしょうか。 「Pattern」の語が出ているので多分ご存知の様子ですね。 ----- またDir関数で下記を実行してみました。ご参考になれば。 Private Sub Form_Click() a = Dir("c:\My Documents\*.*") For i = 1 To 40  a = Dir()  a = Trim(a)  b = Right(a, 4)   If b = ".doc" Then      Form1.Print a   ElseIf b = ".txt" Then      Form1.Print a   End If Next i End Sub 仮に繰り返し回数を「40」としていますが、ファイル数より回数が進んだ時の「エラーの検知方法」が思い出せず不完全です。すみません。全般について、ご存知の方やダメな点を私も教わりたいです。

adachi
質問者

お礼

親身な回答していただき、本当にありがとうございます。 DIR関数の拡張子指定も"*.txt;*.doc" のようにできるればと思っていたのですが、imogasi様のようにIF文を使った方が無難そうですね。 リストビューコントロールにIEキャッシュ内のファイルの一覧を表示させようとしていました。DIR関数にこだわっていたのですが、ファイルリストボックスを表示させない形で利用した方が良いかな・・・ imogasi様のアドバイスを参考にもう一度挑戦してみようと思います。

adachi
質問者

補足

imogasi様、i-touch様、回答をくださいまして本当にありがとうございました。 (1)IF文で拡張子を区分する方法と(2)ファイルリストボックスで拡張子を区分する方法の両方を試してみました。 IEキャッシュの中からjpg・gifを取り出す作業をしてみたところ、(1)(2)ともに処理スピードはほぼ同じでした。 コードの記載は、ファイルリストボックス(visible=falseの状態)を使った方が楽で、把握しやすいことも分かりました。 imogasi様とi-touch様に対し、良回答の判断をしなければいけないのがとても心苦しかったです、、、、どうかお許しください。 今後もよろしくお願いします。

その他の回答 (2)

  • i-touch
  • ベストアンサー率40% (170/415)
回答No.3

こんにちは! もうできちゃったかな? プロシージャを載せます。 私のは、拡張子はもう少し厳密にチェックしています。 サンプルを元にしているので、著作権の一部はマイクロソフトにあると思います。 リストボックス「list1」をフォームに貼り付けてやってみてください。 この例ではexeのあるフォルダにある*txt,*docをリストアップします。 Private Sub getFlist() '■ ファイルのリストを取得する Dim zMyp As String Dim zFnm As String Dim zName As String Dim zKaks As String Dim nFnm As Long zMyp = App.Path & "\" List1.Clear '# リストボックスを初期化する zName = Dir(zMyp, vbNormal) '# 最初のファイル名を取得する Do While zName <> "" '#ループ開始 '# 現在のフォルダと親フォルダは無視する If zName <> "." And zName <> ".." Then '# 普通のファイルかどうか If (GetAttr(zMyp & zName) And vbNormal) = vbNormal Then zFnm = UCase(zMyp & zName) '# パス+ファイル名 zKaks = Right(zFnm, 3) '# 拡張子 '## 拡張子のフィルタリングを行う Select Case zKaks Case "DOC", "TXT" '# リストに追加!! List1.AddItem zFnm Case Else '# その他のファイル zFnm = "" End Select End If End If zName = Dir '# 次のファイル名を取得する Loop '# 取得したファイルの数 'nFs = List1.ListCount End Sub では!

adachi
質問者

お礼

imogasi様、i-touch様、回答をくださいまして本当にありがとうございました。 (1)IF文で拡張子を区分する方法と(2)ファイルリストボックスで拡張子を区分する方法の両方を試してみました。 IEキャッシュの中からjpg・gifを取り出す作業をしてみたところ、(1)(2)ともに処理スピードはほぼ同じでした。 コードの記載は、ファイルリストボックス(visible=falseの状態)を使った方が楽で、把握しやすいことも分かりました。 imogasi様とi-touch様に対し、良回答の判断をしなければいけないのがとても心苦しかったです、、、、どうかお許しください。 今後もよろしくお願いします。

adachi
質問者

補足

こんなにも詳しい解説付きのプロシージャを書いてくださいまして、なんてお礼を申したらよいのか・・・本当にありがとうございます。 今からコードを貼り付けて、実際に試してみます。明日・・・いや今日ですね(苦笑)今日中に結果報告させていただきます。 それでは、一旦失礼します、、、

  • i-touch
  • ベストアンサー率40% (170/415)
回答No.2

こんにちは 指定したフォルダ中の、ファイルのリストを取得するサンプルが、ヘルプで出てくると思います。 それを改造して、取得したファイル名から、IF文で、拡張子がdoc,txtのものだけリストに加えるようにすれば簡単ですよ。 私はリストボックスにAdditemで加えて、ファイルのリストを作っています。 では!

adachi
質問者

お礼

回答していただき、ありがとうございます。返信が遅くなってしまい、申し訳ありません、、、 DIR関数で複数の指定拡張子のファイル名を取得し、リストビューコントロールに表示させようしていました。ファイル名の取得にDIR関数を使っていたため、ファイルリストボックスコントロールでの「File.Pattern = "*.txt;*.doc" 」のように一つの文章にできないものか悩んでいました。 「リストボックスにAdditemで加えて、ファイルのリストを作っています」 この方法の方が、処理も早そうですね。imogasiさんに上手にまとめたif文と合わせて試し、後日結果報告をさせていただきます。

関連する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\"配下にまだフォルダがあり、 それらを表示させるにはどのようにしたらよろしいでしょうか? 大変見づらくて申し訳ありませんが、宜しくお願い致します。

  • 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がある事によってどういう効果があるのかもわかりません。

  • ダイアログボックスからフォルダ名を取得し、フォルダ内のCSVファイルを

    ダイアログボックスからフォルダ名を取得し、フォルダ内のCSVファイルをすべてアクセスのテーブルにインポート使用と思っています。 ところがCSVファイルの数の分だけ、1つめのCSVファイルの中身が繰り返しインポートされてしまっています。 どの部分に誤りがあるのでしょうか? お知恵を拝借できますでしょうか・・・。 コードは以下になります。 Private Sub cmd06_Click() Dim MyFile As String Dim MyName As String Dim MyName02 As String Dim strFolderName As String strFolderName = GetFolderName() 'フォルダ選択ダイアログを表示 If Len(strFolderName) > 0 Then '選択結果を評価 MyFile = strFolderName & "\*.csv" '【拡張子csvのファイルのみ取得】 MyName = Dir(MyFile, vbNormal) MyName02 = "\" & MyName Do While MyName <> "" If MyName <> "." And MyName <> ".." Then If GetAttr(strFolderName & "\" & MyName) <> vbDirectory Then DoCmd.TransferText acImportFixed, "T03_インポート定義", "T03_全CSVデータ", strFolderName & MyName02, False, "" '【取得したファイルをインポート】 End If End If MyName = Dir Loop Else MsgBox "フォルダは選択されませんでした" End If MsgBox "データのインポートが終了しました" End Sub

  • (VBA) Dir 関数で取得するファイル一覧の順序

    タイトルの通り、下記のサンプルコードを実行して取得するファイル一覧の順序についての質問です。 Public Sub Test1() Dim WSH As Object Dim MyPath As String Dim MyFileName As String Set WSH = CreateObject("WScript.Shell") MyPath = WSH.SpecialFolders("MyDocuments") MyFileName = Dir(MyPath & "\" & "*.*") Do Until MyFileName = "" MsgBox MyFileName MyFileName = Dir Loop Set WSH = Nothing End Sub (質問) ファイル名の昇順では取得できないようですが、もしファイル名の昇順に並べ替えるとしたら、 どのように処理したらよいのでしょうか?

  • フォルダのファイル数をvbaで取得したい

    vbaなのですが、フォルダにgifファイルがたくさんはいっていますが、 その数を数えるコードを教えてください。 今は、 Sub Macro7() Dim File As String Dim i As Long File = Dir("C:\*.*", vbDirectory) Do While File <> "" File = Dir i = i + 1 Loop MsgBox "ファイル数は" & i & "です" 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

  • 【VBA】 ファイル名の取得

    23歳OLです。 会社でマクロを組んでいるのですが、 できないところがあったのでご相談させてください。 ▼やりたいこと ================================================ ・フォルダを自分で指定して、選択したファイルの名前をシートに書き込む 1.txt 2.log 3.xls とフォルダに入っていたら 1.txt 2.log 3.xls とシートに名前を書き込んでほしいです。 ・ファイルの種類はいろいろある。(txt.logなど) ================================================ ▼現在書いてみたコード ======================== Sub Sample1() Dim buf As String, cnt As Long Const Path As String = "" buf = Dir(Path & "*.*") Do While buf <> "" cnt = cnt + 1 Cells(cnt, 1) = buf buf = Dir() Loop End Sub ======================== これだと、初めから指定したフォルダしか取得することができないらしいです。 そもそもConst Path As String = "このぶぶん" このぶぶんにフォルダを指定しても動きませんでした。? どこが原因なのでしょうか? ご教示お願いします。

  • VBのDir関数について

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

  • ExelVBA Dirでのファイル名検索について

    VBA勉強中の者です。早速ですが質問させて頂きます。 CドライブのSample Picturesという様々な形式の画像があるフォルダの中から、 jpgとpngの画像のみ名前をsheet4のA1から下方向に書き出したいと考え、 サイトや本で調べながら以下のコードを作成しました。 Sub sample() Worksheets(4).Cells.Clear Dim pngFileName As String Dim jpgFileName As String Dim CellsCount As Long Const path As String = "C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\" pngFileName = Dir(path & "*.png") Do While pngFileName <> "" CellsCount = CellsCount + 1 Cells(CellsCount, 1) = pngFileName pngFileName = Dir() Loop jpgFileName = Dir(path & "*.jpg") Do While jpgFileName <> "" CellsCount = CellsCount + 1 Cells(CellsCount, 1) = jpgFileName jpgFileName = Dir() Loop End Sub 一応目的は達成出来ているのですが、スッキリできません。 Dir(path & ~ の部分で、ワイルドカードの指定文字が "*.jpg" と "*.png" の2種類ある時には わざわざDo White Loopを2回繰り返しさないといけいないのか疑問です。 仮に画像ファイルだけでなく、何種類もの拡張子を指定して抽出したい時には そのつどコードを増やさないといけないのでしょうか? 考えた末 PictFileName = Dir(path & "*.jpg" Or path & "*.png")や PictFileName = Dir(path & "*.jpg" Or "*.png")などとしてみましたが 型が一致しないというエラーが出てしまいました。 もっとシンプルに分かり易くしたいです、どなたかご助力お願いいたします。 当方Excel2003を使用しております。

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

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

専門家に質問してみよう