マクロで作成したレポートなどを保存する際、ファイル名を固定するのではなく、マクロの実行者にファイル名や保存場所、ファイルの種類(xlsxやpdfなど)を自由に決めてもらいたい、という場合があります。
VBAの**Application.GetSaveAsFilename
メソッド**を使えば、「名前を付けて保存」のダイアログボックスを表示し、ユーザーが入力した保存パスを文字列として取得できます。
この記事では、このメソッドの基本的な使い方と、実際にファイルを保存するまでの応用方法を解説します。
完成したVBAコード
Sub ShowFileSaveAsDialog()
' 変数を宣言します。戻り値はパス(文字列)かFalse(ブール値)のため、Variant型にします。
Dim saveFilePath As Variant
Dim initialFileName As String
'--- 1. ダイアログの初期値を設定 ---
' あらかじめ、デフォルトのファイル名を提案しておく
initialFileName = ThisWorkbook.Path & "\Report_" & Format(Date, "yyyymmdd") & ".xlsx"
'--- 2. 「名前を付けて保存」ダイアログボックスを表示 ---
saveFilePath = Application.GetSaveAsFilename( _
InitialFileName:=initialFileName, _
FileFilter:="Excel ブック (*.xlsx),*.xlsx,CSV (カンマ区切り) (*.csv),*.csv", _
Title:="レポートの保存先を選択してください")
'--- 3. 選択結果を判定 ---
If saveFilePath = False Then
' 「キャンセル」が押された場合
MsgBox "保存はキャンセルされました。"
Else
' ファイルパスが指定された場合
MsgBox "以下のパスで保存が指定されました。" & vbCrLf & saveFilePath
End If
End Sub
コードのポイント解説
① Application.GetSaveAsFilename
メソッド
このメソッドを実行すると、「名前を付けて保存」ダイアログが表示されます。最も重要なのは、このメソッドはファイルを実際に保存するわけではなく、ユーザーが指定した保存先のフルパスを文字列として返すだけ、という点です。
② InitialFileName
引数
ダイアログが表示された際に、ファイル名入力欄にあらかじめ表示しておくデフォルトのファイル名やパスを指定できます。ユーザーの手間を省くための親切な設定です。
③ FileFilter
引数
ダイアログの「ファイルの種類」ドロップダウンリストの内容を設定します。GetOpenFilename
と同じ形式で、"表示名,*.拡張子"
のペアをカンマ区切りで指定します。
④ キャンセルされた場合の処理
If saveFilePath = False Then
ユーザーがダイアログで「キャンセル」ボタンを押した場合、このメソッドは**ブール値のFalse
**を返します。戻り値を受け取る変数をVariant
型で宣言し、If
文でFalse
かどうかを判定することで、キャンセル時の処理を正しく分岐させることができます。
【応用】指定されたパスにブックを実際に保存する
GetSaveAsFilename
で取得したファイルパスを、SaveAs
メソッドと組み合わせることで、「ユーザーが選んだ場所に、選んだ名前でファイルを保存する」という一連の動作が完成します。
Sub GetPathAndSaveFile()
Dim savePath As Variant
' 1. まず、GetSaveAsFilenameで「保存パス」だけを取得
savePath = Application.GetSaveAsFilename(InitialFileName:="NewReport.xlsx")
' 2. キャンセルされなかった場合、取得したパスを使って実際にブックを保存
If savePath <> False Then
' ここでは例として、このマクロブック自身を別名で保存
ThisWorkbook.SaveAs Filename:=savePath
MsgBox "ブックを「" & savePath & "」に保存しました。"
Else
MsgBox "保存はキャンセルされました。"
End If
End Sub
まとめ
Application.GetSaveAsFilename
メソッドは、ユーザーに保存場所を委ねる柔軟なマクロを作成する際に不可欠な機能です。
- 戻り値は**ファイルのフルパス(文字列)**であり、それ自体に保存機能はない。
InitialFileName
引数で、推奨ファイル名を提示できる。- 戻り値が**
False
かどうか**で、キャンセル操作を判定する。 - 実際の保存には、取得したパスを**
SaveAs
**メソッドに渡す必要がある。
これらのポイントを押さえることで、より対話的でユーザーフレンドリーなVBAツールを作成することができます。