使いやすいマクロにグレードアップ!
前回は基本的なデータ転記ツールのつくり方を説明しました。
今回はそのマクロをさらにパワーアップさせて、つかいやすいツールに進化させていきます。
特に注目するのは、「日付を含むファイル名での保存」機能です。

これは多くの方が必要としている機能ですよね。
例えば「報告書_20240412.xlsx」のように、ファイル名に日付を自動的に付けることで、管理がしやすくなります。
日付処理の基本
まずは日付処理の基本から見ていきましょう。
1. 現在の日付を取得する
日付や時間を取得するときにつかわれる関数を見ていきます。
2024/04/12 のような形式で取得する
‘ 現在の日付を取得
Dim 今日 As Date
今日 = Date
2024/04/12 10:30:45 のような形式で取得する
‘ 現在の日時を取得(時間も含む)
Dim 現在 As Date
現在 = Now
2. 日付の表示形式を整える(Format関数)
Format関数をつかうと、いろんな形式の表示ができるようになります。
“20240412” のような形式にする
‘ 年月日をYYYYMMDD形式にする
Dim 日付文字列 As String
日付文字列 = Format(Date, “yyyymmdd”)
“2024/04/12” のような形式にする
‘ スラッシュ区切りの年月日にする
日付文字列 = Format(Date, “yyyy/mm/dd”)
“2024年04月12日(金)” のような形式にする
‘ 年月日と曜日を表示
日付文字列 = Format(Date, “yyyy年mm月dd日(aaa)”)
Format関数では、以下のような書式を組み合わせてつかうことができます。
✔ Format関数でつかわれる書式
yyyy: 4桁の年
yy: 2桁の年
mm: 2桁の月
m: 1桁または2桁の月
dd: 2桁の日
d: 1桁または2桁の日
aaa: 曜日の省略形
hh: 2桁の時間(24時間形式)
nn: 2桁の分
ss: 2桁の秒
3. 日付の計算
続いて、さまざまな日付を計算するマクロをご紹介します。
1週間後の日付を計算
‘ 1週間後の日付を計算
Dim 来週 As Date
来週 = Date + 7
先月の同日を計算
‘ 先月の同日を計算
Dim 先月 As Date
先月 = DateAdd(“m”, –1, Date)
年度の開始日を計算
‘ 年度の開始日を計算(例:4月1日が年度開始の場合)
Dim 年度開始日 As Date
If Month(Date) < 4 Then
‘ 前年の4月1日
年度開始日 = DateSerial(Year(Date) – 1, 4, 1)
Else
‘ 当年の4月1日
年度開始日 = DateSerial(Year(Date), 4, 1)
End If
これらの基本的な日付処理を理解しておくと、いろんな状況で応用できます。
ファイル操作の基本
次に、ファイルの保存や操作につかわれる基本的なVBAコードを見ていきましょう。
1. ファイルを保存する
ファイルを名前をつけて保存するコードをご紹介します。
現在のブックを別名で保存
‘ 現在のブックを別名で保存
ThisWorkbook.SaveAs Filename:=“C:\Reports\報告書.xlsx”
日付付きのファイル名で保存
‘ 日付付きのファイル名で保存
Dim ファイル名 As String
ファイル名 = “C:\Reports\報告書_” & Format(Date, “yyyymmdd”) & “.xlsx”
ThisWorkbook.SaveAs Filename:=ファイル名
2. ファイルが存在するか確認する
‘ ファイルが存在するか確認
Dim ファイルパス As String
ファイルパス = “C:\Reports\報告書.xlsx”
If Dir(ファイルパス) <> “” Then
‘ ファイルが存在する場合の処理
MsgBox “ファイルが存在します。”
Else
‘ ファイルが存在しない場合の処理
MsgBox “ファイルが存在しません。”
End If
‘ ファイルが存在する場合の処理
MsgBox “ファイルが存在します。”
Else
‘ ファイルが存在しない場合の処理
MsgBox “ファイルが存在しません。”
End If
3. 保存先フォルダを選択するダイアログを表示する
‘ フォルダ選択ダイアログを表示
Dim フォルダ選択 As FileDialog
Dim 選択フォルダ As String
Set フォルダ選択 = Application.FileDialog(msoFileDialogFolderPicker)
フォルダ選択.Title = “保存先フォルダを選択してください”
If フォルダ選択.Show = True Then
選択フォルダ = フォルダ選択.SelectedItems(1)
‘ 選択されたフォルダに保存
ThisWorkbook.SaveAs 選択フォルダ & “\報告書.xlsx”
Else
‘ キャンセルされた場合
MsgBox “フォルダが選択されませんでした。”
End If
フォルダ選択.Title = “保存先フォルダを選択してください”
選択フォルダ = フォルダ選択.SelectedItems(1)
‘ 選択されたフォルダに保存
ThisWorkbook.SaveAs 選択フォルダ & “\報告書.xlsx”
Else
‘ キャンセルされた場合
MsgBox “フォルダが選択されませんでした。”
End If
これらの基本的なファイル操作を組み合わせることで、いろんなシナリオに対応できます。
エラーハンドリングの基本
マクロを実用的にするには、エラー処理が欠かせません。
ファイルの保存や操作時に発生する可能性のあるエラーに適切に対処しましょう。
1. 基本的なエラーハンドリング構文
エラーハンドリングを設定
‘ エラーハンドリングの設定
On Error GoTo エラー処理
エラーが発生する可能性がある処理
‘ 通常の処理
Workbooks.Open “存在しないファイル.xlsx”
正常に終わった場合の処理
‘ 正常終了時の処理
MsgBox “処理が完了しました。”
Exit Sub
正常に終わらなかった場合の処理
エラー処理:
‘ エラー発生時の処理
MsgBox “エラーが発生しました: “ & Err.Description, vbCritical
End Sub
これらのコードを組み合わせておけば、うまく終わったときと、エラーが生じたときとで、それぞれメッセージが表示されるようになります。
2. 特定のエラーに対する処理
Sub 特定エラー処理例()
On Error Resume Next ‘ エラーを無視して次の行へ
Workbooks.Open “C:\存在しないファイル.xlsx”
‘ エラーコードをチェック
If Err.Number = 1004 Then
‘ ファイルが見つからない場合
MsgBox “指定されたファイルが見つかりません。”, vbExclamation
ElseIf Err.Number <> 0 Then
‘ その他のエラー
MsgBox “エラーが発生しました: “ & Err.Description, vbCritical
End If
‘ エラーハンドリングをリセット
On Error GoTo 0
End Sub
3. エラーの再開
Sub エラー再開例()
On Error GoTo エラー処理
‘ 通常の処理
‘ …
Exit Sub
エラー処理:
Select Case Err.Number
Case 1004
‘ 特定のエラー処理
MsgBox “ファイルが見つかりません。”, vbExclamation
Resume Next ‘ エラーが発生した次の行から処理を再開
Case Else
‘ その他のエラー
MsgBox “エラーが発生しました: “ & Err.Number & ” – “ & Err.Description, vbCritical
Exit Sub ‘ 処理を終了
End Select
End Sub
これらのエラーハンドリング技術を使うことで、マクロをより堅牢にし、ユーザーにとって使いやすいものにできます。
実践例:データ転記と日付付きファイル名での保存
では、前回作成したデータ転記マクロを拡張して、転記後に日付付きのファイル名で保存する機能を追加してみましょう。
Sub 転記して日付付きで保存()
‘ 変数の宣言
Dim ソースブック As Workbook
Dim 転記先ブック As Workbook
Dim ソースシート As Worksheet
Dim 転記先シート As Worksheet
Dim 検索ID As String
Dim 検索範囲 As Range
Dim 検索結果 As Range
Dim 保存フォルダ As String
Dim ファイル名 As String
Dim フォルダ選択 As FileDialog
‘ エラーハンドリング
On Error GoTo エラー処理
‘ 現在のブックを転記先として設定
Set 転記先ブック = ThisWorkbook
Set 転記先シート = 転記先ブック.ActiveSheet
‘ 検索するIDを取得
検索ID = 転記先シート.Range(“A2”).Value
‘ IDが空白の場合はメッセージを表示して終了
If 検索ID = “” Then
MsgBox “検索するIDを入力してください。”, vbExclamation
Exit Sub
End If
‘ ソースファイルを開く
Set ソースブック = Workbooks.Open(“C:\データ\顧客リスト.xlsx”)
Set ソースシート = ソースブック.Sheets(“Sheet1”)
‘ A列を検索範囲として設定
Set 検索範囲 = ソースシート.Range(“A:A”)
‘ IDを検索
Set 検索結果 = 検索範囲.Find(What:=検索ID, LookIn:=xlValues, LookAt:=xlWhole)
‘ 検索結果に基づいて処理
If 検索結果 Is Nothing Then
‘ 見つからなかった場合
MsgBox “該当する顧客情報が見つかりません。”, vbExclamation
ソースブック.Close SaveChanges:=False
Exit Sub
Else
‘ 見つかった場合、データを転記
転記先シート.Range(“B5”).Value = ソースシート.Cells(検索結果.Row, 2).Value ‘ 顧客名
転記先シート.Range(“B6”).Value = ソースシート.Cells(検索結果.Row, 3).Value ‘ 電話番号
転記先シート.Range(“B7”).Value = ソースシート.Cells(検索結果.Row, 4).Value ‘ メールアドレス
転記先シート.Range(“B8”).Value = ソースシート.Cells(検索結果.Row, 5).Value ‘ 最終取引日
‘ 処理日として今日の日付を挿入
転記先シート.Range(“B9”).Value = Format(Date, “yyyy年mm月dd日”)
End If
‘ ソースファイルを閉じる
ソースブック.Close SaveChanges:=False
‘ フォルダ選択ダイアログを表示
Set フォルダ選択 = Application.FileDialog(msoFileDialogFolderPicker)
フォルダ選択.Title = “保存先フォルダを選択してください”
If フォルダ選択.Show = True Then
保存フォルダ = フォルダ選択.SelectedItems(1)
‘ 日付付きのファイル名を作成
ファイル名 = 保存フォルダ & “\顧客情報_” & 検索ID & “_” & Format(Date, “yyyymmdd”) & “.xlsx”
‘ ファイルが既に存在するか確認
If Dir(ファイル名) <> “” Then
‘ 上書き確認
If MsgBox(“同名のファイルが既に存在します。上書きしますか?”, vbQuestion + vbYesNo) = vbNo Then
‘ 「いいえ」の場合は処理を中断
MsgBox “保存をキャンセルしました。”, vbInformation
Exit Sub
End If
End If
‘ 名前を付けて保存
Application.DisplayAlerts = False ‘ 確認メッセージを非表示
転記先ブック.SaveCopyAs ファイル名
Application.DisplayAlerts = True ‘ 確認メッセージを表示に戻す
MsgBox “データ転記と保存が完了しました。” & vbCrLf & _
“保存先: “ & ファイル名, vbInformation
Else
‘ フォルダ選択がキャンセルされた場合
MsgBox “フォルダが選択されなかったため、保存はキャンセルされました。”, vbInformation
End If
Exit Sub
エラー処理:
‘ エラー情報の表示
MsgBox “エラーが発生しました: “ & vbCrLf & _
“エラー番号: “ & Err.Number & vbCrLf & _
“内容: “ & Err.Description, vbCritical
‘ 開いたブックがあれば閉じる
On Error Resume Next
If Not ソースブック Is Nothing Then
ソースブック.Close SaveChanges:=False
End If
‘ エラーハンドリングをリセット
On Error GoTo 0
End Sub
このコードでは、前回のデータ転記マクロに以下の機能を追加しています。
✔ 前回のコードに追加した機能
・ 処理日として今日の日付を挿入
・ フォルダ選択ダイアログでの保存先指定
・ 顧客IDと日付を含むファイル名での保存
・ 同名ファイルの上書き確認
・ 詳細なエラーハンドリング
コードのカスタマイズ例
上記のコードをベースに、いくつかのカスタマイズ例を紹介します:
1. 定型フォルダに保存する場合
保存するフォルダが決まっている場合
‘ フォルダ選択ダイアログの代わりに固定フォルダを使用
保存フォルダ = “C:\顧客情報\保存先”
保存するフォルダが無かったときは新しくつくる場合
‘ フォルダが存在するか確認
If Dir(保存フォルダ, vbDirectory) = “” Then
‘ フォルダが存在しない場合は作成
MkDir 保存フォルダ
End If
日付のついたファイル名をつくる
‘ 日付付きのファイル名を作成
ファイル名 = 保存フォルダ & “\顧客情報_” & 検索ID & “_” & Format(Date, “yyyymmdd”) & “.xlsx”
2. 日付の形式をカスタマイズ
和暦で日付を表示したい場合
‘ 和暦で表示
転記先シート.Range(“B9”).Value = Format(Date, “ggyy年mm月dd日”) ‘ 令和06年04月12日 など
曜日をつけて日付を表示したい場合
‘ 曜日付きで表示
転記先シート.Range(“B9”).Value = Format(Date, “yyyy年mm月dd日(aaa)”) ‘ 2024年04月12日(金) など
曜日を、月などと表示したいときはaaa、月曜日などと表示したいときはaaaaとします。
日付を短く表示したい場合
‘ ファイル名に使用する日付形式の変更
ファイル名 = 保存フォルダ & “\顧客情報_” & 検索ID & “_” & Format(Date, “yymmdd”) & “.xlsx” ‘ 240412など
3. 保存前にプレビュー表示
保存前に印刷プレビューを表示する場合は以下のようなコードとなります。
‘ 保存前にプレビュー表示
転記先シート.PrintPreview
‘ ユーザーの確認を得る
If MsgBox(“この内容で保存しますか?”, vbQuestion + vbYesNo) = vbYes Then
‘ 「はい」の場合のみ保存処理
転記先ブック.SaveCopyAs ファイル名
MsgBox “保存が完了しました。”, vbInformation
Else
MsgBox “保存がキャンセルされました。”, vbInformation
End If
ボタンからマクロを実行する設定
マクロをより使いやすくするために、ボタンからワンクリックで実行できるようにしましょう。
1. ボタンの追加
✔ ボタン追加の手順
1 「開発」タブをクリック
2 「挿入」グループの「ボタン」(フォームコントロール)をクリック
3 シート上でドラッグしてボタンを配置
4 「マクロの割り当て」ダイアログで実行したいマクロを選択
5 ボタンのテキストを変更(例:「顧客情報を転記して保存」)
2. 既存のボタンにマクロを割り当てる
✔ すでにボタンがある場合の手順
1 ボタンを右クリック
2 「マクロの割り当て」を選択
3 実行したいマクロを選択
4 「OK」をクリック
3. 図形をボタンとして使用する
✔ ボタンの見た目をカスタマイズする手順
1 「挿入」タブの「図形」から好みの図形を選択して配置
2 図形を右クリック
3 「マクロの割り当て」を選択
4 実行したいマクロを選択
5 「OK」をクリック
図形には色や影などの書式設定を加えることができ、見た目の良いボタンを作成できます。
マクロ実行時の高速化
大量のデータを処理する場合、マクロの実行速度を向上させるテクニックを紹介します。
Sub 高速化テクニック()
‘ 画面更新を停止
Application.ScreenUpdating = False
‘ 自動計算を手動に変更
Application.Calculation = xlCalculationManual
‘ イベントを無効化
Application.EnableEvents = False
‘ 処理内容
‘ …(データ処理などの処理を実行)…
‘ 設定を元に戻す
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
これらの設定により、特に大量のデータを処理する場合に処理速度が大幅に向上します。

