【VBA】[ファイルを開く]ダイアログボックスを用いてファイルを開く方法

スポンサーリンク

[ファイルを開く]ダイアログボックスを表示して、ユーザーが選択したファイルを開く方法について説明します。

主に、以下の2つのメソッドを使用します。

  • ApplicationオブジェクトのGetOpenFilenameメソッド
  • WorkbooksコレクションのOpenメソッド

今回は、

  • [ファイルを開く]ダイアログボックスを用いてファイルを開くプログラム例その説明
  • [ファイルを開く]ダイアログボックスに表示する拡張子の種類・数の変更方法
  • [ファイルを開く]ダイアログボックスで複数のファイルを選択する方法

など
基本的な内容から応用的な使い方まで詳しく説明していきます。

[ファイルを開く]ダイアログボックスを用いてファイルを開くプログラム

Sub ファイルを開くダイアログボックスを用いてファイルを開く01()

    Dim OpenFileName As String
    
    OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx")
 
    If OpenFileName <> "False" Then
        Workbooks.Open OpenFileName
    Else
        MsgBox "キャンセルされました"
    End If
    
End Sub

上で示したプログラムの大まかな説明は以下のようになります。
[ファイルを開く]ダイアログボックスを用いてファイルを開くプログラム

これからこのプログラムがどのようにできているかを詳しく説明します。

GetOpenFilenameメソッドで[ファイルを開く]ダイアログボックスを表示する

GetOpenFilenameメソッド
[ファイルを開く]ダイアログボックスを表示する最も一般的な方法はApplicationオブジェクトのGetOpenFilenameメソッドです。

【補足】
ApplicationオブジェクトのGetOpenFilenameメソッド以外にも
FindFileメソッド
FindDialogメソッド
Didlogsメソッド
でも[ファイルを開く]ダイアログボックスを表示することができます。

GetOpenFilenameメソッドはユーザーが指定したファイルのフルパス(絶対パス)を文字列で返します。戻り値はVariant型です。

このプログラムではString型の変数を宣言していますが、Variant型で変数を宣言してもOKです。

プログラムでは宣言した変数OpenFileNameにユーザーが指定したファイルのフルパスが格納されます。

【例】
[ファイルを開く]ダイアログボックスで「C:\Users\Desktop」にあるExcelファイル「テスト.xlsx」を選択した場合、変数OpenFileNameには、文字列『C:\Users\Desktop\テスト.xlsx』が格納されます。

[ファイルを開く]ダイアログボックスに表示するファイルの種類は、GetOpenFilenameメソッドの引数「FileFilter」で指定します。

引数「FileFilter」の書式は以下のようになります。

FileFilter:= “ファイルフィルタ文字列 , ワイルドカード”

引数「FileFilter」には、

  • ファイルフィルタ文字列
  • ワイルドカード

の2種類の情報をペアにして、「,(カンマ)」で区切って指定します。

ファイルフィルタ文字列とワイルドカードには以下の情報を記載します。

  • ファイルフィルタ文字列
  • [ファイルを開く]ダイアログボックス右下の[ドロップダウンリスト]に表示される文字列になります。
    [ファイルを開く]ダイアログボックスに表示されるファイルの拡張子が何なのかが分かるように、任意の文字列を指定します。

  • ワイルドカード
  • [ファイルを開く]ダイアログボックスに表示するファイルの拡張子を指定します。
    また、[ファイルを開く]ダイアログボックス右下の[ドロップダウンリスト]に表示される文字列の後ろに「()(括弧)」があります。その「()(括弧)」の中に指定したワイルドカードが表示されます。

例えば、[ファイルを開く]ダイアログボックスに拡張子が「.xlsx」のExcelファイルだけを表示したい場合、引数「FileFilter」は以下のように記述します。

FileFilter:= “Excelファイル , *.xlsx”

引数「FileFilter」の注意点

引数「FileFilter」に指定する文字列全体を「"”(ダブルコーテーション)」で囲ってください。

【正】FileFilter:= ファイルフィルタ文字列 , ワイルドカード
【誤】FileFilter:= ファイルフィルタ文字列 , ワイルドカード

上のようにファイルフィルタ文字列とワイルドカードを個別に「"”(ダブルコーテーション)」で囲むとエラーとなります。

GetOpenFilenameメソッドだけではファイルを開くことはできない

