【VBA SaveAs】保存先を自動指定!ファイル名入力の手間をゼロにする方法とは

【VBA】SaveAsを活用した時短テクニック!「名前を付けて保存」処理の実践術3選

 

毎回エクセルを保存するとき、「日付+担当者名+書類の内容」というファイル名を手で入力していませんか。

 

1回2回なら大した手間ではないかもしれませんが、毎日のルーティーン作業として繰り返していると、そのちょっとした作業が積み重なって大きな時間のロスにつながります。

 

私がマクロ開発を受注した案件の中でも、「保存操作の自動化」というご依頼は非常に多く、「なんでこんな単純な作業に毎回時間を取られるんだろう」と感じている方がいかに多いか、ということを実感しています。

 

そこで今回は、VBAのSaveAsメソッドを使って、保存先フォルダの指定・ファイル名の自動生成・ボタン1クリックで保存完了という一連の操作を完全自動化する方法を解説します。

プログラミング初心者の方でも理解できるよう、実際に使えるサンプルコードとあわせて丁寧に解説していくので、ぜひ最後まで読んでみてください。

 

広告

手作業の「名前を付けて保存」が引き起こす3つの問題

VBAによる自動化を検討する前に、まずは手作業でファイルを保存するときに起きがちな問題を整理しておきましょう。

この問題を把握しておくことで、SaveAsを使った自動化がいかに強力な解決策になるかがよくわかります。

 

問題①:ファイル名の入力ミスやバラつきが起きる

「日付+担当者名+内容」という命名ルールがあっても、手で入力すると日付フォーマットが「2024-03-18」だったり「20240318」だったりとバラバラになりがちです。

特に複数の担当者が同じルールでファイルを保存している場合、人によって微妙に表記が違ってしまい、ファイルを探すときに混乱する原因になります。

 

私が受注したあるマクロ開発案件でも、「担当者ごとにファイル名のフォーマットが統一されておらず、過去ファイルの検索に時間がかかる」というご相談をいただきました。

VBAを使えば、日付は自動で今日の日付を取得し、担当者名はセルから読み込むという仕組みにできるため、ファイル名のバラつきをゼロにすることが可能です。

 

問題②:保存先フォルダを毎回手で探している

「請求書は◯◯フォルダの中の△△フォルダに保存」という決まりがある場合、毎回ダイアログボックスを開いてフォルダを辿っていく作業は地味に時間がかかります。

 

フォルダの階層が深ければ深いほど、この手間は大きくなるもの。

SaveAsメソッドで保存先パスをあらかじめ指定しておけば、ダイアログボックスを開く必要すらなく、指定したフォルダにそのまま保存することができます。

担当者ごとに異なるフォルダに保存するような仕組みも、セルの値を読み込んでパスを動的に組み立てることで簡単に実装できます。

 

問題③:上書き保存と別名保存を間違えるリスクがある

急いでいるときに「Ctrl+S」で上書き保存してしまい、元のデータを消してしまうことがある。

 

「今日の日付で新しいファイルとして保存したかったのに、元ファイルを上書きしてしまった」というミスは、手作業では意外とよく起きます。

VBAのSaveAsを使えば、常に新しいファイル名で別名保存するという動作を徹底できるため、このようなヒューマンエラーを防ぐことができます。

マクロを実行するだけで確実に正しいファイル名・正しいフォルダに保存されるという安心感は、実際に導入した方からも非常に好評をいただいています。

 

VBA SaveAsの基本|まずはシンプルなコードで理解する

SaveAsメソッドの基本構文はとてもシンプルです。

「どのファイルを」「どこに」「どんな名前で」保存するかをコードに書くだけで、自動保存が実現します。

まずはシンプルなサンプルコードで基本的な使い方を確認していきましょう。

 

SaveAsの基本構文と最もシンプルなコード

SaveAsメソッドの基本的な書き方は以下のとおりです。

【基本構文】

Workbook.SaveAs Filename:=保存先フルパス, FileFormat:=ファイル形式

 

【サンプルコード①:シンプルな名前を付けて保存】

Sub 名前をつけて保存_基本()

