マクロで作成したブックやCSVを保存するとき、保存先やファイル名を毎回コード内に固定で書いてしまうと、使う人によって都合が悪かったり、上書きされたくないファイルを誤って上書きしてしまったりすることがあります。そんなときに便利なのがApplication.GetSaveAsFilenameです。
この記事では、GetSaveAsFilenameの基本的な使い方から、拡張子フィルターの指定方法、キャンセルされた場合の判定方法、SaveAsと組み合わせた実践的な保存処理まで、コピペしてすぐ使えるサンプルコード付きで解説します。
GetSaveAsFilenameとは
Application.GetSaveAsFilenameは、Excelの「名前を付けて保存」と同じ形式のダイアログボックスを表示し、ユーザーに保存先のフォルダとファイル名を選ばせるためのメソッドです。
重要な特徴として、このメソッドはダイアログを表示して選択されたファイルパスの文字列を返すだけで、実際にファイルを保存する処理は行いません。保存自体は別途SaveAsメソッドなどで行う必要があります。
Sub 基本的な使い方()
Dim 保存パス As Variant
保存パス = Application.GetSaveAsFilename(InitialFileName:="新しいブック.xlsx")
If 保存パス = False Then
MsgBox "キャンセルされました"
Else
MsgBox "選択されたパス:" & 保存パス
End If
End Sub
戻り値を受け取る変数は必ずVariant型で宣言してください。キャンセル時には文字列ではなくFalse(Boolean値)が返るため、String型では正しく受け取れません。
拡張子フィルターを指定する
FileFilter引数を使うと、ダイアログ内で選択できるファイルの種類を絞り込めます。
Sub フィルター付きで保存先を選ぶ()
Dim 保存パス As Variant
保存パス = Application.GetSaveAsFilename( _
InitialFileName:="集計結果.xlsx", _
FileFilter:="Excelブック (*.xlsx), *.xlsx, CSVファイル (*.csv), *.csv", _
Title:="保存先を選択してください")
If 保存パス = False Then
MsgBox "保存がキャンセルされました"
Exit Sub
End If
MsgBox "次の場所に保存します:" & vbCrLf & 保存パス
End Sub
FileFilterは「表示名, パターン」の組を,区切りで複数指定できます。ダイアログ下部のファイル種類の一覧に、指定した順番で選択肢が表示されます。
SaveAsと組み合わせて実際に保存する
GetSaveAsFilenameで取得したパスを使って、実際にブックを保存する処理まで組み込んだ例です。
Sub 名前を付けて保存を実行する()
Dim 保存パス As Variant
保存パス = Application.GetSaveAsFilename( _
InitialFileName:=ThisWorkbook.Name, _
FileFilter:="Excelブック (*.xlsx), *.xlsx")
If 保存パス = False Then
MsgBox "保存をキャンセルしました"
Exit Sub
End If
ThisWorkbook.SaveAs Filename:=保存パス, FileFormat:=xlOpenXMLWorkbook
MsgBox "保存が完了しました"
End Sub
GetSaveAsFilenameはあくまで「パスを取得するだけ」なので、SaveAsを呼び出す一手間を忘れないようにしましょう。この手間を忘れると、ダイアログは表示されたのに何も保存されない、という不具合の原因になります。
キャンセル判定の注意点
GetSaveAsFilenameはユーザーがダイアログで「キャンセル」を押すとFalseを返します。ここで気をつけたいのが、比較先の変数の型です。
Sub キャンセル判定の実例()
Dim 保存パス As Variant
保存パス = Application.GetSaveAsFilename()
' 正しい判定方法(Variant型で受けているのでFalseと直接比較できる)
If 保存パス = False Then
Exit Sub
End If
' VarType関数を使ったより厳密な判定方法
If VarType(保存パス) = vbBoolean Then
MsgBox "キャンセルされました"
Exit Sub
End If
End Sub
万が一保存パスをString型で宣言してしまうと、Falseが代入された時点で型変換エラーが発生してマクロが停止します。必ずVariant型で受け取ることを徹底してください。
CSVとして保存する場合の注意点
CSV形式で保存したい場合は、FileFormatにxlCSVを指定します。ただし、複数シートのブックをCSV保存すると、アクティブシートの内容しか保存されない点に注意が必要です。
Sub CSVとして保存する()
Dim 保存パス As Variant
保存パス = Application.GetSaveAsFilename( _
InitialFileName:="出力データ.csv", _
FileFilter:="CSVファイル (*.csv), *.csv")
If 保存パス = False Then Exit Sub
ThisWorkbook.Worksheets("出力用").Activate
ThisWorkbook.SaveAs Filename:=保存パス, FileFormat:=xlCSV
End Sub
複数シートのデータをまとめてCSV化したい場合は、出力専用のシートを1枚用意し、そこにデータを集約してから保存する方法が安全です。
まとめ
GetSaveAsFilenameを使うことで、保存先やファイル名をユーザーに柔軟に選んでもらえるマクロが作れます。ポイントをまとめると以下の通りです。
GetSaveAsFilenameはパスを取得するだけで、実際の保存はSaveAsで行う- 戻り値を受け取る変数は必ず
Variant型で宣言する - キャンセル時は
Falseが返るため、保存処理の前に必ず判定する FileFilterでダイアログに表示するファイル種類を絞り込める
固定パスへの保存に比べて、ユーザーに保存先を委ねられる分だけ、汎用性の高いマクロになります。配布用のツールや複数人で使うマクロにぜひ取り入れてみてください。


コメント