GetOpenFilenameメソッドの[ファイルを開く]ダイアログボックスでは、ユーザーが指定したファイルのフルパスを文字列で返すだけで、ファイルを開くことはできません。

ファイルを開くためには、WorkbooksコレクションのOpenメソッドを用いる必要があります。

GetOpenFilenameメソッドで「キャンセル」ボタンを押された時

GetOpenFilenameメソッドでは、ユーザーが[キャンセル]ボタンを押すと「False」という値を返します

【補足】
左上の[×]ボタンでダイアログボックスを閉じた場合でも「False」が返されます。

これを利用して、7行目から11行目の

If OpenFileName <> "False" Then
    Workbooks.Open OpenFileName
Else
    MsgBox "キャンセルされました"
End If

において、ユーザーが[キャンセル]ボタンが押したか押さなかったかをIf文で分岐しています。

  • [キャンセル]ボタンを押さなかった場合
  • WorkbooksコレクションのOpenメソッドでユーザーが指定したファイルを開きます。

  • [キャンセル]ボタンが押された場合
  • MsgBoxを用いてメッセージを表示するようにしています。

GetOpenFilenameメソッドの様々な使い方

[ファイルを開く]ダイアログボックスで表示されるファイルの拡張子を選択する

プログラム例

Sub ファイルを開くダイアログボックスを用いてファイルを開く02()

    Dim OpenFileName As String
    
    OpenFileName = Application.GetOpenFilename(FileFilter:="Wordファイル, *.docx")
 
    If OpenFileName <> "False" Then
        Workbooks.Open OpenFileName
    Else
        MsgBox "キャンセルされました"
    End If
    
End Sub

プログラム説明
[ファイルを開く]ダイアログボックスで表示されるファイルの拡張子を選択する

GetOpenFilenameメソッドの引数「FileFilter」にファイルフィルタ文字列ワイルドカードを記述することで、[ファイルを開く]ダイアログボックスで表示されるファイルの拡張子を選択することができます。

例えば、ファイルフィルタ文字列とワイルドカードを

FileFilter:=“Wordファイル, *.docx“

と記述することで、[ファイルを開く]ダイアログボックスで表示されるファイルの拡張子がWordファイル(*.docx)になります。

[ファイルを開く]ダイアログボックスの左上に表示される文字列を変更する

プログラム例

Sub ファイルを開くダイアログボックスを用いてファイルを開く03()

    Dim OpenFileName As String
    
    OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx", Title:="ダイアログボックスの名前を変えられます")
 
    If OpenFileName <> "False" Then
        Workbooks.Open OpenFileName
    Else
        MsgBox "キャンセルされました"
    End If
    
End Sub

プログラム説明
[ファイルを開く]ダイアログボックスの左上に表示される文字列を変更する

GetOpenFilenameメソッドの引数「Title」を記述することで、[ファイルを開く]ダイアログボックスの左上に表示される文字列を変更することができます。

例えば、

Title:="ダイアログボックスの名前を変えられます"

と記載すると、[ファイルを開く]ダイアログボックスの左上に表示される文字列は「ダイアログボックスの名前を変えられます」となります。

引数「Title」を記述しない場合はデフォルトが設定されます。デフォルトは「ファイルを開く」です。

[ファイルを開く]ダイアログボックスに表示するファイルの拡張子の数を指定する

プログラム例

Sub ファイルを開くダイアログボックスを用いてファイルを開く04()

    Dim OpenFileName As String
    
    OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx; *.xlsm")
 
    If OpenFileName <> "False" Then
        Workbooks.Open OpenFileName
    Else
        MsgBox "キャンセルされました"
    End If
    
End Sub

プログラム説明
[ファイルを開く]ダイアログボックスに表示するファイルの拡張子の数を指定する

