エクセルVBAで使うコードの備忘録。VBAで指定ファイルの更新日時を変更するコード。ファイルシステムオブジェクトでは変更できないので、Windowsのエクスプローラーを操作するための「Shell.Application」オブジェクトを使用します。
Shall.Applicationオブジェクト
機能を実装するだけなら必要はありませんが、意味も分からずに使うのも気持ちが悪いと思うので、今回利用する「Shell.Application」オブジェクトについての概要を書いておきます。
「Shell.Application」オブジェクトは、Windowsの「Shell(シェル)」と呼ばれるソフトウェアを表すオブジェクトです。この「Shell」と呼ばれるプログラムは、Windowsというオペレーティングシステム(PCの核となる中枢)と人間による入力の間を取り持つインターフェースのような役割を担っています。
VBAではこの「Shell.Application」オブジェクトを利用することによって、Windowsのインターフェースである「Shell」に指示を送り、ファイル操作などのWindows上で人間が行うことができる操作を実現します。
「Shell.Application」オブジェクトは下記のように宣言して作成します(ここでは「objShell」という変数を使用していますが、名前はなんでも構いません)。
Dim objShell As Object
Set objShell = CreateObject("Shell.Application")
サンプルコード
下記のサンプルコードでは「Shell.Application」オブジェクトを利用してファイルの更新日時を変更しています。「Shell.Application」オブジェクトを使い、まずは変更したいファイルを表すオブジェクトを取得し、「ModifyDate」プロパティに変更後の日時を設定しています。「Shell.Application」オブジェクトの「Namespace」メソッドではフォルダの取得しかできないので、一度変更したいファイルが入っているフォルダを取得してから、ファイルオブジェクトを取得するという二段構えになっています。
ちなみに、「Namespace」メソッドの引数として渡すフォルダのパスはVariant型変数として宣言しておきましょう。String型だどうまく取得ができませんでした。
Public Sub ChangeModifiedDate()
'--- Shell.Applicationオブジェクトの生成 ---'
Dim objShell As Object
Set objShell = CreateObject("Shell.Application")
'--- 変更したいファイルのフォルダパス ---'
Dim folderPath As Variant
folderPath = "[フォルダパス]"
'--- ファイル名 ---'
Dim fileName As String
fileName = "[ファイル名]"
'--- 変更後の日付(今回は現在時刻) ---'
Dim modDate As Date
modDate = Now
'--- フォルダオブジェクトを取得 ---'
Dim objFolder As Object
Set objFolder = objShell.Namespace(folderPath)
'--- ファイルオブジェクトを取得 ---'
Dim objFile As Object
Set objFile = objFolder.ParseName(fileName)
'--- 更新日時を変更する ---'
objFile.ModifyDate = modDate
End Sub