今回は、VBAを使って別ブックを開く方法をまとめて紹介します。
特定ブックを開く
特定のブックを開く場合は、WorkbooksコレクションのOpenメソッドで開きます。
Workbooks.Open ファイルパス
ファイルパスとは開きたいファイルがどこのドライブのどこのフォルダにあるかを指定することです。
(例)Workbooks.Open ”C:\Desktop\エクセルVBA講座.xlsx”
上記の例はCドライブ内のデスクトップにある「エクセルVBA講座.xlsx」のファイルパスを取得して開きます。
記述のルール
- ファイルパスは文字列の取り扱いでダブルクォーテーション(”)で囲む
- ドライブやファイル名の間には必ず¥をいれる(「~の」と訳すとわかりやすい)
ファイルパスの取得方法
エクスプローラでファイルを選択→リボン:「ホーム」タブ→「パスのコピー」で取得できます。
ただ、このようにフルパスでファイルを開く場合、ファイルの保存場所を移動してしまった時にエラーとなり不便です。
解決策として、ThisWorkbook.Pathを使います。
ThisWorkbook.Path
基本的にマクロで操作したいブックがある場合、マクロを組んでいるブックと同じフォルダに予め入れておくことをオススメします。
その場合は、ThisWorkbook.Pathと書けばマクロを組んでいるブックと同じフォルダのパスを取得できます。
Workbooks.Open ThisWorkbook.Path & ”\エクセルVBA講座.xlsx”
※ThisWorkbook.Pathとファイル名を繋げるには &(アンパサンド)を使います。
GetOpenFilenameメソッドでファイルを開く
ApplicationオブジェクトのGetOpenFilenameメソッドを使用すると、下図のように「ファイルを開く」ダイアログボックスが出現して、ユーザーが自由にファイル選択できます。
開くファイルが特定されていない場合に非常に便利です。
GetOpenFilenameメソッドの引数
GetOpenFilename( FileFilter,FilterIndex, Title, ButtonText, MultiSelect)
FileFilter | Variant ファイルの候補を指定する文字列 (ファイル フィルター文字列) を指定します。 |
FilterIndex | Variant FileFilter で指定したファイル フィルター文字列の中で、1 から何番目の値を既定値とするかを指定します。 この引数を省略するか、ファイル フィルター文字列の数より大きい数値を指定すると、最初のファイル フィルター文字列が既定値となります。 |
Title | ダイアログ ボックスのタイトルを指定します。 この引数を省略すると “ファイルを開く” になります。 |
ButtonText | Variant Macintosh でのみ指定できます。 |
MultiSelect | Variant True を指定すると、複数のファイルを選択できます。 False を指定すると、1 つのファイルしか選択できません。 既定値は False です。 |
引数は上記の通りです。FileFilter以外省略可能です。主要引数のみ説明します。
FileFilter
引数:FileFilterは以下の2つをペアで指定します。
- ファイルの種類を表す任意の文字列
- (ワイルドカード使用)ファイルの拡張子
ルール:1と2をカンマで区切ります。引数全体をダブルクォーテーションで囲みます。
Sub sample()
Dim FileName
FileName = Application.GetOpenFilename("普通のExcel,*.xlsx")
If FileName = False Then
Exit Sub
End If
Workbooks.Open FileName
End Sub
コード説明
- バリアント型変数「FileName」を宣言
- バリアント型変数「FileName」にGetOpenFilenameメソッドで選択したファイルパスを格納
- バリアント型変数「FileName」がFalseでなければ、Openメソッドでファイルを開く
上記コードでは
Application.GetOpenFilename(“普通のExcel,*.xlsx”)
となっており、「普通のExcel」と表示されて、xlsx拡張子のファイルのみが出現します。
また、下のコードのようにすればxlsx(Excelブック)とxlsm(Excelマクロブック)の両方が出現します。
Application.GetOpenFilename(“エクセルブック,*.xls*”)
複数種類のファイルを指定する場合
複数の種類のファイルを表示させたい時は、1つの時と基本的には一緒です。
- ファイルの種類を表す任意の文字列
- (ワイルドカード使用)ファイルの拡張子
上記の1と2のペアを2つ目以降もカンマ区切りで書いていきます。
「”ファイル名(文字列)、ファイルの拡張子、ファイル名(文字列)、ファイルの拡張子”」
例)Application.GetOpenFilename(“エクセルブック,*.xls*,テキスト,*.txt”)
↑とすればxls*(Excelブック)とtxt(テキストファイル)の両方が出現します。
2つ選択可能になります。
上図はエクセルブックを選んだ場合
上図はテキストファイルを選んだ場合
ファイル名は1つで複数の拡張子を表示させる場合
Application.GetOpenFilename(“ファイル,*.xls*;*.txt”)
上記のように、ファイルの種類を表す任意の文字列は”ファイル”で表示したい拡張子(,*.xlsと*.txt)をセミコロン(;)で区切ります。
エクセルファイルとテキストファイルが同時に表示されます。
ファイルを選択しなかった場合の処理
「ファイルを開く」ダイアログボックスでファイルを選択せずにキャンセルした場合、GetOpenFilenameメソッドは論理値としてFalseを返します。
つまり、そのままWorkbooks.OpenにFalseを格納した変数を渡してしまうと当然エラーになります。
よって、条件分岐にてFalseの場合の処理を入れておきます。
If FileName = False Then 'FileName変数がFalseの場合
Exit Sub 'プロシージャ終了
End If
複数ファイルの選択
「ファイルを開く」ダイアログボックスで複数のファイルを選択して、選択したファイルを一括処理する方法です。
GetOpenFilename( FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
GetOpenFilenameの引数:MultiSelectをTrueにします。
Trueにすることで複数のファイル選択が可能になります。
そして、引数:MultiSelectをTrueにした場合、GetOpenFilenameは配列を返します。
Sub Sample2()
Dim FileName As Variant
FileName = Application.GetOpenFilename(FileFilter:="複数ファイル,*.xls*;*.txt", _
MultiSelect:=True)
If Not IsArray(FileName) Then
Exit Sub
End If
Dim i As Long
For i = LBound(FileName) To UBound(FileName)
Debug.Print FileName(i)
Next i
End Sub
コード説明
FileName = Application.GetOpenFilename(FileFilter:=”複数ファイル,.xls;*.txt”, _
MultiSelect:=True)
引数:MultiSelectをTrueにしたGetOpenFilenameメソッドで変数:FileNameが配列形式になります。
If Not IsArray(FileName) Then
Exit Sub
End If
IsArray関数は変数が配列かどうか調べて、TrueまたはFalseで返します。
よって、上記コードはFalseの場合(配列ではない場合)、Exit Subでプロシージャ終了です。
Dim i As Long
For i = LBound(FileName) To UBound(FileName)
Debug.Print FileName(i)
Next i
ForNextステートメントでGetOpenFilenameメソッドで取得した配列変数に格納されたファイルを順番に処理していきます。
今回は、ファイル名を順番にイミディエイトウィンドウに表示させています。
↑複数ファイルを選択します。
イミディエイトウィンドウに選択したファイルパスが順番に表示されます。
これを応用して、順番に選択したファイルに任意の処理を実行することも可能です。
・筆者オススメのVBAの本はこちら↓
まとめ
今回は、以下の通り、別ファイルからのデータ転記を行うにあたって必要なファイルを開くメソッドについて紹介しました。
- WorkbooksコレクションのOpenメソッド
- GetOpenFilenameメソッド
次回は、ファイルダイアログ(FileDialog)について紹介します!お楽しみに!
コメント