引数「FileFilter」のワイルドカードを変更することで[ファイルを開く]ダイアログボックスに表示するファイルの拡張子の数を指定することができます。

  • ファイルの拡張子の数を1つに指定するとき
  • FileFilter:=”フィルタ文字列, ワイルドカード”

    の書式となります。例えば、

    FileFilter:="Excelファイル,*.xlsx"

    のように記述します。

    このように記述すると、[ファイルを開く]ダイアログボックスに表示される拡張子は「.xlsx」の1つのみになります。

  • ファイルの拡張子の数を複数指定するとき
  • FileFilter:=”フィルタ文字列, ワイルドカード1;ワイルドカード2”

    の書式となります。1つのファイルフィルタ文字列に複数のワイルドカードを対応させるには、ワイルドカードを「;(セミコロン)」で区切って指定します。

    例えば、

    FileFilter:="Excelファイル, ,*.xlsx ; *.xlsm"

    のように記述します。
    このように記述すると、[ファイルを開く]ダイアログボックスに表示される拡張子は「.xlsx」と「.xlsm」の2種類になります。

引数「FileFilter」のワイルドカードで「?」を用いて[ファイルを開く]ダイアログボックスに表示するファイルの拡張子の数を複数にする

プログラム例

Sub ファイルを開くダイアログボックスを用いてファイルを開く05()

    Dim OpenFileName As String
    
    OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls?")
 
    If OpenFileName <> "False" Then
        Workbooks.Open OpenFileName
    Else
        MsgBox "キャンセルされました"
    End If
    
End Sub

プログラム説明
引数「FileFilter」のワイルドカードを用いて[ファイルを開く]ダイアログボックスに表示するファイルの拡張子の数を複数にする

引数「FileFilter」のワイルドカードで「?」を用いることで[ファイルを開く]ダイアログボックスに表示するファイルの拡張子の数を複数にすることができます。

例えば、

FileFilter:=“全てのExcelファイル,*.xls?"

と記述すると、
[ファイルを開く]ダイアログボックスに表示される拡張子は「.xls」、「.xlsx」、「.xlsm」となります。

[ファイルを開く]ダイアログボックスに表示するファイルの拡張子を切り替える

プログラム例

Sub ファイルを開くダイアログボックスを用いてファイルを開く06()

    Dim OpenFileName As String
    
    OpenFileName = Application.GetOpenFilename("Excelファイル,*.xlsx,全てのファイル,*.*", FilterIndex:=2)
 
    If OpenFileName <> "False" Then
        Workbooks.Open OpenFileName
    Else
        MsgBox "キャンセルされました"
    End If
    
End Sub

プログラム説明
[ファイルを開く]ダイアログボックスに表示するファイルの拡張子を切り替える

[ドロップダウンリスト]に登録するファイルの拡張子を増やすことで、[ファイルを開く]ダイアログボックスに表示するファイルの拡張子を切り替えることができます。

[ドロップダウンリスト]に登録するファイルの拡張子の数だけ「ファイルフィルタ文字列 , ワイルドカード」のペアを記述します。各ペアは「,(カンマ)」で区切って指定します。

FileFilter:=”フィルタ文字列1, ワイルドカード1, フィルタ文字列2, ワイルドカード2, …”

例えば、以下のように記述したとします。

FileFilter:="Excelファイル,*.xlsx , 全てのファイル,*.*“

このように記述した場合、ユーザーが[ドロップダウンリスト]で

  • 「Excelファイル」を選択
  • 拡張子が「.xlsx」のファイルのみが[ファイルを開く]ダイアログボックスに表示されます。

  • 「全てのファイル」を選択
  • 全てのファイルが[ファイルを開く]ダイアログボックスに表示されます。

デフォルトで選択される[ドロップダウンリスト]を変える方法

「ファイルフィルタ文字列 , ワイルドカード」のセットを複数記述した場合、[ファイルを開く]ダイアログボックスが開いた時、最初に記述された「ファイルフィルタ文字列 , ワイルドカード」のセットが[ドロップダウンリスト]に表示されています。

例えば、

FileFilter:="Excelファイル,*.xlsx , 全てのファイル,*.*“

の場合では[ドロップダウンリスト]には「Excelファイル(*.xlsx)」が表示されます。

デフォルトで表示される「ファイルフィルタ文字列 , ワイルドカード」のセットを指定するにはGetOpenFilenameメソッドの引数「FilterIndex」を記述します。

引数「FilterIndex」の書式は以下のようになります。

FilterIndex:=数字

この数字は「ファイルフィルタ文字列 , ワイルドカード」のセットを記述した順に1,2,...となります。

例えば、

FileFilter:="Excelファイル,*.xlsx , 全てのファイル,*.*“,FilterIndex:=2

