アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

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


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

A 回答 (6件)

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



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

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

参考になれば幸いです。^^
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2007/08/15 09:28

こんばんは。



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 ステートメントなどで取得して取り出します。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2007/08/15 09:35

ファイルが作成された順にアイテム番号のようなものが振られその順に、名前が抜き出されるのだと思います。


それなら
(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/342xp …
フォルダ内のファイルの並び順序
とは別のことなのはお分かりと思います。
http://okwave.jp/qa2822648.html

この回答への補足

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

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

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

補足日時:2007/08/15 09:14
    • good
    • 1
この回答へのお礼

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

お礼日時:2007/08/15 09:23

あっと、


FileSerachが2003で使えるかは分かりません。
当方2002です。
    • good
    • 0

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/15 09:13

作成時刻などは、下記URLから API関数( GetFileInformationByHandle )を使用して 得ることが、できます。


他にも、ありますので、調べてください。


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



GetFileInformationByHandle オープンしているファイルの情報取得
http://nienie.com/~masapico/api_GetFileInformati …
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2007/08/15 08:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!