Dim savePath As String

'保存先フルパス(フォルダパス+ファイル名)を変数に格納
savePath = "C:\Users\ユーザー名\Documents\" & "テスト保存.xlsx"

'名前を付けて保存(xlsx形式)
ThisWorkbook.SaveAs Filename:=savePath, FileFormat:=xlOpenXMLWorkbook

MsgBox "保存が完了しました。", vbInformation

End Sub

コードの流れを解説します。

 

savePath という変数に「保存先フォルダのパス+ファイル名」をつなげた文字列を格納しています。

ThisWorkbook.SaveAs でこのエクセルファイル自身を指定したパスに保存するよう命令しています。

 

FileFormat:=xlOpenXMLWorkbook は「.xlsx形式で保存する」という意味の引数です。

マクロを含むファイルを保存したい場合は xlOpenXMLWorkbookMacroEnabled(.xlsm形式)に変更してください。

 

今日の日付を自動でファイル名に組み込むVBA

実務でよく使われるのが、「今日の日付を自動でファイル名に組み込む」という方法です。

毎回手で日付を入力する手間がなくなり、ファイル名のフォーマットも統一されるため、後からファイルを探すときにも非常に便利です。

 

【サンプルコード②:今日の日付をファイル名に自動入力】

Sub 日付付きファイル名で保存()

Dim savePath As String
Dim fileName As String
Dim today As String

'今日の日付を「yyyymmdd」形式で取得
today = Format(Date, "yyyymmdd")

'ファイル名を組み立てる(例:20240318_請求書.xlsx)
fileName = today & "_請求書.xlsx"

'保存先フォルダ+ファイル名を結合
savePath = "C:\Users\ユーザー名\Documents\請求書フォルダ\" & fileName
ThisWorkbook.SaveAs Filename:=savePath, FileFormat:=xlOpenXMLWorkbook

MsgBox fileName & " として保存しました。", vbInformation

End Sub

コードの流れを解説します。

 

