エクセルVBAのコード組み立てで、ファイルの保存時に年月日+時刻を付けて管理する方法を紹介いたします。
定期的にファイルデータを更新保存していく場合に特に便利かと思います。
エクセルVBAコードで、ファイルの保存時に名前を付けて保存について、その時の年月日を付けたい時の設定方法についてです。
保存されたファイルがたくさん増えて行く中で、ファイルの判別で年月日を付けている(付けたいと思っている)人も多いでしょう。
こんにちは、じゅんぱ店長(@junpa33)です。

















コンテンツ
エクセルVBA ファイルの保存に
年月日+時刻を付けて管理する方法
ファイルを保存する時に、元ファイル名に日付を付けてデータ更新版として保存したいときが多くあると思います。
その都度時刻を打ち込んで行くのではなく、日時時刻を自動的に保存名に付加されるように仕組んでおくと非常に便利です。
たとえば、元ファイル名「ABC.xlsm」でデータを更新して新たに保存用ファイルを「ABC201227_1123.xlsx」としたい場合を考えます。
ポイントとして3つ
- 「201227」という年月日を生成するコードを作る
- 「1123」という時刻を生成するコードを作る
- 「ABC.xlsm」から「ABC」を取り出すコードを作る
この3つのことが必要になります。
その前に、今回利用する関数について説明します。
年月日や時刻を扱う関数
Date関数
Date関数は、現在のシステムの日付を返します。(バリアント型)
記述方法は
Date・・・引数はありません
表示例は「2020/12/27」
表示方法は色々表示形式を選択することが出来ます。
Time関数
Time関数は、現在のシステムの時刻を返します。(バリアント型)
記述方法は
Time・・・引数はありません
表示例は「11:23:33」
表示方法は色々表示形式を選択することが出来ます。
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を返します。 |
: | 時刻の区切り記号を挿入する位置を指定します。 |
文字列を取り出すときに利用する関数
ファイル名から、拡張子を除いた文字列を取り出すことが必要になります。
今回その時に利用する関数があります。
InStr関数、InStrRev関数
検索対象の文字列の中で、指定した文字列が存在する位置を返します。
記述方法は
InStr(対象文字列, 検索文字列)
例えば InStr(アイウエオ, エ) であれば 4番目の「4」を戻り値として返します
記述方法は
InStrRev(対象文字列, 検索文字列)
例えば InStrRev(アイウエオ, エ) であれば 4番目の「4」を戻り値として返します
要チェック
「InStr関数」は文字列を左から数えて初めて見つけた位置を返します。
「InStrRev関数」は文字列を右から数えて初めて見つけた位置を返します。
例えはこういう場合だと・・・
’前の方の「え」を検索する
Na = InStr("あいうえおおえういあ", "え")
’右から近い方の「え」を検索する
Nb = InStrRev("あいうえおおえういあ", "え")
この場合
「InStr関数」を使った方は「Na = 4」となり
「InStrRev関数」を使った方は「Nb = 7」となります。
Left関数
文字列の左端から、指定した文字数分の文字列を切り取り、値として返します。
記述方法は
Left(文字列,切り取る文字列の長さ )
今回の例題
「VBAmojihizuke.xlsm」というエクセルBOOKにVBAコードを作成します。
この「VBAmojihizuke.xlsm」をデータ更新したとして、保存BOOKを新たに作成して更新内容を更新日付を付けて ”マクロなしBOOK(.xlsx)” で保存します。
ファイル名に日付を付けるのに、「年月日_時刻」のパターンと「年月」のパターンの2種類作成しました。
このコードでは、「InStrRev関数」を使っています。
理由としては、フォルダ操作、ディレクトリなどについてコード化して操作する時に、文字列の中で”¥”記号を基準に文字数を計ることが多いです。
つまりその場合、右から見て一番近い”¥”記号は何番目かという場合に「InStrRev関数」の方が都合がいいという理由からになります。
「Debug.Print」でセットした変数の値を確認できるようにしました。
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
実行結果
年月日+時刻を付けて管理する方法のまとめ
この様にチョッと工夫をしておくと、ファイル保存時の名付けの楽さが大きく違うことになります。
時刻までふかして名付けをしておくと、一度保存したファイルの修正保存が「上書き保存」にならずに、時刻の差で別ファイルとして保存されます。
不用意な上書き保存を防ぐことが出来ます。一度お試しあれ。
「自動で年月日+時刻を付けてファイル保存」
の覚え方、使い方
実際に使ってみると、ファイルの上書き保存になり難い「年月日+時刻」の方が使い勝手がいいのではないでしょうか。
ファイルの修正変更が頻繁なものほど、「最新ファイル名」のものだけ残せばいいと判断できるからです。
このコードを、これから自動保存したいエクセルファイルのVBA標準モジュールに張り付ければOKです。
あとはこの「日付付き名付け」プロシージャーを実行するだけです。
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の独学習得を目指したいなら
エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。
けれども、
出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。
独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。
先人が行った勉強方法をあなたがそのまま利用すればよいということです。
独習のための大切な7つのポイントは、上記記事にて解説しています。
独習によるVBA習得のキーワードは、
出来るだけ多くの実例に触れること!
です。
正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。
ハッキリ言って、
本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、
手っ取り早く短期間習得できるというのは間違いないでしょう。
初めてのVBAの勉強、構えなくても気軽に始められる。

電子書籍版「大村式【動画&テキスト】Excelマクロ&VBA最高のはじめ方」をamazonで見てみる
(著者)大村あつし
(出版社)技術評論社
(税込価格)1,628円(本体1,480円+税)
学習書の新しい形です。
YouTubeと完全リンクした参考書です。入門と基礎を重点的に22本の動画で解説をしています。
ちょっとした空き時間を利用してでもスマホがあれば学習ができます。
動画は優しい語り口調で、視聴者にある意味安心感を与えてくれます。動画は5分から20分間ぐらいで22本の構成です。
文章解説と動画解説の関係性は、動画解説が主で、文章解説がサポートいう使い方もできます。
このサイトでよく使うVBAのコードのトピックを纏めています。
今回の記事はここまでです。 最後までご覧いただき有難うございました。