
VBA処理でフォルダやファイルを出力するとき、日付や時刻を保存名称にすると管理がしやすいため、「yymmdd_hhmmss」形式で命名するケースがとても多いです。
みなさん、こんにちは。セルネッツ竹本です。
今回は、「フォルダやファイル名の出力名」をテーマに、解説をしたいと思います。
結論から言うと、日付と時刻の名前は「Format(Now, “yymmdd_hhmmss”)」で作り、MkDirステートメントでフォルダを作成します。
作成したフォルダは「CreateObject(“Shell.Application”).Open」の1行で開けます。
この記事では、次のことがわかります。
- Format関数で「yymmdd_hhmmss」形式の名前を作る方法
- MkDirでフォルダを作成し、同じ名前があるときのエラーを防ぐ方法
- 作成したフォルダを自動で開く3つの書き方と、そのまま使える完成形のコード
出力ファイルの管理に
日付付きフォルダへの自動出力で管理が楽に
- 出力したファイルのどれが最新か分からない
- 保存のたびにフォルダを手で作って名前を付ける
- 大量のブックを階層ごとに出力したい
そのお悩み、ファイル出力の自動化で解決できます。Excel専門のシステム開発会社『セルネッツ』なら、日付と時刻の入ったフォルダの自動作成とブック出力をまとめられます。完了時に出力先のフォルダを開く仕組みも作れます。
\Excel専門特化 × 低価格 × スピード対応/
全国対応・お見積もり無料
フォルダ名に日付と時刻を付ける定番の命名ルール
出力先のフォルダ名に作成日時を入れると、いつ出力したものかが名前だけでわかります。
システム仕様によっては、指定された階層フォルダに、大量のExcelブックを順次出力したり、フォルダ内にさらにサブ階層フォルダを作りファイル出力することもあります。
このとき、出力するフォルダ名やファイル名から、特定の情報が一瞬で読み解ける工夫があると、検証性という面でも、運用面でも利便性が高まります。
良くつかう定番の命名は、いつ作成されたコンテンツなのかが時系列で把握できるよう「年月日+時刻」を付与するケースが一般的です。
もちろんコード設計という考え方がありますので、原則、「桁数の統一」が前提となります。
桁数がそろっていれば、エクスプローラーで名前順に並べるだけで、作成した順に並びます。
桁数や区分の決め方は、採番(コード設計)のルールの決め方で詳しく解説しています。
Format関数で「yymmdd_hhmmss」を作る
日付と時刻を、Format関数で決まった桁数の文字列に変換します。
'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
Sub M_日付と時刻変換(P_Get日付, P_Get時刻)
'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
Dim S_yymmdd As String
Dim S_hhmmss As String
S_yymmdd = Format(Date, "yymmdd")
S_hhmmss = Format(Time, "hhmmss")
Debug.Print S_yymmdd
Debug.Print S_hhmmss
Debug.Print S_yymmdd & "_" & S_hhmmss
End Sub
結果は上から順に以下のように得られました。
240624
111258
240624_111258
あとは必要に応じて、運用しやすい名前を決めれば良いと思います。
日付と時刻を1つの名前にするなら、Nowを使って1行で書けます。
DateとTimeを別々に呼ぶと、0時ちょうどをまたいだ瞬間に「前日の日付+翌日の時刻」になることがあります。Nowなら、同じ瞬間の日付と時刻を取り出せます。
Dim フォルダ名 As String
フォルダ名 = Format(Now, "yymmdd_hhmmss") '例:240624_111258
| 書式記号 | 意味 | 例(2024/6/24 11:12:58) |
| yy / yyyy | 年(2桁 / 4桁) | 24 / 2024 |
| mm | 月(2桁) | 06 |
| dd | 日(2桁) | 24 |
| hh | 時(24時間表記・2桁) | 11 |
| nn(hhの直後ならmmも可) | 分(2桁) | 12 |
| ss | 秒(2桁) | 58 |
「mm」は、hhの直後に置くと「分」、それ以外は「月」として扱われます。迷ったら、分は「nn」と書くと確実です。
年をまたいで長く使うフォルダなら、4桁の「yyyymmdd_hhmmss」にしておくと、並び順が崩れません。
MkDirでフォルダを作成する
フォルダの作成は「MkDir フォルダのフルパス」の1行です。ただし、同じ名前のフォルダがあるとエラーになるため、先に存在を確かめます。
Dim 新フォルダ As String
新フォルダ = ThisWorkbook.Path & "\" & Format(Now, "yymmdd_hhmmss")
'// 同じ名前のフォルダが無いときだけ作成する
If Dir(新フォルダ, vbDirectory) = "" Then
MkDir 新フォルダ
End If
- MkDirには、ドライブから始まるフルパスを渡します。フォルダ名だけを渡すと、カレントフォルダ(現在の作業フォルダ)に作られてしまいます
- Dir(パス, vbDirectory)は、フォルダがあればその名前、無ければ空の文字列を返します
- 親フォルダをユーザーに選んでもらう場合は、フォルダ選択ダイアログの使い方と組み合わせます
(参考:Microsoft Learn「MkDir ステートメント」)
作成したフォルダを自動で開く
処理の最後に出力先のフォルダを開いておくと、利用者がフォルダを探す手間がなくなります。
【Point】
特定フォルダ内に新規フォルダを作成する仕様であれば、プログラム処理が完了時に、当該フォルダを開いた状態で完了メッセージを表示すると、毎回、フォルダを開く手間が省けるので、利便性が向上します。
以下の1文記述で、P_指定フォルダがOpenします。
'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
Sub M_フォルダを開く(P_指定フォルダ)
'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
CreateObject("Shell.Application").Open P_指定フォルダ & "\"
End sub
フォルダを開く方法は、ほかにもあります。用途に合わせて選びます。
| 書き方 | 特徴 |
| CreateObject(“Shell.Application”).Open パス | 1行で書ける。パスにスペースがあっても、そのまま渡せる |
| Shell “explorer.exe “”” & パス & “”””, vbNormalFocus | エクスプローラーを直接起動する。スペースを含むパスは「”」で囲む必要がある |
| ThisWorkbook.FollowHyperlink パス | Excelのハイパーリンクとして開く。Excel以外のVBAでは使えない |
作成から開くまでをまとめた完成形のコード
ここまでの処理を1つにまとめると、次のようになります。ブックと同じ場所に日時名のフォルダを作り、完了したら開きます。
Sub M_日時フォルダを作成して開く()
Dim 新フォルダ As String
'// ブックと同じ場所に「yymmdd_hhmmss」のフォルダ名を作る
新フォルダ = ThisWorkbook.Path & "\" & Format(Now, "yymmdd_hhmmss")
'// 同じ名前のフォルダが無いときだけ作成する
If Dir(新フォルダ, vbDirectory) = "" Then
MkDir 新フォルダ
End If
'// (ここに、ブックやファイルを出力する処理を書く)
'// 出力先のフォルダを開いて、完了メッセージを出す
CreateObject("Shell.Application").Open 新フォルダ & "\"
MsgBox "出力が完了しました。" & vbCrLf & 新フォルダ
End Sub
フォルダ作成でつまずきやすい注意点
MkDirは失敗するとエラーで止まります。よくある原因は次のとおりです。
| 起きること | 原因 | 対策 |
| エラー75「パス名/ファイル名が無効です」 | 同じ名前のフォルダがすでにある(同じ秒に2回実行した場合など) | Dirで存在を確かめる。続けて実行するなら秒の後ろに連番を付ける |
| エラー76「パスが見つかりません」 | 親フォルダが存在しない | 親フォルダから1階層ずつ作る |
| 名前が正しく作れない | 「/」「:」などフォルダ名に使えない文字が入っている | Format(Now)をそのまま使わず、”yymmdd_hhmmss”のように書式を指定する |
| OneDrive上のブックでエラーになる | ThisWorkbook.Pathが「https://〜」のURLになる | ローカルのパスに変換してから使う |
OneDriveのパスがURLになる原因と変換の方法は、OneDrive上のフォルダ指定でPATHがhttpに変わる対策で解説しています。
(参考:Microsoft Learn「トラップ可能なエラー」)
よくある質問
Q. 「2024\06\24」のような階層フォルダを一度に作れますか?
MkDirは1回で1階層しか作れません。親フォルダが無いとエラー76になるため、上の階層から順に、無ければ作る処理を繰り返します。
不要になったフォルダを消す処理は、指定したフォルダを削除する方法で紹介しています。
Q. FileSystemObjectのCreateFolderとの違いは?
どちらも1階層ずつ作る点は同じです。CreateFolderは、存在確認のFolderExistsとセットで使えるのが利点です。
同じ名前があるときは、CreateFolderではエラー58「既に同名のファイルが存在しています」になります。
Q. ファイル名にも日付と時刻を付けられますか?
付けられます。「”売上_” & Format(Now, “yymmdd_hhmmss”) & “.xlsx”」のように、名前の一部として連結します。
フルパスからフォルダ名とファイル名を取り出す方法は、フルパスをフォルダとファイル名に分割する方法をご覧ください。
まとめ|日時の名前でフォルダを作り、完了時に開く
今回のテーマは、「フォルダやファイル名の出力名」について、解説を行いました。
- 名前は Format(Now, “yymmdd_hhmmss”) で、桁数をそろえて作る
- MkDirの前に Dir(パス, vbDirectory) で存在を確かめる
- 処理の最後に Shell.Application でフォルダを開くと、利用者の手間が減る
本記事が、Excel実務の効率化において、ご参考お役立てになれば幸いです。
相見積もり歓迎
ブックの一括出力ツール、費用の目安をご提示
- データ変換は8万円〜(税別・基本料金込み)
- 複数フォーマット変換は20万円〜
- 命名ルールなど運用面の相談も60分無料
ブックを分けて出力するツールは、データ変換8万円〜、出力形式が複数なら複数フォーマット変換20万円〜が参考価格です(税別・基本料金込み)。相見積もりも歓迎です。Excelに向かない場合は正直にお伝えします。
\Excel専門特化 × 低価格 × スピード対応/
全国対応・お見積もり無料
Excel業務改善事例ショート動画
文章だけでは伝わりにくい改善事例を、ショート動画でご覧いただけます。
◆よくある質問 ◆Excel業務改善の実例 ◆VBA・マクロ活用事例
