「ファイルを開く」ダイアログボックス から ファイル名を取得(Excel VBA)

【本日のミッション】

Excel VBA を使って「ファイルを開く」ダイアログボックスを表示させ、任意のファイル名を取得し、ファイルを開け。
「キャンセル」を選択してもエラーが出ないようにするべし!

ミッションの概要

今回のミッションは、「ファイルを開く」ダイアログを表示させ、任意のファイルを選べるようにする、というものです。

ダイアログのタイトルや、ファイルの種類を自分好みにカスタマイズしましょう。
また、ダイアログで「キャンセル」した場合の処理も考えましょう。

プロシージャ

Sub ダイアログからファイルを開く()

    Dim fn As String
    
    'ダイアログ表示
    fn = Application.GetOpenFilename("Microsoft Excelブック,*.xls*,テキストファイル,*.txt;*.csv", , "お好みのファイルを選んでください♪")
    
    'ファイルが選択された場合は開く
    If fn <> "False" Then
        Workbooks.Open fn
    End If
    
End Sub

記入したプロシージャ(Sub~End Subまで)のどこかにカーソルを置いてF5キーをクリックしてください。

ダイアログが開き、ファイルを選択するとファイルが開き、キャンセルすると何もおこりませんね♪

GetOpenFilenameメソッド

GetOpenFilenameメソッドは、「ファイルを開く」ダイアログボックスを表示させ、選択したファイルのフルパスを返します。

ただし、引数MultiSelectを「False」 とした場合は、選択したファイルのパスが配列で返ります。この場合は、コードが異なりますので、次回お話しさせていただきます。

Application.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

引数名説明省略
FileFilterファイルの種類・拡張子を指定する文字列(ファイルフィルタ文字列)を指定します。
省略すると “すべてのファイル (*.*),*.*”になります。
FilterIndex引数FileFilterで指定したファイルフィルタ文字列の中で、1から何番目のFileFilterを既定値とするかを指定します。
省略または、引数FileFilter文字列の数より大きい数値を指定すると、最初のFileFilter文字列が既定値となります。
Titleダイアログボックスのタイトルを指定します。
省略すると “ファイルを開く” になります。
ButtonTextMacintosh でのみ指定できます
MultiSelectTrue:複数のファイルを選択できます。
False:1 つのファイルしか選択できません。(規定値)

今回のコードはこんな感じに記述しています。
引数を1つ目から順番に並べ、第2引数は省略しているので空欄にしています。

省略する引数を空欄にするのもOKなのですが、どの引数が何番目だっけ???とわからない場合は、必要な引数だけ「引数名:=引数の値」と指定することができます。

Title

ダイアログの上のバーに表示される文字です。
省略すると “ファイルを開く”になるのですが、せっかくなのでメッセージ風にしてみました。

FileFilter

ファイルの種類・拡張子を指定する文字列です。
省略すると “すべてのファイル (*.*),*.*”になりますが、選択するファイルの種類が決まっているのなら、指定するとダイアログに表示されるファイルが限定されるので、ファイルを選択しやすくなります。

ファイルの種類1つにつき、下記2つの情報をセットにして指定します。
指定するときは、2つの情報の間にカンマ「,」を入れます。
拡張子指定時に使用するワイルドカードの使い方についてはこちらを参照→ワイルドカードとは。使い方いろいろ。(Excel)

  • ファイルの種類を指定する文字列
  • ファイルの拡張子
Application.GetOpenFilename("ファイルの種類を指定する文字列,ファイルの拡張子")
Application.GetOpenFilename("Microsoft Excelブック,*.xls*")

1つのファイルの種類に、複数の拡張子を表示する場合は、拡張子の間にセミコロン「;」を入れます。

Application.GetOpenFilename("テキストファイル,*.txt;*.csv")

複数のファイルの種類を表示する場合は、「ファイルの種類,拡張子」のセットをカンマ「,」で区切ります。カンマだらけになってしまいます。

Application.GetOpenFilename("ファイルの種類,拡張子,ファイルの種類,拡張子,ファイルの種類,拡張子")
Application.GetOpenFilename("Microsoft Excelブック,*.xls*,テキストファイル,*.txt,テキストファイル,*.csv")

もしも、こんなおふざけな指定をしてしまっても・・・

Application.GetOpenFilename("えくせる,*.xls*,てきすと,*.txt;*.csv")

指定した通りの内容で表示されます。

でも、かっこよく指定したい!という場合は、Excelの「ファイルを開く」ダイアログボックスのファイルの種類の文字をマネしておきましょう。誰からも突っ込まれないでしょう。

FilterIndex

引数FileFilterで指定したファイルフィルタ文字列の中で、1から何番目のFileFilterを既定値とするかを指定します。

今回のように省略または、引数FileFilter文字列の数より大きい数値を指定すると、最初のFileFilter文字列が既定値となります。

Application.GetOpenFilename("Microsoft Excelブック,*.xls*,テキストファイル,*.txt;*.csv", , "お好みのファイルを選んでください♪")

2番目のファイルの種類を規定値としたい場合は下記のようにします。

MultiSelect

True:複数のファイルを選択できます。
False:1 つのファイルしか選択できません。(規定値)

となりますが、MultiSelectを使用するとコード全体を変更しないといけないので、次回にご説明させていただきます。

【参考】

指定したフォルダ内のファイル名全てを取得(Excel VBA)
変数でよく使われる「buf」「tmp」の意味
Dir関数が取得するファイルの順番
指定したフォルダ内のフォルダ名全てをGetAttrを使って「エラー53 ファイルが見つかりません。」を出さずに取得(Excel VBA)
GetAttrとは?「= vbDirectory」ではなく「And vbDirectory」となるビット演算の疑問
フォルダ名だけを取得したい時に出てくる 「.」 と 「..」 とは?
指定したフォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
CreateObject(“Scripting.FileSystemObject”) を使ってサブフォルダを取得
再帰処理とは?フォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
指定したフォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
再帰処理とは?フォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
参照渡し「ByRef」と値渡し「ByVal」の違い(Excel VBA)
ファイルのフルパスからファイル名のみを取得 InStrRev関数(Excel VBA)
指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
FileSystemObjectとは?CreateObject 関数 FolderExists・GetFolderの使い方
FileSystemObject CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止
再帰処理とは?指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
ファイルのフルパスからファイル名のみを取得 Split関数(Excel VBA)
Callステートメントとは 引数 括弧()の使い方(Excel VBA)
指定したフォルダ内から「特定の文字を含まないファイル名」を取得(Excel VBA)
ワイルドカードとは。使い方いろいろ。(Excel)
Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)
指定したフォルダのファイル名を取得し、そのファイル名を一括で変換(Excel VBA)
Excel起動時に「コンパイルエラー」。64ビット システムで Declareステートメントに、PtrSafe属性を設定(Excel VBA )
「ファイルを開く」ダイアログボックス から ファイル名を取得(Excel VBA)
「ファイルを開く」ダイアログボックス から 複数 ファイル名を取得(Excel VBA)
指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)
再帰処理とは?指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)

■■■スポンサーリンク■■■