と記述すると、[ドロップダウンリスト]には「全てのファイル(*.*)」が表示されるようになります。

GetOpenFilenameメソッドの引数「MultiSelect」を用いて複数のファイルを選択

プログラム例

Sub ファイルを開くダイアログボックスを用いてファイルを開く07()

    Dim OpenFileName As Variant
    Dim OpenFileNameTarget As Variant
    
    OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx", MultiSelect:=True)
 
    If IsArray(OpenFileName) Then
        For Each OpenFileNameTarget In OpenFileName
            Workbooks.Open OpenFileNameTarget
        Next OpenFileNameTarget
    Else
        MsgBox "キャンセルされました"
    End If
End Sub

プログラム説明
GetOpenFilenameメソッドの引数「MultiSelect」を用いて複数のファイルを選択

複数のファイルを同時に開くプログラムは以下の処理に関して便利になります。

  • 月ごとのファイルデータから年間のまとめデータを作る
  • 複数のファイルデータを1つのファイルにまとめる

[ファイルを開く]ダイアログボックスから複数のファイルを開く方法は少し複雑になります。

GetOpenFilenameメソッドの引数「MultiSelect」を使うことで、[ファイルを開く]ダイアログボックスから複数のファイルを選択できるようになります。

引数「MultiSelect」の書式は以下のようになります。

MultiSelect:=TrueまたはFalse
  • 引数MultiSelectがTrueの時
  • 複数ファイル選択可能になります。

  • 引数MultiSelectがFalseの時
  • 1つのファイルしか選択できないようになります。

ここで注意点があります。

変数OpenFileNameはString型ではなくVariant型を選択してください

これは[キャンセル]ボタンを押されたときの処理で重要となります。

  • ファイルを選択し[開く]ボタンを押した場合
  • 変数OpenFileNameにはGetOpenFilenameメソッドの戻り値が入ります。この戻り値には選択したファイルのフルパスが配列として格納されます。

  • [キャンセル]ボタンが押した場合
  • 変数OpenFileNameにはFalseが格納されます。

ここで言いたいことは、ファイルを選択し[開く]ボタンを押した場合と[キャンセル]ボタンを押した場合で、変数OpenFileNameに入るデータの形が変わるということです。

そのため、変数OpenFileNameはVariant型で宣言しています。

次にIsArray関数を使って変数OpenFileNameが配列かどうかを調べます。IsArray関数の書式は以下のようになります。

IsArray(引数)

IsArray関数は引数として渡した変数が配列かどうかを調べます。

  • 引数が配列の場合
  • 戻り値にTrueを返します。

  • 引数が配列ではない場合
  • 戻り値にFalseを返します。

今回のプログラムでは、

  1. [ファイルを開く]ダイアログボックスで選択したファイルのフルパスを変数OpenFileNameに入れる
  2. IsArray関数で変数OpenFileNameが配列かどうか調べる
  3. 配列であれば、配列の数だけファイルを開く
  4. 配列でなければ、メッセージを表示する。

のようになっています。

ここで1点注意ですが、For Eachの制御変数OpenFileNameTargetはVariant型を宣言しています。これは、変数OpenFileNameTargetにはファイルのフルパスが入りますが、For Eachの制御変数ではString型は使えないためです。そのためVariant型を宣言しています。

開くフォルダを指定する方法

プログラム例

Sub ファイルを開くダイアログボックスを用いてファイルを開く08()

    Dim OpenFileName As String

    ChDrive "C"
    ChDir "C:\test"
    
    OpenFileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xlsx")
 
    If OpenFileName <> "False" Then
        Workbooks.Open OpenFileName
    Else
        MsgBox "キャンセルされました"
    End If
    
End Sub

プログラム説明
[ファイルを開く]ダイアログボックスで開くフォルダを指定する方法
GetOpenFilenameメソッドの[ファイルを開く]ダイアログボックスで開くフォルダはカレントフォルダ(カレントディレクトリ)になります。

カレントフォルダとはユーザーが現在作業を行っているフォルダのことです。
何かの作業をしていて、最後に開いていたフォルダがカレントフォルダになります。

カレントフォルダではなく、任意のフォルダを開くためには、[ファイルを開く]ダイアログボックスを表示するプログラムの前に、ChDriveステートメントChDirステートメントでカレントフォルダを移動する必要があります。

スポンサーリンク