ファイルの保存に年月日+時刻を付けて管理する

vbamojisousaeyecatch

エクセルVBAのコード組み立てで、ファイルの保存時に年月日+時刻を付けて管理する方法を紹介いたします。

定期的にファイルデータを更新保存していく場合に特に便利かと思います。

エクセルVBAコードで、ファイルの保存時に名前を付けて保存について、その時の年月日を付けたい時の設定方法についてです。

保存されたファイルがたくさん増えて行く中で、ファイルの判別で年月日を付けている(付けたいと思っている)人も多いでしょう。

こんにちは、じゅんぱ店長(@junpa33)です。

ファイルの保存に年月日+時刻を付けて管理する方法

vbamojisousap004

ファイルを保存する時に、元ファイル名に日付を付けてデータ更新版として保存したいときが多くあると思います。

その都度時刻を打ち込んで行くのではなく、日時時刻を自動的に保存名に付加されるように仕組んでおくと非常に便利です。

たとえば、元ファイル名「ABC.xlsm」でデータを更新して新たに保存用ファイルを「ABC201227_1123.xlsx」としたい場合を考えます。

ポイントとして3つ

  1. 「201227」という年月日を生成するコードを作る
  2. 「1123」という時刻を生成するコードを作る
  3. 「ABC.xlsm」から「ABC」を取り出すコードを作る

この3つのことが必要になります。

その前に、今回利用する関数について説明します。

年月日や時刻を扱う関数

Date関数

Date関数は、現在のシステムの日付を返します。(バリアント型)

記述方法は

Date・・・引数はありません

表示例は「2020/12/27」

表示方法は色々表示形式を選択することが出来ます。

vbamojisousa001

Time関数

Time関数は、現在のシステムの時刻を返します。(バリアント型)

記述方法は

Time・・・引数はありません

表示例は「11:23:33」

表示方法は色々表示形式を選択することが出来ます。

vbamojisousa002

Now関数

Now関数は、現在のシステムの日付と時刻を返します。(バリアント型)

記述方法は

Now・・・引数はありません

表示例は「2020/12/27 11:23:33」

Year関数

Year関数は任意の日付から「年」を返します。(バリアント型)

記述方法は

Year(日付)

Month関数

Month関数は任意の日付から「月」を返します。(バリアント型)

記述方法は

Month(日付)

Day関数

Day関数は任意の日付から「月」を返します。(バリアント型)

記述方法は

Day(日付)

指定された書式に変換するFormat関数

Format関数は、データを指定された書式に変換しその結果を返します。(バリアント型)

今回は日付と時刻について書式を指定します。

記述方法は

Format(データ, 書式)

主な書式指定文字は

書式指定文字内容
g年号のアルファベット頭文字を返します。(M、T、S、H、R)
gg年号の先頭の1文字を漢字で返します。(明、大、昭、平、令)
ggg年号を返します。(明治、大正、昭和、平成、令和)
e年号に基づく和暦の年を返します。
ee年号に基づく和暦の年を返します。(2桁表示)
yy西暦の年を下2桁の数値で返します。
yyyy西暦の年を4桁の数値で返します。
m月を表す数値を返します。
mm月を表す数値を返します。(2桁表示)
mmm月の名前を英語の省略形て返します。(Jan~Dec)
mmmm月の名前を英語で返します。(January~December)
oooo月の名前を日本語で返します。(1月~12月)
d日付を返します。
dd日付を返します。(2桁表示)
ddd曜日を英語の省略形で返します。(Sun~Sat)
dddd曜日を英語で返します。(Sunday~Saturday)
aaa曜日を日本語の省略形で返します。(日~土)
aaaa曜日を日本語で返します。(日曜日~土曜日)
h時間を返します。
hh時間を返します。(2桁表示)
n分を返します。
nn分を返します。(2桁表示)
s秒を返します。
ss秒を返します。(2桁表示)
AM/PM時刻が正午以前の場合はAM、正午~午後11時59分の間はPMを返します。
am/pm時刻が正午以前の場合はam、正午~午後11時59分の間はpmを返します。
:時刻の区切り記号を挿入する位置を指定します。
参考記事

Format関数の詳しい使い方についてはこの記事を参考にしてください。

VBAFormateyecatch Format関数は書式設定のテッパン関数!実務の書式と重要5例

文字列を取り出すときに利用する関数

ファイル名から、拡張子を除いた文字列を取り出すことが必要になります。

今回その時に利用する関数があります。

InStr関数、InStrRev関数

検索対象の文字列の中で、指定した文字列が存在する位置を返します。

記述方法は

InStr(対象文字列, 検索文字列)

例えば InStr(アイウエオ, エ) であれば 4番目の「4」を戻り値として返します

記述方法は

InStrRev(対象文字列, 検索文字列)

例えば InStrRev(アイウエオ, エ) であれば 4番目の「4」を戻り値として返します。

要チェック

「InStr関数」は文字列を左から数えて初めて見つけた位置を返します。

「InStrRev関数」は文字列を右から数えて初めて見つけた位置を返します。

例えはこういう場合だと・・・

VBA
’前の方の「え」を検索する
  Na = InStr("あいうおおえういあ", "え")
