和風スパゲティのレシピ

日本語でコーディングするExcelVBA

GetOpenFilenameとGetSaveAsFilenameの違い

ダイアログボックスでファイルを選択する機能である、
GetOpenFilenameとGetSaveAsFilenameの違いを解説します。

同じところ

どちらもダイアログボックスを表示して、
選択されたファイルのパスを取得
します。

  • ファイルパスをStringで返すこと
  • 実際に開いたり保存したりはしないこと
  • キャンセル時はFalseを返すこと
  • Booleanも返すため、返り値の型自体はVariantであること

これらの挙動も一致しています。


どちらも実際のOpenやSaveが実行されるわけではないため、
GetSaveAsFilenameで選択されたファイルを開くなど、
まったく違う操作ができてしまうことにご注意ください。


「実際に保存したり開いたりせずパスをくれるだけ」
ならどっちも同じメソッドではないの?
と思って本記事にたどり着いた方もいらっしゃるかもしれません。

違うところ

一番の違いは「存在しないファイルを指定できるかどうか」です。

GetOpenFilenameメソッドは目的が「開く」のため、
存在しないファイルを指定することはできません。


対してGetSaveAsFilenameメソッドは「保存」が目的のため、
新規保存を行うための操作ができるようになっており、
手入力した存在しないファイル名を受け取ることが可能です。


またGetSaveAsFilenameメソッドはその後「保存」が実行される想定のため、
存在するファイルを選択した際は「上書き保存」に関するメッセージが出ます。

これで「キャンセル」を押してもダイアログがキャンセルされたことになるのが、
GetSaveAsFilenameメソッドにしかない特長になります。


また、GetSaveAsでは保存する際の規定ファイル名を指定できるよう、
ファイル名初期値を指定する引数「InitialFilename」も持っています。

こちらもGetOpenFilenameメソッドにはない機能ですね。


逆にGetOpenFilenameメソッドしかない機能として、
引数「MultiSelect」をTrueにすると複数ファイルの選択ができます。

処理するファイルを一括で選ぶときにはこちらの機能を使ってください。

この時はファイルパスの配列が返り値として返されます。


最後に細かい違いとして、引数Titleを省略した際のテキストが異なります。

  • GetOpenFilenameでは「ファイルを開く」
  • GetSaveAsFilenameでは「名前を付けて保存」

という表時になっていますので、
処理にそぐわない場合はTitleを指定して変更してください。

使い分け

ファイルの保存を行う際はGetSaveAsFilenameメソッドを使用します。


といっても対象がExcelファイルであるならば、
WorkbookオブジェクトのSaveAsメソッドがあります。

わざわざExcelファイルにこのメソッドを使用する必要はありませんので、
CSVの出力など、xlsxではないファイルの保存時に使用するメソッドですね。


対してGetOpenFilenameメソッドは「ファイルを開く」ときはもちろん、
それ以外の幅広い用途にも使えます。

別に選んだファイルを必ず開く必要があるわけではなく、
それ以外の様々な処理用に使って問題ありません。

その際は引数Titleを指定して処理の内容を表示しておきましょう。


ダイアログボックスを使用する処理には基本的にGetOpenFilenameを使っておき、
保存の時だけはGetSaveAsFilenameメソッドを使用しておけばよいと思います。