【VBA入門】OpenメソッドでテキストファイルやCSVの読み込み

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開くブックのファイル名
ReadOnlyTrueの場合、読み取り専用モード
デフォルト値は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ファイルフィルター文字列
FilterIndexFileFilterで指定した文字列の中で、
何番目の値をデフォルト値とするか指定
デフォルト値は最初の文字列
Titleダイアログボックスのタイトルを指定
デフォルト値は”ファイルを開く”
ButtonTextMacでのみ指定可能
MultiSelectTrueの場合、複数のファイルを選択可能
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

実行結果:
Open06

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

実行結果:
Open03

ワイルドカードについては、こちらで詳しく解説していますので、ぜひ参考にしてください。

複数の拡張子を候補として表示する方法

ダイアログで複数の拡張子を候補として表示したい場合もあります。そのような場合は以下のように「;」(セミコロン)で区切ります。

“ファイルの種類を説明する任意の文字列, *.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

実行結果:
Open05

複数ファイルを選択する方法

一つのフォルダから複数のファイルを開きたい場合もあります。

そのような場合は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

実行結果:
Open04

テキスト、CSVファイルを読み込む

次は、テキストファイルやCSVファイルを読み込む方法について説明していきます。なお、CSVファイルの拡張子「.csv」はExcelで開くように関連付けしていると、ブックと同じように開くと思われるかもしれません。

しかし、CSVファイルはテキストファイルと同じテキスト形式ですので、これからご紹介する方法でファイル開いて、読み込みます。

ファイルを読み込むには、

  • ファイルを開く
  • データを読み込む
  • ファイルを閉じる

の順で処理を行う必要があります。順に解説していきます。

ファイルを開く

ファイルを開くには、Openステートメントを使います。Openステートメントは以下のように記述します。

Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]

「[ ]」内は省略することができます。

引数が多いので表にまとめました。

引数定数説明
pathnameファイルのパス
modeAppend追記の書き込みモード
Binaryバイナリモード
Input読み込みモード
Output上書きの書き込みモード
Randomランダムアクセスモード
accessRead読み込み専用
Write書き込み専用
Read Write読み書き
lockShared他プロセスからの読み書き可
Lock Read他プロセスからの読み込み不可
Lock Write他プロセスからの書き込み不可
Lock Read Write他プロセスからの読み書き不可
fileNumber任意のファイル番号
1~511の数値
FreeFile関数で取得
recLengthRandomモードの場合、レコード長
デフォルト値はバッファ容量
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

実行結果:
Open01

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

実行結果:
Open02

上のサンプルでは文字列を入力しましたが、数値を読み込んでセル入力するケースもありますよね。数値の場合は、「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ステートメントを使用します。

どちらも使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次