【VBS】ファイル名への日付追加とファイル移動やコピーを自動化

開発環境を導入できない保守的な会社勤め、且つ、在宅勤務で極力楽をしてさぼりたい、そんな方にとって便利なVBSですが、今回はそのVBSを使ってファイルへの当日日付の自動付与とファイル移動の自動化を行ってみたいと思います。

当日日付の取得方法

まずは、当日日付の取得をします。

今回はyyyymmddの形にしてファイル名に追加しようと思うので、形式の変更も行います。

Now()は現在日時を返すが、FormatDateTime(Now(),2)とすることで日付部分のみに変更できる。

今回は / はいらないのでそれをReplaceで取り除く。

Option Explicit
Dim date
date = FormatDateTime(Now(),2) 'yyyy/mm/dd形式で当日日付を取得
date = Replace(date, "/", "") '/を取除きyyyymmdd形式に変更

ファイル名の変更と移動・コピー

ファイル名の変更と移動又はコピーは一括して行うことができる。

移動の場合には.MoveFile(移動元パス, 移動先パス)、コピーの場合には.CopyFile( 移動元パス, 移動先パス )を使うが、これらで移動先パスを指定する際に変更したファイル名でパスを指定すればよい。

ファイル移動・コピーのパス指定時の注意点

ファイル移動、コピーのパスを指定する際にワイルドカードや変数を用いたいと思うことも少なくないが、移動元ファイルパスにワイルドカードを使った上に、移動先ファイルに変数(上記で取得した当日日付を入れた変数など)を組入れたファイルを指定することはできない。

つまりは、移動先ファイルパスにワイルドカードと移動後ファイルパスに変数を使うといった指定方法はできないので注意されたい。

ワイルドカードの代替手法

上記のような問題点があるが、システムから定期的にランダムな番号を伴ったファイルが毎日レポート作成され、それに対して処理をしたいため、一定ワード+ワイルドカードと同じことをしたいと思うことはある。

それを行うためには下記のようにフォルダ内のファイルからキーワードを含むパスを取得し、そのパスを移動元パスとして利用することで代替ができる。

InStrは文字列を指定した検索開始位置から文字列を検索し、見つけた文字列の位置を返す。
見つからないければ、0を返すため、その性質を使用してFor EachとIf分を回し、初めに見つけたキーワードを含むパスを取得する(下記の場合は取得したパスはFilePathFromに格納)

Dim targetWord, targetFolder, i, FilePathFrom
Dim objFileSys
Set objFileSys = CreateObject("Scripting.FileSystemObject")

tartgetWord ="hoge" 'ファイル名で変更がない部分を指定
targetFolder = "hoge" '検索をかけるフォルダのパス

For Each i In objFileSys.GetFolder(targetFolder).Files
    If InStr(1, i.path, targetWord) > 0 Then
        FilePathFrom = i
        Exit For
    End If
Next    

移動またはコピーの実行

上記で取得したファイルパス(そもそもファイルパスがわかっていればそれを指定)と取得した当日日付を利用してファイル名の変更と移動又はコピーを実行する。

FilePathToに日付を付けたファイル名、パスを指定する。ファイル名は上でtargetWordで指定した固定部分があれば、それに日付を追加する形でいいのではないでしょうか。

コピーなら.CopyFile、移動なら.MoveFileを使う。

Dim FilePathTo
FilePathTo = "hoge_"&date&".拡張子" 'ファイルパスの後ろにアンダーバーと日付をつける。
call objFileSys.CopyFile(FilePathFrom, FilePathTo) '指定ファイルを指定先パスへコピー

call objFileSys.MoveFile(FilePathFrom, FilePathTo) '移動の場合はこちら