プロが教えるわが家の防犯対策術!

デスクトップに保存してあるVBSファイルをダブルクリックした際に
コードが開始され

Aというフォルダ内に
300近いフォルダがあるのですが
このAフォルダ内の最新(更新日)のフォルダ名を取得し
それをメモ帳に記入して、そのメモをデスクトップに保存するということを行いたいです。
保存名【最新】という名前で、もし新たにコードを実行した際は
その都度上書きされるといった感じです。

このような事が可能でしたら
コードを教えて頂きたいです。
参考までにネット拾ったコードが下記のものです。
このコードでは指定フォルダ内のサブフォルダ名すべてが
メモに書き込まれますが
これを最新のものだけにしたいという感じです。
よろしくお願いします。
Option Explicit

Dim objFileSys
Dim objFolder
Dim objSubFolder
Dim objOutputTextStream

'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")

'ログ出力用 TextStream オブジェクトを作成
'第2引数は 1 :読み取り、2 :上書き、3 :追記。
Set objOutputTextStream = objFileSys.OpenTextFile("log.txt", 2, True)

'c:\temp フォルダのオブジェクトを取得
Set objFolder = objFileSys.GetFolder("V:\工程\test")

'FolderオブジェクトのFilesプロパティからFileオブジェクトを取得
For Each objSubFolder In objFolder.SubFolders
'ファイル名を取得し、ログファイルに出力
objOutputTextStream.WriteLine objSubFolder.Name
Next

'TextStream は Close を忘れずに
objOutputTextStream.Close

Set objOutputTextStream = Nothing
Set objSubFolder = Nothing
Set objFileSys = Nothing

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

  • ありがとうございます。
    objOutputTextStream.WriteLine recSet.Fields("Name").Value
    の部分でエラーが発生するのですが
    なぜでしょうか?

    「VBS 指定のフォルダ内の最新のフォルダ」の補足画像1
    No.1の回答に寄せられた補足コメントです。 補足日時:2019/11/28 07:14

A 回答 (2件)

' 拾ったサブフォルダーの一覧を ADODB で取り扱うのはどうでしょうか。


' メモリ上にデータベースのテーブルを作り、ファイル一覧をレコードとして格納すればソートが出来ます。
' 更新日時の降順でソートした 1件目が質問者さんが求めるレコードになるはずです。

Option Explicit

Const adDBTimeStamp = 135
Const adVarWChar = 202
Const targetPath = "E:\test"

Dim fso ' As Scripting.FileSystemObject
Dim rootDir ' As Scripting.Folder
Dim subDir ' As Scripting.Folder
Dim recSet ' As ADODB.Recordset

Set fso = CreateObject("Scripting.FileSystemObject")
Set rootDir = fso.GetFolder(targetPath)

Set recSet = CreateObject("ADODB.Recordset")
recSet.Fields.Append "Name", adVarWChar, 255
recSet.Fields.Append "LastModified", adDBTimeStamp

' フォルダー一覧の名前と更新日をレコードセットに格納する
recSet.Open
For Each subDir In rootDir.SubFolders
recSet.AddNew
recSet.Fields("Name").Value = subDir.Name
recSet.Fields("LastModified").Value = subDir.DateLastModified
recSet.Update
Next

' 更新日の降順でソートし、1件目のレコードの値だけ拾ったらレコードセットを閉じる
recSet.Sort = "LastModified DESC"
recSet.MoveFirst
objOutputTextStream.WriteLine recSet.Fields("Name").Value
recSet.Close
objOutputTextStream.Close

Set recSet = Nothing
set rootDir = nothing
Set fso = Nothing
この回答への補足あり
    • good
    • 0

あなたから提示されたスクリプトを更新しました。

以下のようにしてください。
Option Explicit

Dim objFileSys
Dim objFolder
Dim objSubFolder
Dim objOutputTextStream
Dim lasttime '最終更新時刻
Dim lastfolder '最新のフォルダ
'ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject("Scripting.FileSystemObject")

'ログ出力用 TextStream オブジェクトを作成
'第2引数は 1 :読み取り、2 :上書き、3 :追記。
Set objOutputTextStream = objFileSys.OpenTextFile("log.txt", 2, True)

'c:\temp フォルダのオブジェクトを取得
Set objFolder = objFileSys.GetFolder("V:\工程\test")

'FolderオブジェクトのFilesプロパティからFileオブジェクトを取得
lasttime = 0
For Each objSubFolder In objFolder.SubFolders
if objSubFolder.DateLastModified > lasttime then
'最終更新時刻が新しければ、その時刻とフォルダ名を更新する
lasttime = objSubFolder.DateLastModified
lastfolder = objSubFolder.Name
End If
Next
'最新のフォルダ名をログファイルに出力
objOutputTextStream.WriteLine lastfolder

'TextStream は Close を忘れずに
objOutputTextStream.Close

Set objOutputTextStream = Nothing
Set objSubFolder = Nothing
Set objFileSys = Nothing
    • good
    • 0
この回答へのお礼

ありがとうございます。

頂いたコードでやりたいことが行えました。
ありがとうございました。

お礼日時:2019/11/29 07:01

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