Excel VBAでファイル選択ダイアログを表示する方法をお探しですね。

広告

Excel VBAでファイル選択ダイアログを使ってパスを取得する方法

Excel VBAで外部ファイルを読み込む処理を作るとき、最初につまずきやすいのが「どうやってファイルの場所を指定するか」という問題です。

毎回同じ場所にあるファイルなら、フルパスを直接書いても動きます。

でも実際の仕事では、保存場所やファイル名が変わることってよくありますよね。

そんなときに便利なのが、ファイル選択ダイアログを表示して、ユーザーに自分でファイルを選んでもらえる `Application.GetOpenFilename` です。

この記事では、Excel VBAでファイル選択ダイアログを開いて、選択されたファイルのフルパスを取得する基本から、キャンセル処理、拡張子フィルター、取得したパスの活用方法まで、わかりやすく解説していきます。

1. GetOpenFilenameを使うと何ができるの?

`GetOpenFilename` は、Excel VBAからファイル選択ダイアログを表示して、ユーザーが選んだファイルのフルパスを取得するためのメソッドです。

フルパスっていうのは、ドライブ名、フォルダ名、ファイル名までを含んだ完全な場所の情報のことです。

たとえば `C:\Work\売上データ.xlsx` みたいな文字列ですね。

VBAで別のブックを開いたり、CSVを取り込んだり、選択したファイル名をセルに表示したりするときには、このフルパスが必要になります。

ここで注意したいのは、`GetOpenFilename` は名前に「Open」って入っていますが、**実際にファイルを開くメソッドではない**という点です。

このメソッドがやってくれるのは、あくまで「ファイルを選ばせて、そのパスを返す」ことだけ。

選択したファイルを開きたい場合は、取得したパスを使って `Workbooks.Open` を別に実行する必要があります。

つまり、「ファイルを選ぶ処理」と「ファイルを開く処理」は別物だと考えるとわかりやすいです。

固定のファイルパスをVBAコードに直接書く方法は簡単ですが、ファイル名が変わったり、使う人によって保存場所が違ったりすると、すぐに動かなくなってしまいます。

一方で `GetOpenFilename` を使えば、ユーザー自身が対象ファイルを選べるので、保存場所が変わっても柔軟に対応できます。

部署内で共有するマクロや、毎月違うファイルを取り込むマクロでは、特に実用性が高い方法です。

2. ファイル選択ダイアログを開いてパスを取得する基本コード

まずは、Excel VBAでファイル選択ダイアログを開いて、選択されたファイルのパスを取得する基本コードを見てみましょう。

戻り値には文字列のパスが入りますが、キャンセルされたときには文字列ではなく `False` が返ってきます。

なので、変数は `String` ではなく `Variant` 型で受けるのが安全です。

初心者のうちはここを見落としやすくて、キャンセル時にエラーが出たり、意図しない動作になったりするので、最初から `Variant` で書く習慣をつけておくと安心です。

“`vb
Sub ファイルパスを取得する()

Dim filePath As Variant

filePath = Application.GetOpenFilename( _
FileFilter:=”Excelファイル (*.xls*),*.xls*”, _
Title:=”処理するExcelファイルを選択してください”)

If filePath = False Then
MsgBox “ファイル選択がキャンセルされました。


Exit Sub
End If

Range(“B2”).Value = CStr(filePath)

End Sub
“`

このコードを実行すると、ファイル選択ダイアログが表示されます。

ユーザーがExcelファイルを選んで「開く」を押すと、そのファイルのフルパスが `filePath` に入って、この例ではB2セルに表示されます。

ここで使っている `CStr` は、値を文字列に変換する関数です。

`GetOpenFilename` の戻り値は `Variant` なので、セルに入れたり他の文字列処理に渡したりする前に、明示的に文字列として扱うとコードの意図がわかりやすくなります。

`FileFilter` では、ダイアログに表示するファイルの種類を指定できます。

たとえば `Excelファイル (*.xls*),*.xls*` と書くと、`.xls`、`.xlsx`、`.xlsm` などのExcel系ファイルを対象にできます。

CSVファイルだけを選ばせたい場合は `CSVファイル (*.csv),*.csv` のように指定します。

フィルターを設定しておくと、使う人が間違って関係ないファイルを選んじゃうリスクを減らせるので、実務用マクロでは省略せずに指定するのがおすすめです。

3. キャンセル処理・拡張子フィルター・初期フォルダを整える

実際の仕事で使うマクロでは、単にファイル選択ダイアログを出すだけじゃなくて、キャンセルされた場合の処理も必ず入れておく必要があります。

ユーザーがダイアログを閉じたり「キャンセル」を押したりした場合、`GetOpenFilename` は `False` を返します。

この状態で `Workbooks.Open` なんかを実行すると、存在しないパスを開こうとしてエラーになっちゃいます。

なので、ファイルが選択されなかった場合は `Exit Sub` で処理を終了する形にしておくと安全です。

複数のファイル形式を選ばせたい場合は、`FileFilter` に表示名と拡張子の組み合わせを続けて指定します。

たとえばExcelファイルとCSVファイルの両方を対象にするなら、次のように書けます。

`FilterIndex` を指定すると、ダイアログを開いたときに最初に選ばれているファイル種類をコントロールできます。

使う人がよく選ぶ形式を先頭にしておくと、操作の手間を減らせますよ。

