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

【本日のミッション】

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

ミッションの概要

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

選択するファイルが1つの場合は「ファイルを開く」ダイアログボックス から ファイル名を取得(Excel VBA)をご覧ください。

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

プロシージャ

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

    Dim fn As Variant
    Dim openfn As Variant
    
    'ダイアログ表示
    fn = Application.GetOpenFilename("Microsoft Excelブック,*.xls*,テキストファイル,*.txt;*.csv", , "お好みのファイルを選んでください♪", , True)
    
    'ファイルが選択された場合は開く
    If IsArray(fn) Then
        For Each openfn In fn
            Workbooks.Open openfn
        Next
    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 つのファイルしか選択できません。(規定値)

となります。

今回のコードは複数ファイルを選択できるように「True」を指定しています。

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

引数に省略するものがある場合は、「引数名:=引数の値」の形で記述することも可能です。

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

今回変数「fn」には下記2つのデータ型が格納される可能性があります。

  • ダイアログでキャンセルを選択した場合:Boolean型「False」
  • 1つ以上のファイルが選択された場合:配列

なので、変数「fn」はVariant型で宣言しています。

Dim fn As Variant

では、「ファイルが選択されていたらファイルを開く、キャンセルがクリックされたら何もしない」という条件分岐なのですが、下記条件は使用できません。

If fn <> "False" Then

「fn」にファイル名の配列が格納されていた場合

「実行時エラー ’13′:型が一致しません」

というエラーが出てしまいます。

このエラーを回避するために、ここでの条件分岐にはIsArray関数を使用します。
「fn」が配列の場合「True」を返します。

If IsArray(fn) Then

配列と判断されたデータはFor Eachステートメントを使用して、変数「openfn」に一つずつ取り出し処理していきます。(参考:For Each ステートメントとは(Excel VBA)

For Each openfn In fn
    Workbooks.Open openfn
Next

【参考】

指定したフォルダ内のファイル名全てを取得(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)

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