VBAでファイルを読み込むにはOpenメソッドを使用します。
ファイルを読み込んでデータを取得したい
といった方にむけて、この記事ではExcelブックやテキストファイル、CSVなどファイルを読み込んでデータを取得する方法について解説していきます。
- Excelブックを開く方法
- ブックを開く際の注意点
- ダイアログでフォルダを指定してファイルを選択
- テキスト、CSVファイルを読み込む
VBAでのデータ読み込み方法を網羅的に解説していますので、ぜひ参考にしてください!
Excelブックを開く方法
Excelブックを開くには、WorkbooksコレクションのOpenメソッドを使用します。
Openメソッドは以下のように記述します。
Workbooks.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)
これだけの引数を設定することができますが、ちょっと多すぎるので使いそうな引数だけ表にしてみました。
引数 | 説明 |
---|---|
FileName | 開くブックのファイル名 |
ReadOnly | Trueの場合、読み取り専用モード デフォルト値はFalse |
Password | 読み取りのパスワード |
WriteResPassword | 書き込みのパスワード |
ファイルパスを指定して開く
それでは、ファイルパスを指定してブックを開く方法について実際にみていきましょう。VBAを記述しているブックと同じフォルダに存在する”Book1.xlsx”を開くサンプルコードになります。
Sub macro1() Workbooks.Open ("Book1.xlsx") End Sub
読み取り専用で開く
読み取り専用でブックを開くには、Openメソッドの引数ReadOnlyをTrueで指定します。
サンプルコードで確認しましょう。
Sub macro2() Workbooks.Open Filename:="Book1.xlsx", ReadOnly:=True End Sub
ファイルを開く際の注意点
ブックを開く際には次のことに注意する必要があります。
- ブックが存在しない場合
- すでに開いている場合
それぞれの場合について、詳しく見ていきましょう。
ブックが存在しない場合
ブックが存在しない場合は、エラーが発生します。ブックを開く前に、存在するかチェックするようにしましょう。存在するかチェックするには、Dir関数を使います。
Dir関数は引数に指定したファイルが見つからない場合、空文字を返します。Dir関数の戻り値が空文字でない場合に、ファイルを開くようにしましょう。
サンプルコードは以下のようになります。
Sub macro3() If Dir("Book1.xlsx") <> "" Then Workbooks.Open ("Book1.xlsx") Else MsgBox "ファイルが存在しません" End If End Sub
Dir関数の使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。
すでに開いている場合
Excelのブックはすでに開いていると、Openメソッドではエラーになります。ブックが開いているかチェックするようにしましょう。ブックが開いていれば、Workbooksコレクションのメンバに含まれています。
Workbooksコレクションのメンバの名前をNameプロパティで取得して、開きたいブック名と一致しなければ、Openメソッドで開くことが可能です。
Sub macro4() If Dir("Book1.xlsx") <> "" Then For Each wb In Workbooks If wb.Name = "Book1.xlsx" Then MsgBox "すでに開いています" Exit Sub End If Next wb Workbooks.Open ("Book1.xlsx") Else MsgBox "ファイルが存在しません" End If End Sub
ダイアログでフォルダを指定して選択
ダイアログでブックを選択して開く場合には、ApplicationオブジェクトのGetOpenFilenameメソッドを使用します。
GetOpenFilenameメソッドは以下のように記述します。
Application.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
いずれの引数も省略することができます。それぞれの引数の説明について表にまとめます。
引数 | 説明 |
---|---|
FileFilter | ファイルフィルター文字列 |
FilterIndex | FileFilterで指定した文字列の中で、 何番目の値をデフォルト値とするか指定 デフォルト値は最初の文字列 |
Title | ダイアログボックスのタイトルを指定 デフォルト値は”ファイルを開く” |
ButtonText | Macでのみ指定可能 |
MultiSelect | Trueの場合、複数のファイルを選択可能 Falseの場合、1つのファイルのみ選択可能 デフォルト値はFalse |
引数FileFilterは以下のように2つをセットで指定します。
“ファイルの種類を説明する任意の文字列, ファイルの拡張子”
それではサンプルコードで確認しましょう。
Sub macro5() Dim ofn As String ofn = Application.GetOpenFilename("ブック, *.xlsx") If ofn <> "False" Then Workbooks.Open (ofn) Else MsgBox "キャンセルされました" End If End Sub
実行結果:
GetOpenFilenameメソッドはダイアログでキャンセルボタンが押されるとFalseを返します。ですので、このサンプルコードではFalseが返される場合はMsgBoxを表示するようにしています。
False以外の場合は、Openメソッドを使って返されたファイル名のブックを開くようにしています。
ワイルドカードで開く
拡張子を指定してダイアログに候補を表示する場合に、拡張子の指定にワイルドカードを使うこともできます。Excelには通常の拡張子「xlsx」やマクロ有効ブックの拡張子「xlsm」、Excel2003までの拡張子「xls」などいくつかの拡張子があります。
ですので「xlsx」、「xlsm」、「xls」などの拡張子全てが候補として表示されるように、ワイルドカード文字「?」を使って指定すると便利です。
サンプルコードで確認しましょう。
Sub macro5() Dim ofn As String ofn = Application.GetOpenFilename("ブック, *.xls?") If ofn <> "False" Then Workbooks.Open (ofn) Else MsgBox "キャンセルされました" End If End Sub
実行結果:
ワイルドカードについては、こちらで詳しく解説していますので、ぜひ参考にしてください。
複数の拡張子を候補として表示する方法
ダイアログで複数の拡張子を候補として表示したい場合もあります。そのような場合は以下のように「;」(セミコロン)で区切ります。
“ファイルの種類を説明する任意の文字列, *.xls? ; *.csv”
複数の拡張子を登録するには「任意の文字列, 拡張子」のセットを「,」(カンマ)で区切ります。
“ブック, *.xlsx, マクロ, *.xlsm, CSV, *.csv”
サンプルコードで確認しましょう。
Sub macro10() Dim ofn As String ofn = Application.GetOpenFilename("ブック, *.xlsx, マクロ, *.xlsm, CSV, *.csv") If ofn <> "False" Then Workbooks.Open (ofn) Else MsgBox "キャンセルされました" End If End Sub
実行結果:
複数ファイルを選択する方法
一つのフォルダから複数のファイルを開きたい場合もあります。
そのような場合はGetOpenFilenameメソッドの第5引数MultiSelectをTrueで指定します。
サンプルコードで確認しましょう。
Sub macro9() Dim ofn As String ofn = Application.GetOpenFilename("ブック, *.xls?", , , , True) If ofn <> "False" Then Workbooks.Open (ofn) Else MsgBox "キャンセルされました" End If End Sub
実行結果:
テキスト、CSVファイルを読み込む
次は、テキストファイルやCSVファイルを読み込む方法について説明していきます。なお、CSVファイルの拡張子「.csv」はExcelで開くように関連付けしていると、ブックと同じように開くと思われるかもしれません。
しかし、CSVファイルはテキストファイルと同じテキスト形式ですので、これからご紹介する方法でファイル開いて、読み込みます。
ファイルを読み込むには、
- ファイルを開く
- データを読み込む
- ファイルを閉じる
の順で処理を行う必要があります。順に解説していきます。
ファイルを開く
ファイルを開くには、Openステートメントを使います。Openステートメントは以下のように記述します。
Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]
「[ ]」内は省略することができます。
引数が多いので表にまとめました。
引数 | 定数 | 説明 |
---|---|---|
pathname | ー | ファイルのパス |
mode | Append | 追記の書き込みモード |
Binary | バイナリモード | |
Input | 読み込みモード | |
Output | 上書きの書き込みモード | |
Random | ランダムアクセスモード | |
access | Read | 読み込み専用 |
Write | 書き込み専用 | |
Read Write | 読み書き | |
lock | Shared | 他プロセスからの読み書き可 |
Lock Read | 他プロセスからの読み込み不可 | |
Lock Write | 他プロセスからの書き込み不可 | |
Lock Read Write | 他プロセスからの読み書き不可 | |
fileNumber | ー | 任意のファイル番号 1~511の数値 FreeFile関数で取得 |
recLength | ー | Randomモードの場合、レコード長 デフォルト値はバッファ容量 32,767バイト以下の数値 |
Append、Binary、Output、またはRandomモードで開いた場合、pathnameで指定したファイルが存在しないときは、ファイルが作成されます。ファイルがすでに別のプロセスによって開かれていて、指定した種類のアクセスが許可されない場合は、Open処理は失敗しエラーが発生します。
ファイルを開く方法をサンプルコードで確認しましょう。
Sub macro6() Dim n As Integer If Dir("test.txt") = "" Then MsgBox "ファイルが存在しません" Exit Sub End If n = FreeFile Open "test.txt" For Input As #n Close #n End Sub
このサンプルコードでは、Openステートメントを使って読み込みモードでファイルを開いています。Closeステートメントについては、後ほど詳しく解説します。
テキストデータを読み込む
テキストデータを読み込むには、Line Input #ステートメントを使います。Line Input #ステートメントはファイルから1行読み取って、その内容をString型変数に格納します。
Line Input #ステートメントは以下のように記述します。
Line Input # filenumber, varname
引数filenumberはファイル番号を指定します。引数varnameは読み取った内容を格納するString型の変数名です。
サンプルコードで使い方を確認しましょう。なお、読み込む”test.txt”ファイルの内容は以下のとおりです。
test.txt:
侍 エンジニア 塾
Sub macro7() Dim n As Integer, i As Integer, txtLine As String If Dir("test.txt") = "" Then MsgBox "ファイルが存在しません" Exit Sub End If n = FreeFile Open "test.txt" For Input As #n Do While Not EOF(n) i = i + 1 Line Input #n, txtLine Cells(i, 1).Value = txtLine Loop Close #n End Sub
実行結果:
CSVデータを読み込む
カンマ区切りのCSVデータを読み込むには、Input #ステートメントを使う方が便利です。
Input #ステートメントはファイルからデータを読み取り、「,」で区切られたデータをそれぞれの変数へ格納することができます。Input #ステートメントは以下のように記述します。
Input # filenumber, var1, var2, ・・・
引数filenumberはファイル番号を指定します。引数var1, var2, ・・・は読み取った値を格納する変数を指定します。
サンプルコードで確認しましょう。なお、読み込む”test1.csv”ファイルの内容は以下のとおりです。
test1.csv:
侍,エンジニア,塾
Sub macro8() Dim n As Integer, i As Integer Dim str1 As String, str2 As String, str3 As String If Dir("test1.csv") = "" Then MsgBox "ファイルが存在しません" Exit Sub End If n = FreeFile Open "test1.csv" For Input As #n Do While Not EOF(n) i = i + 1 Input #n, str1, str2, str3 Cells(i, 1).Value = str1 Cells(i, 2).Value = str2 Cells(i, 3).Value = str3 Loop Close #n End Sub
実行結果:
上のサンプルでは文字列を入力しましたが、数値を読み込んでセル入力するケースもありますよね。数値の場合は、「001」のようなケースだと「1」と入力されてしまうため、セルの書式を文字列に変更してから入力します。
セルの書式は、NumberFormatを指定することで変更することができます。
test2.csv:
001,002,003
Sub macro9() Dim n As Integer, i As Integer Dim str1 As String, str2 As String, str3 As String If Dir("test2.csv") = "" Then MsgBox "ファイルが存在しません" Exit Sub End If n = FreeFile Open "test2.csv" For Input As #n Do While Not EOF(n) i = i + 1 Input #n, str1, str2, str3 Cells(i, 1).NumberFormat = "@" Cells(i, 1).Value = str1 Cells(i, 2).NumberFormat = "@" Cells(i, 2).Value = str2 Cells(i, 3).NumberFormat = "@" Cells(i, 3).Value = str3 Loop Close #n End Sub
実行結果:
ファイルを閉じる
ファイルを閉じるには、Closeステートメントを使います。Closeステートメントは以下のように記述します。
Close [[#]filenumber] [, [#]filenumber] . . .
「[ ]」内は省略することができます。
filenumberを省略する場合、Openステートメントによって開かれたすべてのファイルが閉じられます。Output、またはAppendで開かれたファイルを閉じると、すべてのバッファー領域が解放されます。
Closeステートメントを実行すると、ファイルとそのファイル番号の関連付けが無効になります。
まとめ
ここでは、ファイルを開く方法について説明しました。
Excelのブックを開くにはWorkbooksコレクションのOpenメソッドを使用します。また、テキストファイルやCSVファイルを開くにはOpenステートメントを使用します。
どちらも使いこなすことができるように、この記事を何度も参考にして下さいね!