ExcelマクロVBA入門
第75回.名前を付けて保存ダイアログ(GetSaveAsFilename)

Excelマクロの基礎と応用、エクセルVBAの入門・初級・初心者向け解説
最終更新日:2019-07-07

第75回.名前を付けて保存ダイアログ(GetSaveAsFilename)


VBAで保存するExcelファイルの保存先フォルダとファイル名をあらかじめ決めておけない場合は、
ユーザーに保存先フォルダとファイル名を指定してもらう必要があります。
ユーザーに保存するフイルを指定してもらうには、
ApplicationオブジェクトのGetSaveAsFilenameメソッドである、
[名前を付けて保存] ダイアログボックスを使用します。


GetSaveAsFilenameメソッド

Applicationオブジェクトのメソッドになります。
[名前を付けて保存] ダイアログボックスを表示して、ユーザーにフォルダとファイル名を指定してもらいます。

Application.GetSaveAsFilename(InitialFilename, FileFilter, FilterIndex, Title, ButtonText)



InitialFilename 既定値として表示するファイル名を指定します。
この引数を省略すると、作業中のブックの名前が使われます。
FileFilter ファイルの候補を指定する文字列 (ファイル フィルター文字列) を指定します。
FilterIndex 引数 FileFilter で指定したファイル フィルター文字列の中で、1 から何番目の値を既定値とするかを指定します。この引数を省略するか、ファイル フィルター文字列の数より大きい数値を指定すると、最初のファイル フィルター文字列が既定値となります。
Title ダイアログ ボックスのタイトルを指定します。
この引数を省略すると既定のタイトルが使用されます。
ButtonText Macintosh でのみ指定できます。

戻り値
バリアント型 (Variant)
選択したファイルのフルパスが文字列で戻ります。
ファイルを選択しなかった場合は、Falseが戻ります。
説明文だけでは理解しづらい、FileFilterの指定文字列について説明します。
FileFilter
ファイル フィルター文字列とワイルドカードのペアを、必要な数だけ指定します。
ファイル フィルター文字列とワイルドカードはコンマ (,) で区切り、各ペアもコンマで区切って指定します。
各ペアは、[ファイルの種類] ボックスのリストに表示されます。
1つのファイル フィルター文字列に複数のワイルドカードを対応させるには、各ワイルドカードをセミコロン (;) で区切ります。
文章では理解しづらい部分は、以下の使用例を参考にして下さい。

GetSaveAsFilenameの使用例

Application.GetSaveAsFilename(FileFilter:="Excel2003以前,*.xls,Excelファイル,*.xlsx,Excelマクロブック,*.xlsm")
Excelファイルの拡張子として、xls,xlsx,xlsmの3つを指定しています。

Application.GetSaveAsFilename(FileFilter:="Excelファイル,*.xls*,CSVファイル,*.csv")
エクセルファイルとして、拡張子が xls , xlsx , xlsm を全て指定するために、xls* としています。
そして、2番目のフィルターとして、CSVファィルを指定しています。

GetSaveAsFilenameの実践例

Sub sample1()
  Dim FileName As Variant
  FileName = Application.GetSaveAsFilename(InitialFileName:="規定の名称.xls", FileFilter:="Excelファイル,*.xls*")
  If FileName = False Then
    Exit Sub
  End If
  ActiveWorkbook.SaveAs FileName
End Sub

ダイアログでエクセルファイルを指定し、そのファイル名で保存しています。
上記VBAコードには、Excel2007以降の仕様変更による問題点があります。
以下をお読みください。

GetSaveAsFilenameの初期フォルダーの指定

ダイアログで初期表示されるフォルダは、カレントフォルダです。
これを変更する場合は、ChDir "フォルダ"
これを事前に実行するようにします。
または、
InitialFileNameをフルパスで指定することでも可能です。

※InitialFilenameについて
後に気づいたので追記しておきます。
実践例の



Sub sample1()
  Dim FileName As Variant
  FileName = Application.GetSaveAsFilename(InitialFileName:="規定の名称.xls", FileFilter:="Excelファイル,*.xls*")
  If FileName = False Then
    Exit Sub
  End If
  ActiveWorkbook.SaveAs FileName
End Sub

これでは、ダイアログのファイル名に名称が入りません。
これは、Excel2007以降の仕様のようです。

Sub sample2()
  Dim FileName As Variant
  FileName = Application.GetSaveAsFilename(InitialFileName:="規定の名称.xlsx", FileFilter:="Excelファイル,*.xlsx")
  If FileName = False Then
    Exit Sub
  End If
  ActiveWorkbook.SaveAs FileName
End Sub

上記のVBAコードように、
InitialFileNameの拡張子と完全一致するように、
FileFilterの拡張子を指定しないと、ファイル名に名称が入りません。

複数の拡張子を指定している場合は、
InitialFileNameの拡張子は、FilterIndexで指定されている拡張にします。

Sub sample3()
  Dim FileName As Variant
  FileName = Application.GetSaveAsFilename( _
    InitialFileName:="規定の名称.xlsx", _
    FileFilter:="Excel2003以前,*.xls,Excelファイル,*.xlsx,Excelマクロブック,*.xlsm", _
    FilterIndex:=2)
  If FileName = False Then
    Exit Sub
  End If
  ActiveWorkbook.SaveAs FileName
End Sub

GetSaveAsFilenameの最後に

マクロVBAで、業務を自動化する場合は、
出力ファイルは、決められたフォルダに決められたファイル名で保存した方が望ましいでしょう。
「決められた」と言うのは「決め事があれば」ということであり、完全に固定名称である必要はありません。
例えば、
名称の一部に、処理日付をYYYYMMDD形式にした文字列を付加することはVBAでは簡単に実現できます。

従って、GetSaveAsFilenameメソッドを使うのは、
決め事がない場合や、決め事があってもそれをVBAとして処理出来ないような場合に限って使用してください。



同じテーマ「マクロVBA入門」の記事

第72回.印刷プレビュー(PrintPreview)
第73回.ページ設定(PageSetup)
第74回.ファイルを開くダイアログ(GetOpenFilename)
第75回.名前を付けて保存ダイアログ(GetSaveAsFilename)
第76回.ファイルダイアログ(FileDialog)
第77回.組み込みダイアログ(Dialogs,xlDialogPrint)
第78回.総合練習問題8
第79回.ファイル操作Ⅰ(Dir)
第80回.ファイル操作Ⅰ(その他)
第81回.総合練習問題9
第82回.RangeのResizeプロパティ


新着記事NEW ・・・新着記事一覧を見る

PowerQueryの強力な機能をVBAから利用する方法|VBA技術解説(8月4日)
練習問題31(セル結合を解除して値を埋める)|VBA練習問題(7月30日)
練習問題30(マトリックス→リスト形式)|VBA練習問題(7月25日)
Applicationを省略できるApplicationのメソッド・プロパティ一覧|VBA技術解説(7月22日)
コレクション(Collection)の並べ替え(Sort)に対応するクラス|VBA技術解説(7月20日)
CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)
オートフィルタを退避回復するVBAクラス|VBA技術解説(7月6日)
IfステートメントとIIF関数とMax関数の速度比較|VBA技術解説(6月23日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.ひらがな⇔カタカナの変換|エクセル基本操作
10.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説



  • >
  • >
  • >
  • 名前を付けて保存ダイアログ(GetSaveAsFilename)

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。




    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