VBAを使う際に、 「操作中のブックとは別のブックを開きたい!」 というケースや、 「テキストファイルにあるデータを使いたい!」 というケースが起こることはよくあると思います。
そんなとき、毎回そのファイルをエクスプローラーでフォルダを移動して開いて…ということをするのは手間がかかります。せっかくVBAを使っているんですから、そういった操作もマクロに組み込んで自動化できれば効率的ですよね。
そこで今回は、VBAを利用してファイルを開く際に使用できるメソッドやステートメントについて、詳しく解説していきたいと思います!
今回の記事では、以下の3つについて紹介します。
・Openメソッド
・GetOpenFilenameメソッド
・Openステートメント
それぞれの特徴や違いから、具体的な使用方法について順に説明していきますので、ぜひ参考にしてみてくださいね。
VBAのOpenメソッドとは?
まず初めに、Openメソッドの特徴から解説していきます。
Openメソッドとは、Excelワークブックとして開かれているファイルを表すメソッドです。
Workbookオブジェクトが持つメソッドの内の1つで、既存のワークブックやテキストファイルを開きたい場合に使用することができます。
同じ 「Open」 という名前でステートメントも存在していますが、OpenメソッドはWorkbookオブジェクトに対するメソッドであるため常にファイルがExcelワークブックとして開かれるのに対し、Openステートメントは単にファイルを開き、そのファイルへの読み書きの操作を有効にするための命令です。
ワークブックのみに限らずtxt形式の平文やCSVなどのテキストファイルを開くこともできますが、Openメソッドでは元のファイル形式を問わず全て Excelブックとして開かれます。
Excelブックを開くには?
Openメソッドを使用してExcelブックを開く場合は、以下のように記述します。
【基本構文】
// 変数に格納しない場合
Workbooks.Open "ファイル名"
// 格納する場合
Dim wb As Workbook
Set wb = Workbooks.Open("ファイル名")
Openメソッドは数多くの引数を取りますが、必須の項目は上記のファイル名のみです。
指定できる引数の全ての種類は以下の通りです。
【Openメソッドの引数一覧】
Workbooks.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)
項目がかなり多いため、基本的にはよく使用される引数だけ覚えておけば問題はありません。
代表的なものを以下の一覧にまとめました。
引数 | 説明 |
---|---|
FileName | 開きたいファイルのパスを指定 |
ReadOnly | 読み取り専用で開くかを指定(Trueの場合は読み取り専用) |
Password | パスワード保護付きファイルを開くためのパスワードを指定 |
WriteResPassword | 書き込み保護付きファイルに書き込むためのパスワードを指定 |
IgnoreReadOnlyRecommended | 読み取り専用推奨ファイルを書き込み権限で開く際に、警告を無視するかどうかを指定(Trueで非表示) |
CorruptLoad | ファイルが破損している場合の読み取り方法を指定 |
その他の引数や、より詳しい説明については、公式リファレンスの Workbooks.Open メソッド (Excel) を参考にしてください。
ファイルパスを指定して開く
それでは、サンプルコードを元に使い方を見ていきましょう。
Openメソッドを使用する際に、以下のようにパスを省略してファイル名のみ記述すると、カレントディレクトリーからファイルを取得しようとします。
【サンプルコード】
Workbooks.Open "SampleBook.xlsx"
ケースによっては意図せずエラーが発生する可能性が高くなってしまうため、ファイル名は必ずフルパスで指定するようにしましょう。
【サンプルコード(ファイル名をフルパスで指定)】
Workbooks.Open "C:\Users\User\Desktop\SampleBook.xlsx"
マクロが記述されているブックと同一フォルダであれば、以下のような書き方でも取得が可能です。
【サンプルコード】
Workbooks.Open Thisworkbook.Path & "\SampleBook.xlsx"
読み取り専用でファイルを開く
読み取り専用でブックを開きたい場合には、引数の 「ReadOnly」 をTrueで指定します。
【サンプルコード】
Workbooks.Open Filename:=Thisworkbook.Path & "\SampleBook.xlsx", ReadOnly:=True
Openメソッドでファイルを開く際の注意点
複数のワークブックを開きたい場合に便利な Openメソッドですが、使用の際には次の点に注意する必要があります。
- 指定したブックが存在しない場合
- 指定のブックがすでに開かれている場合
それぞれの場合について、詳しく見ていきましょう。
開こうとしているブック(ファイル)が存在しない
パスやファイル名が間違っている、あるいは既に削除されているなどの理由で、指定したファイル名のワークブックが存在しなかった場合、以下のエラーが発生します。