Format(Date, “yyyymmdd") でシステムの今日の日付を「20240318」のような8桁の数字に変換しています。

Format関数の第2引数を “yyyy-mm-dd" にすれば「2024-03-18」というハイフン区切りのフォーマットにも変更可能です。

 

fileName = today & “_請求書.xlsx" で日付文字列とファイル名を「&」演算子でつなぎ合わせて1つの文字列にしています。

あとはこの fileName を保存先フォルダのパスに結合するだけで、毎回自動的に日付が入ったファイル名で保存することができます。

 

SaveAsの保存先をセルの値から自動で指定するVBA

さらに実務に役立つのが、「セルに入力されている値をファイル名や保存先パスに使う」という方法です。

担当者名や取引先名など、毎回変わる情報をセルから読み込むことで、ボタン1クリックで完全に自動化された保存処理が実現します。

 

担当者名をセルから読み込んで保存先を自動振り分けするVBA

たとえば、A1セルに担当者名が入力されている場合、その担当者名に応じたフォルダに自動保存する仕組みをVBAで作ることができます。

私が実際に受注したマクロ開発案件では、「担当者ごとに別々のフォルダへ自動保存したい」というご依頼があり、以下のようなコードで解決しました。

 

【サンプルコード③:担当者フォルダへ自動振り分け保存】

Sub 担当者フォルダへ自動保存()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")

'担当者名をA1セルから取得
Dim tantousha As String
tantousha = ws.Range("A1").Value

'担当者名が空白の場合はエラーメッセージを出して処理を終了
If tantousha = "" Then
MsgBox "A1セルに担当者名を入力してください。", vbExclamation
Exit Sub
End If

'今日の日付を取得
Dim today As String
today = Format(Date, "yyyymmdd")

'保存先フォルダパスを担当者名から組み立てる
Dim folderPath As String
folderPath = "C:\Users\共有フォルダ\担当者別\" & tantousha & "\"

'フォルダが存在しない場合は自動作成
If Dir(folderPath, vbDirectory) = "" Then
MkDir folderPath
End If

'ファイル名を組み立てる
Dim fileName As String
fileName = today & "_" & tantousha & "_請求書.xlsx"

'保存実行
ThisWorkbook.SaveAs Filename:=folderPath & fileName, FileFormat:=xlOpenXMLWorkbook

MsgBox tantousha & "さんのフォルダに保存しました。" & Chr(13) & _
"ファイル名:" & fileName, vbInformation

End Sub

コードの流れを解説します。

 

ws.Range(“A1").Value でSheet1のA1セルに入力されている担当者名を読み込んでいます。

担当者名が空白のままマクロを実行するとエラーになるため、If tantousha = “" Then でチェックを入れてメッセージを出力。

 

folderPath = “C:\Users\共有フォルダ\担当者別\" & tantousha & “\" で担当者名を使ったフォルダパスを動的に組み立てています。

Dir(folderPath, vbDirectory) = “" の部分は「このフォルダが存在しなければ」という意味の条件分岐で、フォルダがなければMkDirで自動作成しています。

これにより、新しい担当者が加わったとしても、コードを修正することなくそのまま使い続けることができます。

 

ファイル検索をするためのDir関数については、関連記事「Dir関数の使い方」で詳しく解説しています。

 

 

複数の保存先に同時保存するVBA

「バックアップとして2か所に同時保存したい」「社内サーバーとローカルの両方に保存したい」という場合は、SaveAsを2回実行するだけで対応できます。

 

【サンプルコード④:2か所に同時保存】

Sub 二か所に同時保存()

Dim today As String
today = Format(Date, "yyyymmdd")

Dim fileName As String
fileName = today & "_業務報告書.xlsx"

'保存先①:ローカルフォルダ
Dim path1 As String
path1 = "C:\Users\ユーザー名\Documents\業務報告書\" & fileName

'保存先②:社内共有サーバー
Dim path2 As String
path2 = "\\サーバー名\共有フォルダ\業務報告書\" & fileName

'1か所目に保存
ThisWorkbook.SaveAs Filename:=path1, FileFormat:=xlOpenXMLWorkbook

'2か所目に保存(SaveCopyAsを使うと元ファイルの保存先が変わらない)
ThisWorkbook.SaveCopyAs Filename:=path2

MsgBox "2か所への保存が完了しました。", vbInformation

End Sub

コードの流れを解説します。

 

1か所目への保存はSaveAsで実行。2か所目への保存にはSaveCopyAsを使っています。

SaveCopyAsは「コピーを別名で保存する」というメソッドで、実行後もThisWorkbookの保存先は1か所目のパスのままになる、というのがポイントです。

 

SaveAsを2回実行してしまうと、ThisWorkbookの保存場所が2か所目のパスに変わってしまうため、「2か所目に保存後のCtrl+Sが意図しない場所に保存される」という問題が起きます。

2か所目のバックアップ保存にはSaveCopyAsを使う、というのはプロが現場でよく使うテクニックのひとつです。

 

SaveAsを使う際に知っておきたい注意点3つ

SaveAsは非常に便利なメソッドですが、いくつかの落とし穴があります。

実際にマクロ開発を行う中で遭遇した注意点を3つ紹介します。

 

注意点①:保存先フォルダのパスの書き方に注意する

Windowsのフォルダパスはバックスラッシュ(\)で区切りますが、VBAのコード内では文字列の中にバックスラッシュを書くとエスケープ文字と解釈されることがあります。

 

VBAでは基本的に「\」をそのまま記述できますが、パスの末尾に「\」をつけ忘れると「フォルダ名+ファイル名」がつながってしまい、意図しない場所に保存されることがあるので注意が必要です。

folderPath = “C:\Users\Documents\" というように、フォルダパスの末尾には必ず「\」をつける習慣をつけておきましょう。

 

注意点②:同名ファイルが存在する場合の上書き確認ダイアログを制御する

SaveAsで保存しようとしたとき、すでに同じ名前のファイルが存在すると「上書きしますか?」というダイアログボックスが表示されます。

 

マクロの途中でこのダイアログが出ると処理が止まってしまうため、自動化の妨げになることがあります。

Application.DisplayAlertsをFalseに設定することで、このダイアログを非表示にして自動で上書き処理を続行させることができます。

 

【サンプルコード⑤:ダイアログ非表示で上書き保存】

Sub 上書き確認なしで保存()

'確認ダイアログを非表示にする
Application.DisplayAlerts = False

ThisWorkbook.SaveAs Filename:="C:\Users\Documents\自動保存ファイル.xlsx", _
FileFormat:=xlOpenXMLWorkbook

'確認ダイアログを元に戻す(必ず戻す!)
Application.DisplayAlerts = True

MsgBox "保存が完了しました。", vbInformation

End Sub

 

Application.DisplayAlerts = False を実行した後は、必ず Application.DisplayAlerts = True で元に戻してください。

戻し忘れると、マクロ終了後もエクセル全体でアラートが非表示のままになってしまい、想定外の上書きや削除が無警告で実行されてしまう危険があります。

 

注意点③:マクロ有効ブックの保存形式を間違えない

マクロ(VBAコード)を含むエクセルファイルを .xlsx 形式で保存しようとすると、「マクロは保存されません」という警告が表示されます。

 

マクロを保持したまま保存するには FileFormat:=xlOpenXMLWorkbookMacroEnabled(ファイルの拡張子は.xlsm)を指定する必要があります。

自動化したいファイルが「ボタンを押してマクロを実行する」タイプのファイルである場合は、保存形式を .xlsm にすることをお忘れなく。

 

SaveAsの応用|実務で使える便利なコードパターン3選

ここまでの基本を押さえたら、いよいよ実務に直結する応用パターンを紹介します。

私が実際にマクロ開発依頼を受けた案件の内容をベースにしているため、「これ、自分の仕事でも使えそう!」と感じていただけると思います。

 

応用①:月次締めと同時にファイルを自動保存するVBA

月次の締め処理のときに、ファイルを自動保存する仕組みは非常に人気の高い自動化パターンです。

「月末になったらボタンを押すだけで今月分のファイルが所定のフォルダに保存される」という流れをコードで実現してみましょう。

 

【サンプルコード⑥:月次ファイル自動保存】

Sub 月次ファイル自動保存()

'今月の年月を取得(例:202403)
Dim yearMonth As String
yearMonth = Format(Date, "yyyymm")

'保存先フォルダを月ごとに自動作成
Dim folderPath As String
folderPath = "C:\Users\共有フォルダ\月次報告書\" & yearMonth & "\"

If Dir(folderPath, vbDirectory) = "" Then
MkDir folderPath
End If

'ファイル名を組み立てる(例:202403_月次業務報告書.xlsx)
Dim fileName As String
fileName = yearMonth & "_月次業務報告書.xlsx"

Application.DisplayAlerts = False
ThisWorkbook.SaveAs Filename:=folderPath & fileName, _
FileFormat:=xlOpenXMLWorkbook
Application.DisplayAlerts = True

MsgBox yearMonth & " の月次ファイルを保存しました。", vbInformation

End Sub

コードの流れを解説します。

 

Format(Date, “yyyymm") で今月の年月を「202403」という6桁の文字列として取得。

folderPath に「月次報告書フォルダの中にさらに月ごとのサブフォルダ」というパスを組み立てています。

 

Dir(folderPath, vbDirectory) = “" でそのフォルダがまだ存在しない場合に MkDir で自動作成しています。

翌月になれば自動的に新しいフォルダが作られ、そこに保存されるという仕組みなので、一度セットアップすれば何年でも使い続けることができます。

 

応用②:セルの値を組み合わせてファイル名を自動生成するVBA

請求書や報告書など、書類ごとにファイル名のフォーマットが決まっている場合は、セルの値を組み合わせてファイル名を自動生成するパターンが効果的です。

 

【サンプルコード⑦:セルの値からファイル名を自動生成して保存】

Sub セル値でファイル名自動生成保存()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")

'各情報をセルから取得
Dim clientName As String  '取引先名(B2セル)
Dim invoiceNo As String   '請求書番号(B3セル)
Dim issueDate As String   '発行日(B4セル)

clientName = ws.Range("B2").Value
invoiceNo = ws.Range("B3").Value
issueDate = Format(ws.Range("B4").Value, "yyyymmdd")

'入力チェック
If clientName = "" Or invoiceNo = "" Or issueDate = "" Then
MsgBox "B2〜B4セルにすべての情報を入力してください。", vbExclamation
Exit Sub
End If

'ファイル名を組み立てる
'例:20240318_株式会社ABC_請求書_INV-001.xlsx
Dim fileName As String
fileName = issueDate & "_" & clientName & "_請求書_" & invoiceNo & ".xlsx"

'保存先フォルダ
Dim savePath As String
savePath = "C:\Users\共有フォルダ\請求書\" & fileName

Application.DisplayAlerts = False
ThisWorkbook.SaveAs Filename:=savePath, FileFormat:=xlOpenXMLWorkbook
Application.DisplayAlerts = True

MsgBox "保存完了:" & Chr(13) & fileName, vbInformation

End Sub

コードの流れを解説します。

 

ws.Range(“B2").Value、ws.Range(“B3").Value、ws.Range(“B4").Value でそれぞれ取引先名・請求書番号・発行日をセルから読み込んでいます。

If clientName = “" Or invoiceNo = “" Or issueDate = “" Then という入力チェックを入れておくことで、セルの入力が不完全な状態でマクロが実行されるのを防いでいます。

 

fileName の組み立て部分を見ると、日付・取引先名・書類種別・番号を「_」でつないでいることがわかります。

この組み立て方を変えるだけで、どんなフォーマットのファイル名にも対応できます。

 

応用③:印刷と同時に名前を付けて保存するVBA

「書類を印刷するついでに、同じ名前でファイルとして保存もしたい」という要望も多く受けます。

印刷処理とSaveAsを組み合わせることで、ボタン1クリックで印刷と保存を同時に完了させることができます。

 

【サンプルコード⑧:印刷と同時に名前付き保存】

Sub 印刷と同時に保存()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")

'担当者名と日付でファイル名を生成
Dim tantousha As String
tantousha = ws.Range("A1").Value

Dim today As String
today = Format(Date, "yyyymmdd")

Dim fileName As String
fileName = today & "_" & tantousha & "_日報.xlsx"

Dim savePath As String
savePath = "C:\Users\共有フォルダ\日報\" & fileName

'まず印刷を実行
ws.PrintOut

'次に名前を付けて保存
Application.DisplayAlerts = False
ThisWorkbook.SaveAs Filename:=savePath, FileFormat:=xlOpenXMLWorkbook
Application.DisplayAlerts = True

MsgBox "印刷と保存が完了しました。", vbInformation

End Sub

コードの流れを解説します。

 

ws.PrintOut でシートの印刷を実行した後、SaveAsで保存処理を行う、という順番になっています。

「印刷してから保存」という順番にすることで、保存済みファイルのシートが印刷されるため、「保存したファイルの内容=印刷した内容」が一致するという安心感があります。

「もし担当者名がセルに入力されていない場合はどうするか」「印刷枚数を指定したい」などの要件が追加になったとしても、コードに条件分岐や引数を追加していくだけで対応できます。

 

印刷VBAについては、関連記事「フォルダ内のエクセルを一括印刷するマクロ」で作り方が紹介されています。

 

 

まとめ ~ VBA SaveAsで保存操作を完全自動化しよう ~

今回紹介したVBA SaveAsの活用方法をまとめると、「ファイル名の自動生成」「保存先フォルダの自動指定」「担当者別フォルダへの自動振り分け」「印刷と保存の同時実行」という4つのパターンが、保存作業の自動化に直結する実務的なコードです。

 

毎日「日付+担当者名+内容」を手で入力して保存していた作業が、ボタン1クリックで完了するようになれば、積み重なった時間のロスをゼロにすることができます。

 

最初はサンプルコードをそのままコピペして動かしてみるところから始め、フォルダパスやセル番地を自分の業務に合わせて書き換えていくのがおすすめです。

 

もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。

 

 

業務内容に合わせたオーダーメイドマクロを設定させていただきます。

 

最後まで読んでいただきありがとうございました。

エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。