質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

7749閲覧

VBAで特定の語を含む複数のファイルのうち更新日付が一番新しいファイルを取得したい

Kalewalavn

総合スコア8

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/03/02 13:05

編集2018/03/03 01:16

VBAでプログラムを組んでいます。

背景
はじめDir関数で特定の語のファイルをピックアップしていたのですが、
"日本"を含むファイルが複数出てくるとその中で最新の物を取得する必要が出てきました。


組みたい内容は、
.xlsのファイルが多数存在する『親』というフォルダがあります。
多数あるファイルの中のファイル名に(例えば"日本")特定の語を含むファイルがいくつかあります。
このうち更新日付が一番新しいファイルのパスを知りたいです。

分かる方、教えていただきたいです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

基本は該当ファイルをすべて列挙し、その中で最も新しい更新日時のファイルを探せば良いでしょう。

また、VBAでは日付はDate型で扱われますが、普通の<>演算子で比較できます。
大きい日付=新しい日付のため、最も大きい日付のファイル=最も新しいファイルとなります。

以下はファイルの名前と日付を取得してイミディエイトウィンドウへ出力する例です。

最も更新日時が新しいファイルを探す部分は考えてみてください。

VBA組み込み関数のみ使用

vba

1Sub OnlyVBAFunction() 2 3 'VBAの組み込み関数だけを使用する例 4 Dim parentDir As String 5 parentDir = "C:\親\" 6 7 Dim namePattern As String 8 namePattern = "*日本*.xls" 9 10 Dim findName As String 11 findName = Dir(parentDir & namePattern) 12 13 Do While findName <> vbNullString 14 15 Dim updateTime As Date 16 updateTime = FileDateTime(parentDir & findName) '要フルパス指定 17 18 Debug.Print findName, updateTime 'イミディエイトウィンドウに出力 19 20 findName = Dir() 21 Loop 22 23End Sub

FileSystemObjectを使った例

vba

1Sub UseFileSystemObject() 2 3 '`Microsoft Scripting Runtime`の参照設定が必要 4 'Scripting~の型宣言を外せば、参照設定なしでも動く 5 6 Dim parentDir As String 7 parentDir = "C:\親\" 8 9 Dim namePattern As String 10 namePattern = "*日本*.xls" 11 12 13 Dim fso As Scripting.FileSystemObject 14 Set fso = CreateObject("Scripting.FileSystemObject") 15 16 Dim parentFolder As Scripting.Folder 17 Set parentFolder = fso.GetFolder(parentDir) 18 19 20 Dim f As Scripting.File 21 For Each f In parentFolder.Files 'フォルダ直下の全ファイルに対してループ 22 23 If f.Name Like namePattern Then 24 25 Dim updateTime As Date 26 updateTime = f.DateLastModified 27 28 Debug.Print f.Name, updateTime 'イミディエイトウィンドウに出力 29 30 End If 31 32 Next f 33 34End Sub

投稿2018/03/03 03:34

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

※以下のロジックで、取得したファイル名と更新日時は取得できます。
また、後述する処理は、下記ロジックをカスタマイズすればできると
思いますので参考にしてください。

最新の更新日時のファイルを取得する件ですが、
フォルダ内のファイル分をループし
特定文字を含むファイルを見つけたら、
一番最初の特定ファイルは、保存用変数にファイル名と更新日時を退避ししてそのままループ
2番目以降に発見した特定ファイルは都度、取得した更新日時を、保存用変数の更新日時と比較し、
新しい方の更新日時とファイル名を保存用変数へ退避しなおします。
最終ファイルまで比較が終了したら、
保存用変数に退避された更新日時とファイル名が最新の更新日時のものになります。

///////////////////////////
Dim fso As FileSystemObject
Set fso = New FileSystemObject

Dim fl As Folder
Set fl = fso.GetFolder("D:") ' フォルダを取得

Dim fileName As String
Dim f As File
For Each f In fl.Files ' フォルダ内のファイルを取得
If f.Name = "Tips.txt" Then ' 日時を取得したいファイル
Dim d As Date
d = f.DateCreated ' 作成日時を取得
d = f.DateLastModified ' 更新日時を取得
d = f.DateLastAccessed ' アクセス日時を取得
End If
Next

' 後始末
Set fso = Nothing
///////////////////////////

投稿2018/03/03 02:29

cutedog

総合スコア177

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問