ただし、必ず最後に設定を元に戻すことが重要です。
実習:転記マクロの拡張
ここまでの内容を踏まえて、以下の実習に挑戦してみましょう:
課題:前回作成した転記マクロに以下の機能を追加する
処理日として今日の日付をシートに挿入
ユーザーが選択したフォルダに、日付付きのファイル名で保存
ボタンからマクロを実行できるように設定
エラーハンドリングを追加して堅牢性を向上
以下のテンプレートを参考に、ChatGPTで必要なコードを生成してみましょう:
Excelマクロをカスタマイズしたいです。以前作成した顧客情報転記マクロに、
以下の機能を追加したいです:
1. 転記先のC10セルに処理日として今日の日付を「YYYY年MM月DD日」形式で挿入
2. 転記処理後、ユーザーがフォルダを選択できるダイアログを表示
3. 選択したフォルダに「顧客情報_[顧客ID]_YYYYMMDD.xlsx」の形式でファイルを保存
4. 同名のファイルが存在する場合は上書き確認
5. 処理中にエラーが発生した場合の適切なエラーハンドリング
また、このマクロをシート上のボタンから実行できるようにする方法も教えてください。
ChatGPTにこのような形で指示を出すことで、必要なコードを生成してもらうことができます。
生成されたコードを理解し、必要に応じて調整しましょう。
まとめ
今回は、データ転記マクロを拡張して、より実用的なツールにするための方法を学びました。
日付処理の基本(Date、Now、Format関数など)
ファイル操作の基本(SaveAs、Dir、FileDialogなど)
エラーハンドリングの基本(On Error GoTo、Resume Nextなど)
実践例として、データ転記マクロに日付付きファイル名での保存機能を追加
ボタンからマクロを実行する設定方法
マクロ実行時の高速化テクニック
これらの知識を組み合わせることで、より使いやすく、堅牢なExcelツールを作成できるようになります。
次回は「トラブルシューティング編:マクロエラーの解決方法」として、マクロ実行時によく発生するエラーの種類や原因、解決方法について詳しく解説します。
様々なエラーメッセージの意味や、デバッグの基本テクニックも学びます。
(おまけ)練習問題
今回の内容を復習するために、以下の練習問題にチャレンジしてみてください。
転記マクロに「週報」「月報」「四半期報」などのレポートタイプを選択できる機能を追加し、選択に応じてファイル名に含めるようにしてみましょう。
保存前に、転記された情報が正しいかどうかを確認するメッセージボックスを表示する機能を追加してみましょう。
前月、今月、来月の日付を計算して表示する機能を追加してみましょう。
ChatGPTに、自分の業務に合わせたファイル名の自動生成ロジックを考えてもらい、実装してみましょう。
コメント