ブックを開く際には、事前にファイルが存在するかどうかのチェックを行うと良いでしょう。
ファイルチェックには、Dir関数を使用することができます。
【サンプルコード】
Sub sampleOpen1()
If dir( Thisworkbook.Path & "¥SampleBook.xlsx" ) <> "" Then
Workbooks.Open Thisworkbook.Path & "¥SampleBook.xlsx"
Else
MsgBox "SampleBook.xlsx が存在しません"
End If
End Sub
【実行結果】

Dir関数では、ファイルが見つからない場合に空文字を返却するため、戻り値を基準に条件分けを行っています。
開こうとしているブック(ファイル)を既に開いている
Excelでは、ファイルの保存場所に関わらず 「同名のExcelブックが開けない」 という制約が存在します。
例えば以下のように、デスクトップにある 「SampleBook.xlsx」 と、ドキュメントフォルダにある 「SampleBook.xlsx」 を同時に開こうとしても、先に記述されている方のブックのみしか開かれません。
【サンプルコード】
Sub sampleOpen2()
Workbooks.Open "C:\Users\User\Desktop\SampleBook.xlsx"
Workbooks.Open "C:\Users\User\Documents\SampleBook.xlsx"
End Sub
ブックを開く際には、ファイルの存在確認と合わせて、同名のファイルが既に開かれているかどうかを確認すると良いでしょう。
Workbooks プロパティを使用すると、現在開かれている全てのワークブックを取得することができます。
【サンプルコード】
Sub sampleOpen3()
If Dir( Thisworkbook.Path & "¥SampleBook.xlsx" ) <> "" Then
For Each wb In Workbooks
If wb.Name = "SampleBook.xlsx" Then
MsgBox "すでに同名のファイルを開いています"
Exit Sub
End If
Next wb
Workbooks.Open ( Thisworkbook.Path & "¥SampleBook.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で選択可) |
以下のサンプルコードで実際の動きを確認してみましょう。
【サンプルコード】
Sub sampleGetOpen1()
Dim ofn As String
ofn = Application.GetOpenFilename("Excel,*.xlsx")
If ofn <> "False" Then
Workbooks.Open (ofn)
Else
MsgBox "キャンセル"
End If
End Sub
【実行結果】

FileFilterには、「”説明文, 拡張子”」 の順で文字列を指定します。
キャンセルボタンが押されるとFalseが返されるため、条件分けを行うことも可能です。
ワイルドカードを使用する
拡張子の指定には、ワイルドカードを使用することもできます。
例えば、Excelの拡張子には通常の 「xlsx」 やマクロ有効ブックを示す 「xlsm」、Excel2003までの拡張子である 「xls」 などいくつかの種類があるため、それら全てをまとめて指定する場合になどに有効です。
サンプルコードで確認してみましょう。
【サンプルコード】
Sub sampleGetOpen2()
Dim ofn As String
ofn = Application.GetOpenFilename("Excel,*.xls?")
If ofn <> "False" Then
Workbooks.Open (ofn)
Else
MsgBox "キャンセル"
End If
End Sub
【実行結果】

複数の拡張子を候補として開く
1つの選択肢に対して複数の拡張子を候補として登録したい場合に、以下のように 「; (セミコロン)」 で区切って記述する方法があります。
【基本構文】
Application.GetOpenFilename("ファイル, *.xlsx ; *.csv")
また、選択肢を複数表示したい場合は以下のように、 説明文と拡張子のセットをカンマで区切って反復します。
【基本構文】
Application.GetOpenFilename("Excel, *.xlsx, CSV, *.csv")
サンプルコードで確認してみましょう。
【サンプルコード】
Sub sampleGetOpen3()
Dim ofn As String
ofn = Application.GetOpenFilename("Excel, *.xlsx ; *.xlsm, CSV, *.csv")
If ofn <> "False" Then
Workbooks.Open (ofn)
Else
MsgBox "キャンセル"
End If
End Sub
【実行結果】

このように、複数の拡張子や選択肢を表示することができます。
【サンプルコード】
Sub sampleGetOpen4()
Dim ofn As String
ofn = Application.GetOpenFilename(FileFilter:="Excel, *.xls?", MultiSelect:=True)
If ofn <> "False" Then
Workbooks.Open (ofn)
Else
MsgBox "キャンセル"
End If
End Sub
【実行結果】

複数のファイルを選択して開く
複数のファイルを同時に指定したい場合は、引数の MultiSelectを Trueで指定しましょう。
【サンプルコード】
Sub sampleGetOpen4()
Dim ofn As String
ofn = Application.GetOpenFilename(FileFilter:="Excel, *.xls?", MultiSelect:=True)
If ofn <> "False" Then
Workbooks.Open (ofn)
Else
MsgBox "キャンセル"
End If
End Sub
【実行結果】

Excelブック以外のファイル(テキストファイル、CSV)を開く
続いて、テキストファイルやCSVファイルを読み込む方法について紹介します。
先ほど解説した Openメソッドでもファイルを開くことは可能ですが、その他の方法として Openステートメントを使用する方法があります。
詳しい使い方について見ていきましょう。
Openステートメントでファイルを開く
外部ファイルを開いてデータを取得する際によく使用されるのが、Openステートメントです。
基本構文は以下のように記述します。
【基本構文】
Open “ファイル名” For アクセスモード As #ファイル番号
必須の引数は、上記の 「ファイル名(pathname)」、 「アクセスモード(mode)」、 「ファイル番号(filenumber)」の3つです。
その他にも、任意で指定できる引数を全て含めると、次のような形式になります。
Open pathname For mode [access] [lock] As [#]filenumber [Len=reclength]
ファイル名以外の各引数については、以下に説明をまとめたのでご覧ください。
【mode】
ファイルを開く際のアクセスモードを指定します。既定は Randomです。
・Random
ランダムアクセスモードを指定します。
固定長データファイルを入出力したい場合に使用し、Get と Put ステートメントを使って読み書き込みを行います。
・Input
シーケンシャル入力モードを指定します。
Line Input と Input ステートメントを使用して、先頭から順にファイルを読み込みます。
・Output
シーケンシャル出力モードを指定します。
Write と Print ステートメントを使用して、先頭から順にファイルに書き込みます。
・Append
同じくシーケンシャル出力モードを指定しますが、Outputが上書き形式なのに対し、ファイルの終端に内容を書き込む追加形式となります。
・Binary
バイナリファイルモードを指定します。
バイナリファイルを入出力したい場合に使用し、Get ステートメントと Put ステートメントを使って読み書きを行います。
【access】
開いたファイルに対して許可する操作を指定します。
指定のアクセスモードの処理と矛盾する accessタイプを選ぶとエラーが発生します。
・Read
Input モードの既定タイプ。読み込み専用で開きます。
・Write
Output、Append、Binary モードの既定タイプ。書き込み専用で開きます。
・Read Write
Random モードの既定タイプ。読み書き可能で開きます。
【lock】
別プロセスからアクセスされた場合に、そのファイルをどのように共有するかを指定します。
既定は Shared です。
・Shared
ファイルはロックされず、別プロセスからも読み書き込みが可能です。
・Lock Read
別プロセスからの読み込みを禁止します。
・Lock Read Write
別プロセスからのファイルの読み書きを禁止します。
・Lock Write
別プロセスからの書き込みを禁止します。(既に Writeアクセスで開かれていない場合のみ)
【filenumber】
OS上のファイル管理に必要なファイル番号を指定します。
番号の重複は不可のため、FreeFile関数で使用可能なファイル番号を取得するとより安全です。
【reclength】
Randomモードで開いた場合に、この引数で指定した数値がファイルのレコード長となります。
テキストデータを読み込む
テキストデータを読み込む場合は、Line Input# ステートメントと組み合わせて使用します。
Line Input#ステートメントは、指定のファイルを1行ずつ読み取り、その内容をString型変数に格納するステートメントです。
使用する際の構文は、以下のように記述します。
【基本構文】
Line Input #ファイル番号, 変数名
以下のサンプルコードで使い方を確認してみましょう。
【使用するテキストファイル】
# sample.text
Hello
World!
【サンプルコード】
Sub sampleLineInput()
Dim str As String
If dir(ThisWorkbook.path + "\sample.txt") = "" Then
MsgBox "ファイルが存在しません"
Exit Sub
End If
Open ThisWorkbook.path + "\sample.txt" For Input As #1
Do While Not EOF(1)
Line Input #1, txt
str = str + txt + vbCrLf
Loop
MsgBox str
Close #1
End Sub
【実行結果】

CSVデータを読み込む
CSVデータを読み込む場合は、Input#ステートメントを使用すると便利です。
Input# ステートメントでは、 「,(カンマ)」 や改行でデータが区切られ、引数に指定した変数に代入されます。
使用する際の構文は、以下のように記述します。
【基本構文】
Input # filenumber, var1, var2, ・・・
変数は複数指定することも可能です。
以下のサンプルコードで実際の動きを見てみましょう。
【CSVファイル】
# sample.csv
ID,商品
"001",りんご
"002",みかん
【サンプルコード】
Sub sampleInput1()
Dim str As String
If dir(ThisWorkbook.path + "\sample.csv") = "" Then
MsgBox "ファイルが存在しません"
Exit Sub
End If
Open ThisWorkbook.path + "\sample.csv" For Input As #1
Do While Not EOF(1)
Input #1, txt1, txt2
str = str + txt1 + " " + txt2 + vbCrLf
Loop
MsgBox str
Close #1
End Sub
【実行結果】

上記の例ではダイアログ表示するのみなので問題ありませんが、 文字列として処理している 「001」 や 「002」 といった数値をそのままセルに代入してしまうと、Excelの仕様により 「1」 や 「2」 といった数値に自動で変換されてしまいます。
そのまま文字列として代入したい場合は、セルの書式を NumberFormatで変更しましょう。
・CSV
# sample.csv
"001","002","003"
【サンプルコード】
Sub sampleInput2()
Dim str As String
If dir(ThisWorkbook.path + "\sample.csv") = "" Then
MsgBox "ファイルが存在しません"
Exit Sub
End If
Open ThisWorkbook.path + "\sample.csv" For Input As #1
Do While Not EOF(1)
Input #1, txt1, txt2, txt3
Cells(1, 1).NumberFormat = "@"
Cells(1, 1).Value = txt1
Cells(1, 2).NumberFormat = "@"
Cells(1, 2).Value = txt2
Cells(1, 3).NumberFormat = "@"
Cells(1, 3).Value = txt3
Loop
Close #1
End Sub
【実行結果】

開いたファイルを閉じる
開いたファイルの処理が完了したら、Closeステートメントを使って必ずファイルを閉じるようにしましょう。
ファイルを閉じることで、割り振られたファイル番号が開放されます。
【基本構文】
Close ファイル番号1, ファイル番号2 ...
引数のファイル番号を省略すると、Openステートメントで開いた全てのファイルが閉じられます。
まとめ
いかがでしたか?
今回は、VBAでファイルを開く方法について解説しました。
VBAで組んだマクロの中でファイルを開けるようになれば、自動化できる作業の幅も広がります。
それぞれの方法に、使用するメリットや適したケースがありますので、開きたいファイル形式などに合わせて使い分けをしていきましょう!
VBAの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。