プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。
指定フォルダ内に何種類か(xls,doc等)のファイルがあり、ファイル名はTitle毎としてあります。
タイトル毎の最新ファイル(TaitleAであれば03のファイル名を、TitleBであれば04)のファイル名を取得したいのですが、どうすれば良いか、詳しい方よろしくお願い致します。
(※当方バージョンは2003です。)
--------------------------------
(フォルダ内)
TitleA01.xls TitleB01.doc
TitleA02.xls TitleB02.doc
TitleA03.xls TitleB03.doc
       TitleB04.doc
--------------------------------

質問者からの補足コメント

  • 分かり易い回答有難うございます。
    言葉足らずにすみません。実際はTitleAでも何種類(exe,doc)のファイルがあり種類別で最終のファイル名を取得したいと思っています。(同じタイトルがついていてファイルの種類が違うということです)教えて頂いたものを試してみましたが、1つの結果出力だったので、お力をお貸し頂ければ幸いです。よろしくお願い致します。(イメージを下記に書いておきます)
    --------------------------------
    (フォルダ内)
    TitleA01.xls TitleB01.doc
    TitleA02.xls TitleB02.doc
    TitleA03.xls TitleB03.doc
    TitleA01.doc TitleB04.doc
    TitleA02.doc TitleB01.xls
    --------------------------------

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/03/31 22:28
  • やりたかった方法を教えて頂き感謝いたします。
    ただ横配列を縦配列にしようと思いWorksheetFunction.Transpose(arrReturn)にてセルに出力しようとしましたが、#N/Aの値が入ってしまいましたが、ここまで教えて頂いたのであとはなんとかやってみます。有難うございました!

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/04/01 23:54

A 回答 (3件)

こんにちは。



色々ありますが、この手の処理ではもっともベーシックな手法で、
Dir関数をループするやり方です。

ファイル名が「タイトル」から始まるファイルを、
拡張子は無視して、総当たりで検索して、
ファイル名を文字列値としての大小比較をすることで、簡単に、
一番大きな数字が付いたファイルを判別するように書いています。
簡単な記述であることを重視していますので、
 もしも、"TitleA2.xls"とか"TitleA02.xls"とか
 不規則な命名のファイルが混じっていると、
 "TitleA03.xls"よりも新しい、と判断される
ような書き方を選びましたので、注意してください。
実際の処理の場面でのお求めに対して、もしも不足があるようでしたら、
ご提示のファイル名について、どこまでが具体例なのか
判るような補足を書いてみて下さい。
例示が抽象的過ぎていたりすると、こちらからは、
お役に立てないものしか提示できないのかも知れませんので。


Sub Re8953548G()

Dim sDir As String
Dim sTitleHead As String
Dim sTemp As String
Dim sReturn As String

  ' ' 「指定フォルダ」へのパスをドライブ名から指定
  sDir = "D:\Work"
  ' ' ファイル名を前方一致で篩に掛ける「タイトル」を指定
  sTitleHead = "TitleA"

  ' ' Dir関数でファイル名を取得
  sTemp = Dir(sDir & "\" & sTitleHead & "*")
  ' ' Dir関数をループ
  Do While sTemp <> "" ' Dir関数でファイル名を取得し尽したらループ終了
  ' ' ファイル名が「タイトル」で始まるものだけ篩に掛ける
    If sTemp Like sTitleHead & "*" Then
      If sTemp > sReturn Then sReturn = sTemp
    End If
    sTemp = Dir() ' ' Dir関数で次のファイル名を取得
  Loop

  MsgBox "フォルダ:" & sDir & vbLf & "タイトル:" & sTitleHead & vbLf & "最新:" & sReturn

End Sub
この回答への補足あり
    • good
    • 7

#1です。

補足コメント拝見しました。

拡張子別に「最終のファイル名を取得したい」ということは理解出来ました。
実は#1の時点でも、そういうニーズは想定していて実際に書いていたのですが、
それにしては、複数の結果を出力する方法の指定が無かったので、
拡張子別ではない、と判断したのでした。
とりあえず、出力の仕方が解りませんから、
以下の記述に照らして、3通りの扱い方を説明しますので、
そちらで応用なってください。
1)拡張子毎にループした中で、個々の拡張子の最終ファイル名を取得したい場合
    Loop
    MsgBox sReturn ' ←ここ(LoopとNextの間)で sReturn 文字列を
  Next i
