Excel VBA:[名前を付けて保存]ダイアログボックスを表示(GetSaveAsFilenameメソッド)して入力されたファイル名を取得する方法

2009年3月2日

Excel

ExcelのVBAを使用して[名前を付けて保存]ダイアログボックスを表示し、保存するファイル名として入力された文字列を取得するサンプルプログラムを覚え書き。

サンプルプログラムの概要

ExcelのVBAではAccessと違って最初から[名前を付けて保存]ダイアログボックスを開くための"GetSaveAsFilename"メソッドが用意されている。

このメソッドを使うことで容易に[名前を付けて保存]ダイアログボックスのインターフェースを利用することができる。

[ファイルを開く]ダイアログボックスを表示して使用する方法については、以下の記事を参照。

以下に"GetSaveAsFilename"メソッドの説明とサンプルプログラムを記述する。

GetSaveAsFilenameメソッドについて

GetSaveAsFilenameメソッドは、5つの引数を指定できるが、Windows版のExcelでは4つの引数のみ有効となる。

残りの1つの引数はMAC版のExcel用に用意された引数となっている。

GetSaveAsFilenameメソッドの書式

GetSaveAsFilenameメソッドの書式は以下のとおり。

変数 = Application.GetSaveAsFilename(InitialFilename,FileFilter,FilterIndex
          ,
Title,ButtonText)

以下に各引数について説明する。

InitialFilename引数

保存するファイル名の初期値。

保存するファイル名が最初から決まっている場合や、想定できる名前の場合は、この引数を指定して[名前を付けて保存]ダイアログボックスの[ファイル名]ボックスにあらかじめファイル名を設定しておくことができる。

もちろん省略可能。

FileFilter引数

[名前を付けて保存]ダイアログボックスで指定できるファイルの種類を制限するための引数。

例えば指定できるファイルをCSVファイルだけに限定したいとか、ある特定の拡張子のファイルだけに限定したいときに指定する。

指定の書式は以下のとおり。

“表示文字列,指定できる拡張子"

例:"CSVファイル,*.csv"

1つのフィルタに複数の拡張子を指定することもでき、その際には拡張子を";"(セミコロン)で区切る。

CSVファイルとTXTファイルの2つを指定できるようにするのであれば、"CSVもしくはTXTファイル,*.csv;*.txt"と指定すれば良い。

また、複数のフィルタを指定することもできる。

CSVファイルとExcelファイルの2つのフィルタを用意したければ、"CSVファイル,*.csv,Excelファイル,*.xls;*.xlt"と指定する。

このように指定した場合、[名前を付けて保存]ダイアログボックスの[ファイルの種類]コンボボックスの一覧に"CSVファイル"と"Excelファイル"の2つがリストとして表示され、コンボボックスでどちらかを選択できるようになる。

FilterIndex引数

前述のFileFilter引数で複数のフィルタを設定した場合に、初期表示するフィルタの番号を指定する。

フィルタを"CSVファイル,*.csv,Excelファイル,*.xls;*.xlt"と指定した場合、"CSVファイル"と"Excelファイル"の2つのフィルタが[ファイルの種類]コンボボックスに表示される。

この2つのうちどちらのフィルタを[名前を付けて保存]ダイアログボックスが開いたときに初期表示として表示させるかを番号で指定する。

“2"を指定すれば、初期表示されるフィルタは、"Excelファイル"になる。

この引数を省略した場合は、最初のフィルタが初期表示される。

Title引数

[名前を付けて保存]ダイアログボックスのタイトルバーに表示する文字列を指定する。

この引数を省略した場合は、既定のタイトルである"名前を付けて保存"が設定される。

ButtonText引数

[開く]ボタンの表示文字列を指定できる引数で、Windows版では指定しても無効になり、MAC版のみ有効となる。

GetSaveAsFilenameメソッド実行時のカレントフォルダの変更

[名前を付けて保存]ダイアログボックスを表示した際のカレントフォルダを指定したい場合は、"ChDir"を使用して、[名前を付けて保存]ダイアログボックスを表示する前にカレントフォルダを変更しておく。

カレントフォルダをデスクトップフォルダなど、Windowsの特殊フォルダにしたい場合は、以下の記事を参考。

以下のサンプルは最もシンプルな[名前を付けて保存]ダイアログボックスの表示例で、フィルタを設定せず"全てのファイル(*.*)"を指定できる。

また、保存先の カレントフォルダをデスクトップフォルダに変更してからダイアログボックスを表示している。

Sub SaveFileSample01()
Dim SaveFileName
Dim wScriptHost As Object, strInitDir As String
'カレントディレクトリをデスクトップに変更
Set wScriptHost = CreateObject("WScript.Shell")
ChDir wScriptHost.SpecialFolders("Desktop")
SaveFileName = Application.GetSaveAsFilename()
If SaveFileName <> False Then
MsgBox "入力されたファイル名は、" & SaveFileName & " です。", vbInformation
Else
MsgBox "キャンセルがクリックされました。", vbInformation
End If
End Sub

GetSaveAsFilenameメソッドを使用したサンプルプログラム2

指定できるファイルの種類としてCSVファイルとTXTファイルだけを指定できるように設定。 また、ファイル名の初期値として"sample.csv"を指定した。

Sub SaveFileSample02()
Dim SaveFileName
Dim wScriptHost As Object, strInitDir As String
    'カレントディレクトリをデスクトップに変更
    Set wScriptHost = CreateObject("WScript.Shell")
    ChDir wScriptHost.SpecialFolders("Desktop")
    
    SaveFileName = Application.GetSaveAsFilename("sample.csv", _
                    "CSVファイルもしくはTXTファイル,*.csv;*.txt")
        If SaveFileName <> False Then
            MsgBox "入力されたファイル名は、" & SaveFileName & " です。", vbInformation
        Else
            MsgBox "キャンセルがクリックされました。", vbInformation
        End If
End Sub

GetSaveAsFilenameメソッドを使用したサンプルプログラム3

指定できるファイルの種類として"CSVファイルもしくは、TXTファイル"と"Excelファイル"の2つの種類を設定。

また、[名前を付けて保存]ダイアログボックスのタイトルバーの文字列も設定。

Sub SaveFileSample03()
Dim SaveFileName
Dim wScriptHost As Object, strInitDir As String
    'カレントディレクトリをデスクトップに変更
    Set wScriptHost = CreateObject("WScript.Shell")
    ChDir wScriptHost.SpecialFolders("Desktop")
    SaveFileName = Application.GetSaveAsFilename("sample.xls", _
                "CSV、TXTファイル (*.csv;*.txt;),*.csv;*.txt,Excelファイル (*.xls;*.xlt),*.xls;*.xlt" _
                , 2, "保存するファイルの名前を指定してください。")
        If SaveFileName <> False Then
            MsgBox "入力されたファイル名は、" & SaveFileName & " です。", vbInformation
        Else
            MsgBox "キャンセルがクリックされました。", vbInformation
        End If
        
End Sub

以上。

Accessでは"WIZHOOK"なんていう非公開オブジェクトを操作することによって[ファイルを開く]や[名前を付けて保存]ダイアログボックスを表示しなければならないが、Excelは、あらかじめメソッドが用意されている。

同じMicrosoft製品で、しかもOfficeファミリーなのにどうしてAccessには用意されていないかがとても不思議。(Office 2007については未確認)

(Visited 3,549 times, 493 visits today)