エクセルVBAのコード組み立てで、ファイルの保存時に年月日+時刻を付けて管理する方法を紹介いたします。
定期的にファイルデータを更新保存していく場合に特に便利かと思います。
エクセルVBAコードで、ファイルの保存時に名前を付けて保存について、その時の年月日を付けたい時の設定方法についてです。
保存されたファイルがたくさん増えて行く中で、ファイルの判別で年月日を付けている(付けたいと思っている)人も多いでしょう。
こんにちは、じゅんぱ店長(@junpa33)です。
- ブックの知識
- ブックの操作
- ワークブックを開くOpenメソッドの書き方 Excelマクロ
- VBA ブック名の取得法4つの解決策を詳しく解説
- VBA 開く,保存,閉じる,作成,削除 ブックの存在確認後のコード記述
- ファイルの保存に年月日+時刻を付けて管理する
- VBA 保存先フォルダをダイアログ指定で変数化
- 新規ブック5つの保存法。AddとSaveAsの使い方がわかる
- セル値を使いブック名として保存。統一フォームに有用
- VBA シートをブックから切り出し名付け保存する
- ブック名に作成者名を付加。 プロパティ変更とファイル保存
- 不要フォルダを削除する2種類のコードの作成
- 要らないファイルを自動削除するコードの作成
- ワークブックを閉じる12のパターン使い分け 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」となります。
Instr関数・InstrRev関数は文字列を検索する。ファイルパス取得に威力Left関数
文字列の左端から、指定した文字数分の文字列を切り取り、値として返します。
記述方法は
Left(文字列,切り取る文字列の長さ )
Mid関数・Right関数・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
イミディエイトウインドで確認できます。
時刻までファイル名に入れていると、不用意な上書き保存を防げるメリットが大きくなります。
Len関数・LenB関数で文字列の文字数を調べる年月日+時刻を付けて管理する方法のまとめ
この様にチョッと工夫をしておくと、ファイル保存時の名付けの楽さが大きく違うことになります。
時刻までふかして名付けをしておくと、一度保存したファイルの修正保存が「上書き保存」にならずに、時刻の差で別ファイルとして保存されます。
不用意な上書き保存を防ぐことが出来ます。
「自動で年月日+時刻を付けてファイル保存」
の覚え方、使い方
実際に使ってみると、ファイルの上書き保存になり難い「年月日+時刻」の方が使い勝手がいいのではないでしょうか。
ファイルの修正変更が頻繁なものほど、「最新ファイル名」のものだけ残せばいいと判断できるからです。
このコードを、これから自動保存したいエクセルファイルの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の独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。