’右から近い方の「え」を検索する
  Nb = InStrRev("あいうえおおういあ", "え")

この場合

「InStr関数」を使った方は「Na = 4」となり

「InStrRev関数」を使った方は「Nb = 7」となります。

vbainsteeyecatch Instr関数・InstrRev関数は文字列を検索する。ファイルパス取得に威力

Left関数

文字列の左端から、指定した文字数分の文字列を切り取り、値として返します。

記述方法は

Left(文字列,切り取る文字列の長さ )

vbamideyecstch Mid関数・Right関数・Left関数は文字列中の文字を切り出す

今回の例題

「VBAmojihizuke.xlsm」というエクセルBOOKにVBAコードを作成します。

この「VBAmojihizuke.xlsm」をデータ更新したとして、保存BOOKを新たに作成して更新内容を更新日付を付けて ”マクロなしBOOK(.xlsx)” で保存します。

日付を付けた名付け

ファイル名に日付を付けるのに、「年月日_時刻」のパターンと「年月」のパターンの2種類作成しました。

このコードでは、「InStrRev関数」を使っています。

理由としては、フォルダ操作、ディレクトリなどについてコード化して操作する時に、文字列の中で”¥”記号を基準に文字数を計ることが多いです。

つまりその場合、右から見て一番近い”¥”記号は何番目かという場合に「InStrRev関数」の方が都合がいいという理由からになります。

「Debug.Print」でセットした変数の値を確認できるようにしました。

VBA
Sub 日付付き名付け()

 Dim 年月, 年月日, 時刻
 Dim ThisName, NewName, LastName
 Dim MojiCoA As Integer, MojiCoB As Integer
'Format,Year,Month関数を利用します
     年月日 = Format(Date, "yymmdd")
     時刻 = Format(Now, "hhnn")
     年月 = Year(Date) & "_" & Month(Date)
'拡張子なしのファイル名を取得します
     MojiCoA = InStrRev(ThisWorkbook.Name, ".")
'(参考)この文字列の長さは
     MojiCoB = Len(ThisWorkbook.Name)
     ThisName = Left(ThisWorkbook.Name, MojiCoA - 1)
Debug.Print 年月日 & "," & 時刻 & "," & 年月
Debug.Print ThisWorkbook.Path
Debug.Print MojiCoA
Debug.Print MojiCoB
Debug.Print ThisName
'ファイル名を変数へ設定します
     NewName = ThisWorkbook.Path & "\" & ThisName & 年月 & ".xlsx"
     LastName = ThisWorkbook.Path & "\" & ThisName & 年月日 & "_" & 時刻 & ".xlsx"
Debug.Print NewName
Debug.Print LastName
'新しいWorkbookを作成します
     Workbooks.Add
'作成したWorkbookを名前を付けて、移動先フォルダに保存します
     ActiveWorkbook.SaveAs Filename:=NewName
     ActiveWorkbook.SaveAs Filename:=LastName
'このWorkbookを上書き保存します
     ActiveWorkbook.Close savechanges:=True
End Sub
vbamojisousa004

イミディエイトウインドで確認できます。

vbamojisousa003

時刻までファイル名に入れていると、不用意な上書き保存を防げるメリットが大きくなります。

vbaleneyecatch Len関数・LenB関数で文字列の文字数を調べる

年月日+時刻を付けて管理する方法のまとめ

vbamojisousap005

この様にチョッと工夫をしておくと、ファイル保存時の名付けの楽さが大きく違うことになります。

時刻までふかして名付けをしておくと、一度保存したファイルの修正保存が「上書き保存」にならずに、時刻の差で別ファイルとして保存されます。

不用意な上書き保存を防ぐことが出来ます。

「自動で年月日+時刻を付けてファイル保存」
の覚え方、使い方

vbamojisousap006

実際に使ってみると、ファイルの上書き保存になり難い「年月日+時刻」の方が使い勝手がいいのではないでしょうか。

ファイルの修正変更が頻繁なものほど、「最新ファイル名」のものだけ残せばいいと判断できるからです。

このコードを、これから自動保存したいエクセルファイルのVBA標準モジュールに張り付ければOKです。

あとはこの「日付付き名付け」プロシージャーを実行するだけです。

VBA
Sub 日付付き名付け()
    Dim 年月, 年月日, 時刻
    Dim ThisName, LastName
    Dim MojiCoA As Integer
 'Format,Year,Month関数を利用します
        年月日 = Format(Date, "yymmdd")
        時刻 = Format(Now, "hhnn")
        年月 = Year(Date) & "_" & Month(Date)

'拡張子なしのファイル名を取得します
        MojiCoA = InStrRev(ThisWorkbook.Name, ".")
        
        ThisName = Left(ThisWorkbook.Name, MojiCoA - 1)

'ファイル名を変数へ設定します
        LastName = ThisWorkbook.Path & "\" & ThisName & 年月日 & "_" & 時刻 & ".xlsx"
 '新しいWorkbookを作成します
        Workbooks.Add

'作成したWorkbookを名前を付けて、移動先フォルダに保存します
            ActiveWorkbook.SaveAs Filename:=LastName

 'このWorkbookを上書き保存します
        ActiveWorkbook.Close savechanges:=True
End Sub

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。