【VBA&PowerShell】指定したファイルの作成日時/更新日時/アクセス日時を変更する方法
「ファイルの作成時間や更新時間、アクセス時間を変更したい!」と思うこと、たまにありませんか?
何かしらのツジツマ合わせだったり、アリバイ工作だったりと人それぞれだと思います。
一応PCのシステム上の時間(システム時刻)を変えて保存すれば更新時間を好きに変更することができますが、そもそもシステム時刻を変更すると色々なところに影響が出てしまうので避けたいですし、作成時間の変更はどうやっても不可能です。
そこで今回はVBAとPowerShellを使ってシステム時刻に影響を与えずに、ファイル名を変更するくらいの感覚でファイルの作成日時/更新日時/アクセス日時を変更する方法を紹介していきます。コピペですぐに使えるVBAコードも紹介しているのでぜひ使ってみてください。
・本ページで紹介する内容はVBAとPowerShellを使うためWindowsが対象です。
・日時の変更で何かしらの問題が起きたとしても自己責任でお願いします。
(ファイル時間の変更によって”PCに問題”が発生するということはありません)
ファイルの作成日時/更新日時/アクセス日時を変更する方法
ファイルの作成/更新/アクセス日時を変更するにはPowerShellというものを利用します。
PowerShellの存在を知らない方もいると思いますが、最近のWindowsには標準装備されているのでスタートメニューで「PowerShell」と入力すれば出てくるはずです。
PowerShellとは簡単に言えばコマンドプロンプトの上位互換のようなもので、実行したいコマンドを入力することで特定の操作を行うことができます。上画像のようなウィンドウ上にコマンドを入力し、[Enter]キーを押下することで入力したコマンドの処理が実行されます。
このPowerShellの「Set-ItemPropertyコマンドレット」というものを使うことで、指定したファイルやフォルダのプロパティ値、つまりは作成日時/更新日時/アクセス日時を変更することができます。
実際にPowerShellで作成日時を変更してみる
まずは実際にPowerShellを使ってファイルの作成日時を変更してみましょう。
メモ帳等を開いて下記コマンドを貼り付けてファイルパスと日時を書き換えてください。
(‘C:\Users\user\Desktop\sample.txt’と‘2000/01/01 12:34:56’の部分)
1 |
Set-ItemProperty 'C:\Users\user\Desktop\sample.txt' -name CreationTime -value '2000/01/01 12:34:56' |
ファイルパスは作成日時を変更したいファイルのフルパス、
日時は変更後に適用させるファイルの作成日時を入力してください。
例えば上記コードの場合でいうと、
デスクトップ上にある「sample.txt」の作成日時が「2000/01/01 12:34:56」に書き換えられます。
これにてファイルの作成日時を変更するコマンドは完成です。
あとはPowerShellを開いて今作成したコマンドを[Ctrl]+[V]で貼り付けて[Enter]で実行します。
これで指定したファイルの作成日時が変更されます。
上記コードではファイルの作成日時の変更となっていますが「CreationTime」を「LastWriteTime」に書き換えれば「更新日時」、「LastAccessTime」に書き換えれば「アクセス日時」を変更することが可能です。
VBAからPowerShellを実行する
ファイルの作成日時/更新日時/アクセス日時を変更する方法は上記内容で全てです。
ただ、毎回上記コードを入力するのも面倒ですし、もう少し気軽にするためVBAでファイルの日時を変更できるようにします。
VBAでPython(pyファイル)を実行する方法でも紹介していますが、VBAはコマンドプロンプトで指定したコマンドを実行させることができます。そしてコマンドプロンプトはアプリケーション名といくつかの引数を入力することで、そのアプリケーションを実行させることができます。
つまり、今回の場合はコマンドプロンプトでPowerShellを実行させるということです。
下記のVBAコードを実行することで、「ChangePath」で指定したファイルの作成日時/更新日時/アクセス日時を「ChangeTime」で指定した日時に書き換えることができます。
(※PowerShellやコマンドプロンプトは表示されない設定になっています)
注意事項としてファイルのパスと時間の文字列は前後にシングルクォーテーション[‘]を入れておく必要があるという点です。コマンドプロンプト上ではダブルクォーテーション[“]を使用するとうまく実行できないためです。
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 47 48 49 50 51 52 53 54 |
Option Explicit '----------------------------------------------------------------------------------------------------------- Sub main() Dim ChangePath As String Dim ChangeTime As String Dim cmd As String '日時を変更するファイルのフルパス ChangePath = "'C:\Users\user\Desktop\sample.txt'" '変更後の日時[YYYY/MM/DD HH:MM:SS]表記 ChangeTime = "'2000/01/01 12:34:56'" '※①,②,③で使用するコマンド以外はコメントアウトしてください '①作成日時変更.ver cmd = "Set-ItemProperty " & ChangePath & " -name CreationTime -value " & ChangeTime '②更新日時変更.ver cmd = "Set-ItemProperty " & ChangePath & " -name LastWriteTime -value " & ChangeTime '③アクセス日時変更.ver cmd = "Set-ItemProperty " & ChangePath & " -name LastAccessTime -value " & ChangeTime RunPowerShell (cmd) MsgBox "ファイル日時の変更が完了しました。" End Sub '----------------------------------------------------------------------------------------------------------- '*********************************************************************************************** '関数名:RunPowerShell '機能 :引数「cmdStr」の文字列をコマンドとしてPowerShellで実行する ' ※実際の処理の流れとしてはコマンドプロンプトでPowerShellを実行 '*********************************************************************************************** Public Function RunPowerShell(ByVal cmdStr As String) Dim wsh As Object Set wsh = CreateObject("Wscript.shell") 'コマンドプロンプトPowerShellを実行 wsh.Run "powershell -ExecutionPolicy RemoteSigned -Command " & cmdStr, 0 '実行コマンド表示(コマンドプロンプトで実行するコマンド) Debug.Print "powershell -ExecutionPolicy RemoteSigned -Command " & cmdStr 'オブジェクト開放 Set wsh = Nothing End Function |
やっていることは非常に単純で、実行させたいコマンドの文字列を作成して、コマンドプロンプト経由でPowerShellにそのコマンドを送り実行させているだけです。
VBAでコマンドプロンプトを操作するには「WshShellオブジェクト」の「Runメソッド」もしくは「Execメソッド」を使います。詳細はVBAでPython(pyファイル)を実行する方法で紹介しているため、興味のある方はチェックしてみてください。
VBAで実行させることができればより視覚的にわかりやすく使うことができます。
例えばExcelシート上に書かれているファイルのパスと日時から一括でファイルの日時を変更させるようなツールを作ることもできますし、UserFormを使うことでPowerShellよりもわかりやすくファイル日時の変更させることができます。
まとめ
今回はVBAとPowerShellを使ってファイルの作成日時/更新日時を変更する方法を紹介しました。
いろいろ書いてきましたが今回の内容をまとめると以下のとおりです。
Set-ItemPropertyの-Nameプロパティで変更するのが作成日時か更新日時かを指定できる
→作成日時の変更:CreationTime →更新日時の変更:LastWriteTime
VBAでPowerShellを実行するにはコマンドプロンプトを間に噛ませる
VBAでコマンドプロンプトを操作するには『WshShellオブジェクト』を使う
コマンドの実行はWshShellオブジェクトの『Execメソッド』『Runメソッド』を使う