2)一通りループが済んだ後で、配列として最終ファイル名を取得したい場合
  Next i
  の後に、arrReturn() 文字列配列を
3)区切られた連続した文字列として最終ファイル名を取得したい場合
  Next i
  の後に、MsgBox Join(arrReturn(), ",") 文字列を (←例はカンマ区切り)


Sub Re8953548Ga()

Dim arrExtension() As String
Dim arrReturn() As String
Dim sDir As String
Dim sTitleHead As String
Dim sTemp As String
Dim sReturn As String
Dim nUB As Long
Dim i As Long

  ' ' 「指定フォルダ」へのパスをドライブ名から指定
  sDir = "L:\Work"
  ' ' ファイル名を前方一致で篩に掛ける「タイトル」を指定
  sTitleHead = "TitleA"
  ' ' 拡張子をカンマ区切りテキストで指定 "*.拡張子"文字列の配列
  arrExtension() = Split("*.xls,*.doc,*.mdb,*.ppt,*.txt", ",")
' ' ■■■■ 以上、要指定 ■■■■

  ' ' "*.拡張子"文字列の配列のサイズ
  nUB = UBound(arrExtension())
  ' ' 戻り値を格納する配列変数を再定義
  ReDim arrReturn(nUB) As String

  ' ' 拡張子の数だけループ
  For i = 0 To nUB
    sReturn = ""
    ' ' Dir関数でファイル名を取得
    sTemp = Dir(sDir & "\" & sTitleHead & arrExtension(i))
    ' ' Dir関数をループ
    Do While sTemp <> "" ' Dir関数でファイル名を取得し尽したらループ終了
      ' ' ファイル名を文字列値としての大小比較 大きい方をsReturnに記録
      If sTemp > sReturn Then sReturn = sTemp
      sTemp = Dir() ' Dir関数で次のファイル名を取得
    Loop
    ' ' 出力用の配列に「最新ファイル」の名前を格納
    arrReturn(i) = sReturn
  Next i

  MsgBox "フォルダ:" & sDir & vbLf & "タイトル:" & sTitleHead & vbLf _
      & "最新:" & vbTab & Join(arrReturn(), vbLf & vbTab)

End Sub
この回答への補足あり
    • good
    • 0

こんにちは。



ご自分で、このようなものを作る時は、コマンドプロンプトなどで、Dir を出してしまい、それをExcelに貼り付けるということもアリだと思います。今回、コマンドプロンプトのDirを使わなかった理由は、私の設定が、一般的な設定ではなかったからです。以下は、Excelで出力も可能ですが、MsgBox にしてあります。拡張子と、日付だけで調べます。

なお、ファイル名に関しては、この版では、考慮していません。あくまでも、拡張子とファイルスタンプの最終更新日に対するものです。

'//
Sub MainMacro()
Dim n As Variant
Dim sPath As String
sPath = "C:\Temp\" '必ず最後は¥をつける
 For Each n In Array(".doc", ".xls", ".txt") 'ここに拡張子を入れてください。
 GetLastFile n, sPath
 Next
End Sub

Sub GetLastFile(Ext As Variant, sPath As Variant)
'拡張子 Ext, 調べるパス sPath
 Dim Fso As Object
 Dim f As Variant
 Dim i As Long, j As Long
 Dim r As Variant
 Dim Ar() As Variant
 Dim buft As Date, bufn As String
 Set Fso = CreateObject("Scripting.FileSystemObject")
  j = Len(Ext)
 buft = 0
 bufn = ""
 ReDim Ar(1, 1)
  With Fso
    For Each f In .GetFolder(sPath).Files
      If Trim(f.Name) <> "" And _
      StrConv(Right(f.Name, j), vbLowerCase) Like Ext Then
      If f.DateLastModified > buft Then
        buft = f.DateLastModified '最終更新日
        bufn = f.Name
      End If
      End If
    Next f
  End With
  If bufn <> "" Then
    MsgBox bufn & " " & buft
  End If
End Sub
    • good
    • 2
この回答へのお礼

こんな方法もあるんですね、有難うございます。

お礼日時:2015/04/01 23:56

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A