• ベストアンサー

Excel VBAでのファイル名取得方法

複数のファイルを結合するマクロを組んでいる中で、同一フォルダ内に有るファイルをDIR関数を使って名前を取得しています。DIR関数でファイル名を取得したときのファイルの順番がHDDの書き込み順番で有ることが分かりました。 過去の質問も捜してみましたが、上手く見つけることが出来ませんでした。 ファイルの作成日、もしくは、ファイル名称で順番に取得する手法はないでしょうか?Excelのシートに記載しないでマクロを動作させたいと考えております。 使用しているExcelは2003です。 皆様のお知恵を貸してください。よろしくお願いします。

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

  • ベストアンサー
回答No.5

以前に似たような質問↓をしたことがあります。 (VBA) Dir 関数で取得するファイル一覧の順序 http://okwave.jp/qa2149125.html (VBA) 配列の文字列を昇順で並べ替えたい http://okwave.jp/qa2149727.html 参考になれば幸いです。^^

k2mac
質問者

お礼

回答ありがとうございます。 この方法ですとシートを使用しなくて良いようですね。 VBAはあまり詳しくないので、手探りの状態です。 ネットでの検索が主な頼りとなっています。 困ったときにまた質問させてください。 ありがとうございました。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。 FileSearch オブジェクトは、長い間、バグ付きでしたので、みなさんが敬遠して使わなかったようです。おそらく、Excelのバージョンではなく、OSの関係ではないか、と私は思っております。こちらは、Win XPで問題なく使えます。 この部分は、MS-DOSのワイルドカードの基準と違いますので注意が必要です。  .Filename = "t*" Execute メソッドの引数で切り替えます。 msoSortByFileName 既定値 msoSortByLastModified ただし、Excel2000 には、バグがあり、うまく動かない可能性が高いです。以下は、ヘルプをほとんど丸写ししただけです。 Sub DirFindMacro() Dim i As Long  With Application.FileSearch   .NewSearch   .LookIn = ThisWorkbook.Path & "\"   .SearchSubFolders = False   .Filename = "t*"   .MatchTextExactly = True   .FileType = msoFileTypeOfficeFiles     'この部分で、オプションを切り替えます。 msoSortByFileName   If .Execute(SortBy:=msoSortByFileName, _       SortOrder:=msoSortOrderAscending) > 0 Then     For i = 1 To .FoundFiles.Count       'Cells(i, 1).Value = .FoundFiles(i) 'フルパス・ファイル名       Cells(i, 1).Value = Mid$(.FoundFiles(i), InStrRev(.FoundFiles(i), "\") + 1)     Next i   Else     MsgBox "検索条件を満たすファイルはありません。"   End If End With End Sub なお、コマンドプロンプトのほうが簡単です。 例えば、 dir t*.xls /on (名前順) dir t*.xls /od (日付順 昇順) dir t*.xls /o-d (日付順 降順) もし、記録がほしいのでしたら、リダイレクトすればよいです。 例: dir t*.xls /on >dirtext.txt マクロで作る場合は、この出力ファイルをInput ステートメントなどで取得して取り出します。

k2mac
質問者

お礼

エクセルからのコマンドプロンプト呼び出しが上手くできずあきらめていました。 コマンドプロンプトであればいろいろなオプションで昇順降順のソートが出来るのですが・・・VBAで同じことが出来なくて残念です。 コマンドプロンプトの呼び出しが出来るようにもう少し勉強します。 ありがとうございました。

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

ファイルが作成された順にアイテム番号のようなものが振られその順に、名前が抜き出されるのだと思います。 それなら (1)自分で名前・作成日等を配列にファイル名や記憶し、自分でソートする。 (2)FaileSearchのような自分で実行して、終われば自分で、実行を引き継げるもので、ソートする http://www.moug.net/tech/exvba/0060051.htm などを使わざるを得ないでしょう。 上記で、mougがエクセル2000で解説しているので、2003では大丈夫でしょう。 ーー これは http://www2.moug.net/bbs/win/20070517000004.htm http://www.atmarkit.co.jp/fwin2k/win2ktips/342xpsort/xpsort.html フォルダ内のファイルの並び順序 とは別のことなのはお分かりと思います。 http://okwave.jp/qa2822648.html

k2mac
質問者

お礼

入力場所間違えました。 失礼しました。

k2mac
質問者

補足

参考URLありがとうございました。 せっかくEXCELを使用しているのでシートを活用したほうが良いようですね。 ありがとうございました。

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.3

あっと、 FileSerachが2003で使えるかは分かりません。 当方2002です。

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.2

FileSearchを使えばシート上でソートしないで名前順などで フォルダ内のファイル一覧を取得できます。 なかなか分かりやすいHPがないですね。 「FileSearch」「Application.FileSearch」 でネット検索してみてください。参考になると思います。 Sub test() Dim Fol As String Dim fso As FileSearch Dim fmei As String Dim i As Long Dim myFile() As Variant On Error GoTo er Fol = CreateObject("Shell.Application").BrowseForFolder(0, "選択して下さい。 ", 0).self.Path Set fso = Application.FileSearch With fso .NewSearch .LookIn = Fol & "\" .Filename = "*.*" .Execute SortBy:=msoSortByName, _ sortorder:=msoSortOrderAscending i = .FoundFiles.Count ReDim myFile(i) For i = 1 To .FoundFiles.Count myFile(i) = .FoundFiles(i) With Sheet1 fmei = Split(fso.FoundFiles(i), "\")(UBound(Split(fso.FoundFiles(i), "\"))) fmei = Split(fmei, ".")(0) .Cells(i, 1).Value = fmei .Cells(i, 2) = _ FileDateTime(fso.FoundFiles(i)) End With Next End With Exit Sub er: AppActivate Application.Caption MsgBox "中止" End Sub

k2mac
質問者

お礼

ソースでの説明ありがとうございました。 セルを使用する方法になりそうですが、問題なく動作しそうです。 ありがとうございました。

  • Nayuta_X
  • ベストアンサー率46% (240/511)
回答No.1

作成時刻などは、下記URLから API関数( GetFileInformationByHandle )を使用して 得ることが、できます。 他にも、ありますので、調べてください。 API別 Win32 サンプル集 http://nienie.com/~masapico/api_index.html GetFileInformationByHandle オープンしているファイルの情報取得 http://nienie.com/~masapico/api_GetFileInformationByHandle.html

k2mac
質問者

お礼

早速の回答ありがとうございました。 参考にしてトライしてみます。

関連するQ&A