こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

複数のファイルを結合するマクロを組んでいる中で、同一フォルダ内に有るファイルをDIR関数を使って名前を取得しています。DIR関数でファイル名を取得したときのファイルの順番がHDDの書き込み順番で有ることが分かりました。

過去の質問も捜してみましたが、上手く見つけることが出来ませんでした。

ファイルの作成日、もしくは、ファイル名称で順番に取得する手法はないでしょうか?Excelのシートに記載しないでマクロを動作させたいと考えております。


使用しているExcelは2003です。
皆様のお知恵を貸してください。よろしくお願いします。

投稿日時 - 2007-08-14 18:15:03

QNo.3254716

困ってます

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

以前に似たような質問↓をしたことがあります。

(VBA) Dir 関数で取得するファイル一覧の順序
http://okwave.jp/qa2149125.html

(VBA) 配列の文字列を昇順で並べ替えたい
http://okwave.jp/qa2149727.html

参考になれば幸いです。^^

投稿日時 - 2007-08-14 22:58:30

お礼

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

困ったときにまた質問させてください。

ありがとうございました。

投稿日時 - 2007-08-15 09:28:30

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.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 ステートメントなどで取得して取り出します。

投稿日時 - 2007-08-15 00:56:57

お礼

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

コマンドプロンプトの呼び出しが出来るようにもう少し勉強します。

ありがとうございました。

投稿日時 - 2007-08-15 09:35:46

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

投稿日時 - 2007-08-14 20:47:57

補足

参考URLありがとうございました。

せっかくEXCELを使用しているのでシートを活用したほうが良いようですね。

ありがとうございました。

投稿日時 - 2007-08-15 09:14:34

お礼

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

投稿日時 - 2007-08-15 09:23:57

ANo.3

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

投稿日時 - 2007-08-14 19:16:07

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

投稿日時 - 2007-08-14 19:14:51

お礼

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

投稿日時 - 2007-08-15 09:13:54

ANo.1

作成時刻などは、下記URLから API関数( GetFileInformationByHandle )を使用して 得ることが、できます。
他にも、ありますので、調べてください。


API別 Win32 サンプル集
http://nienie.com/~masapico/api_index.html



GetFileInformationByHandle オープンしているファイルの情報取得
http://nienie.com/~masapico/api_GetFileInformationByHandle.html

投稿日時 - 2007-08-14 18:55:10

お礼

早速の回答ありがとうございました。

参考にしてトライしてみます。

投稿日時 - 2007-08-15 08:56:56

あなたにオススメの質問