“`vb
Sub ファイル種類を指定して選択する()

Dim filePath As Variant

filePath = Application.GetOpenFilename( _
FileFilter:=”Excelファイル (*.xls*),*.xls*,CSVファイル (*.csv),*.csv,すべてのファイル (*.*),*.*”, _
FilterIndex:=1, _
Title:=”取り込むファイルを選択してください”)

If filePath = False Then Exit Sub

MsgBox “選択されたファイル:” & vbCrLf & CStr(filePath)

End Sub
“`

また、`GetOpenFilename` には初期表示フォルダを直接指定する引数がありません。

なので、最初に開くフォルダを調整したい場合は、カレントディレクトリを変更してからダイアログを表示する方法がよく使われます。

Windows環境では `WScript.Shell` の `CurrentDirectory` を使うと、現在のブックと同じフォルダを最初に表示するような処理を書けます。

ただし、カレントディレクトリの変更は他の処理に影響する場合があるので、より細かくコントロールしたい場合は `FileDialog` オブジェクトの利用も検討するといいでしょう。

“`vb
Sub 初期フォルダを指定して選択する()

Dim filePath As Variant

With CreateObject(“WScript.Shell”)
.CurrentDirectory = ThisWorkbook.Path
End With

filePath = Application.GetOpenFilename( _
FileFilter:=”Excelファイル (*.xls*),*.xls*”, _
Title:=”このブックと同じフォルダからファイルを選択してください”)

If filePath = False Then Exit Sub

Range(“B2”).Value = CStr(filePath)

End Sub
“`

4. 取得したパスでファイルを開く・ファイル名やフォルダ名を取り出す

`GetOpenFilename` で取得したパスは、そのまま `Workbooks.Open` に渡すことで選択したファイルを開けます。

ここでも大事なのは、キャンセル判定を先にやることです。

ファイルを開く処理は外部ファイルにアクセスするので、パスが正しくないとエラーになりやすい部分です。

安全なコードにするには、ファイルが選択されたことを確認してから開く、という順番を守るようにしましょう。

“`vb
Sub 選択したブックを開く()

Dim filePath As Variant

filePath = Application.GetOpenFilename( _
FileFilter:=”Excelファイル (*.xls*),*.xls*”, _
Title:=”開くブックを選択してください”)

If filePath = False Then
MsgBox “処理を中止しました。


Exit Sub
End If

Workbooks.Open Filename:=CStr(filePath)

End Sub
“`

取得したフルパスから、ファイル名だけ、またはフォルダパスだけを取り出したい場面もあります。

選択されたファイルが実在する前提なら、ファイル名の取得には `Dir` 関数が使えます。

`Dir` は指定したパスにあるファイル名を返す関数で、返り値にはフォルダ部分が含まれません。

さらに、フルパスからファイル名を取り除けば、フォルダ部分だけを取り出せます。

“`vb
Sub パスを分解する()

Dim filePath As Variant
Dim fileName As String
Dim folderPath As String

filePath = Application.GetOpenFilename( _
FileFilter:=”Excelファイル (*.xls*),*.xls*”, _
Title:=”ファイル名とフォルダ名を確認するファイルを選択してください”)

If filePath = False Then Exit Sub

fileName = Dir(CStr(filePath))
folderPath = Replace(CStr(filePath), fileName, “”)

MsgBox “フルパス:” & CStr(filePath) & vbCrLf & _
“ファイル名:” & fileName & vbCrLf & _
“フォルダ:” & folderPath

End Sub
“`

ただし、`Dir` 関数は存在するファイルに対して使うのが基本です。

`GetOpenFilename` でユーザーが選んだファイルは普通は存在しているので相性がいいんですが、手入力されたパスや存在確認前のパスを扱う場合は注意が必要です。

より汎用的にファイル名を切り出したい場合は、最後の `\` の位置を `InStrRev` で探して `Mid` や `Left` で分割する方法もあります。

選択ダイアログで取得したパスを次の処理にどう渡すのかまで考えておくと、マクロ全体の見通しがよくなりますよ。

なお、複数ファイルをまとめて選択したい場合は、`GetOpenFilename` の `MultiSelect` 引数に `True` を指定します。

この場合、戻り値は1つの文字列ではなく配列になります。

キャンセル時は `False`、選択時は配列という形に変わるので、単一選択よりも少し丁寧な判定が必要です。

複数ブックの一括取込や、複数CSVの結合処理を作る場合は、この考え方を応用できます。

“`vb
Sub 複数ファイルを選択する()

Dim files As Variant
Dim i As Long

files = Application.GetOpenFilename( _
FileFilter:=”Excelファイル (*.xls*),*.xls*”, _
Title:=”処理するファイルを選択してください”, _
MultiSelect:=True)

If VarType(files) = vbBoolean Then Exit Sub

For i = LBound(files) To UBound(files)
Debug.Print files(i)
Next i

End Sub
“`

まとめ

Excel VBAでファイル選択ダイアログを開いてパスを取得するなら、まずは `Application.GetOpenFilename` を押さえるのが近道です。

ポイントは次の3つ:
– 戻り値を `Variant` で受けること
– キャンセル時の `False` を必ず判定すること
– 必要に応じて `FileFilter` や `Title` を指定すること

取得したパスは、セルへの出力、`Workbooks.Open` によるブック操作、ファイル名やフォルダ名の抽出などに活用できます。

固定パスに頼らない書き方を覚えておくと、使う人や保存場所が変わっても動きやすい、実務向けのVBAマクロを作れるようになります。

ぜひ試してみてくださいね!

広告