こんにちは、blueです。
前回は実践編の一回目としてフォルダ内のファイル名を一括変更する方法について説明しました。
前回の記事はこちら

今回はフォルダ内の最新ファイル取得する方法を紹介します。
今回のコード
以下のようにフォルダ内でファイルが日々追加されていく状況で最新のファイルを取得します。

コード
実際のコードは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | Private Sub GetLatestFile1() 'フォルダを選択する(FileDialog) 'フォルダオブジェクトを取得する(GetFolder) '最新日を仮置きする 'フォルダ内のファイルに対して更新日を確認する。もし更新日が最新日より後ならそのファイル名を取得する 'フォルダ名+ファイル名でファイルを開く Dim FD As FileDialog Dim FolderName As String Dim FSO As Scripting.FileSystemObject Dim objFolder As Scripting.Folder Dim objFile As Scripting.File Dim LatestFile As Scripting.File Dim LatestDate As Date ' 'フォルダを選択する(FileDialog) Set FD = Application.FileDialog(msoFileDialogFolderPicker) 'フォルダオブジェクトを取得する(GetFolder) If FD.Show = True Then FolderName = FD.SelectedItems(1) Set FSO = New Scripting.FileSystemObject Set objFolder = FSO.getFolder(FolderName) Else Exit Sub End If '最新日を仮置きする LatestDate = "1900/1/1" 'フォルダ内のファイルに対して更新日を確認する。もし更新日が最新日より後ならそのファイルオブジェクトを取得する For Each objFile In objFolder.Files If LatestDate < objFile.DateLastModified Then Set LatestFile = objFile LatestDate = LatestFile.DateLastModified End If Next objFile 'Workbooks.Openでファイルを開く Workbooks.Open LatestFile.Path Set FSO = Nothing End Sub |
コードの詳細は以降で詳しく説明します。
コードの説明
オブジェクトの宣言
1 2 3 4 5 6 7 | Dim FD As FileDialog Dim FolderName As String Dim FSO As Scripting.FileSystemObject Dim objFolder As Scripting.Folder Dim objFile As Scripting.File Dim LatestFile As Scripting.File Dim LatestDate As Date |
今回必要なオブジェクトはFileDialogとFSO,ファイルオブジェクトとフォルダオブジェクトです。
また最新のファイルオブジェクトをLatestFile、最新日をLatestDateとして宣言しています。
フォルダ名の取得とオブジェクトの取得
1 2 3 4 5 6 7 8 9 10 11 | 'フォルダを選択する(FileDialog) Set FD = Application.FileDialog(msoFileDialogFolderPicker) 'フォルダオブジェクトを取得する(GetFolder) If FD.Show = True Then FolderName = FD.SelectedItems(1) Set FSO = New Scripting.FileSystemObject Set objFolder = FSO.getFolder(FolderName) Else Exit Sub End If |
前回同様Application.FileDialog(msoFileDialogFolderPicker)で「フォルダを選択」ダイアログを立ち上げてフォルダ名を取得しています。
コードの詳しい説明はこちら

またFSOオブジェクトを取得したのちにフォルダオブジェクトを取得しています。
コードの詳しい説明はこちら


フォルダオブジェクト内の最新ファイルを取得し、ファイルを開く
1 2 3 4 5 6 7 8 9 10 11 12 13 | '最新日を仮置きする LatestDate = "1900/1/1" 'フォルダ内のファイルに対して更新日を確認する。もし更新日が最新日より後ならそのファイルオブジェクトを取得する For Each objFile In objFolder.Files If LatestDate < objFile.DateLastModified Then Set LatestFile = objFile LatestDate = LatestFile.DateLastModified End If Next objFile 'Workbooks.Openでファイルを開く Workbooks.Open LatestFile.Path |
まず最初に最新日を仮置きします。
次にフォルダオブジェクト内の最新ファイルを取得する為にFor Eachステートメントを使用します。
前回同様Filesプロパティが有用でフォルダ内のすべてのファイルオブジェクトを取得しています。
コードの詳しい説明はこちら

その後For~Each Next内でファイルオブジェクト更新日を取得しています。
その中でもし更新日が最新日よりも後であればそのファイルオブジェクトを取得し、最新日をそのファイルの更新日に変更しています。
最後にWorkbooks.Openでファイルを開いています。
まとめ
今回は 今回はフォルダ内の最新ファイル取得するコードを紹介しました。
この方法を応用すれば最新フォルダを取得することも可能です。
最新ファイルを手で探し出したりしないとならない場合などに使っていただければ幸いです。
コメント
いつもVBA学習の参考にさせていただいております。記事更新ありがとうございます。
「FileSystemObjectを使いこなす!(実践編) 第二回目 フォルダ内の最新ファイルを取得する」について、参考プロシージャのFor Each objFile In objFld.Filesの変数objFldはobjFolderではないでしょうか?
ご確認をよろしくお願いします!
Twitterフォローさせていただいております。@ympccom2020
よろしくお願いします。
すみません、コメント来ないので見方を忘れておりました(汗)。
ありがとうございます!2点間違い修正しました。
問題ないと思いますがご確認ください。
フォローしていただいていてありがとうございます。定期的にアウトプットしていきますので
またみていただければ幸いです!