エクセルマクロVBAを使ってファイルを開く処理をしたい場合があります。
この記事では、マクロVBAを使ったファイルを開く処理について事例をもとに紹介します。
目次
ファイルを開く1|エクセルファイルを開く閉じる
事例2|指定したExcelファイルを開く閉じる|Thisworkbook.pathを使う
事例3|ダイアログでファイルを開く
事例4|ファイルを読み取り専用で開く
事例5|エクセルを非表示で開く
以下でプログラムの解説をします。
事例1|指定したExcelファイルを開く閉じる|パスを指定
1 2 3 4 5 6 7 8 9 |
Sub Sample1() Workbooks.Open "C:\Users\-----\OneDrive\Sample.xlsm" Dim trgtBook As Workbook Set trgtBook = ActiveWorkbook 'ここに処理を入れる trgtBook.Close SaveChanges:=False End Sub |
1行目|処理開始
2行目|「C:\Users\—–\OneDrive\」内にある「Sample.xlsm」を開く
3行目|trgtBookをWorkbook型で宣言
4行目|ActiveWorkbookをtrgtBookにする(3行目で開いたSample.xlsmをtrgtBookとする)
5行目|処理を入れる
6行目|trgtBook.Closeで、ファイルを保存しないでエクセルを閉じる
7行目|処理終了
解説
Workbooks.Openで開いたブックは必ず「Active」になるので、「」で指定することができます。
「Active」については、処理中に予期せず変わってしまうことがあるので、すぐに変数で定義してしまうことをおすすめします。
ここでは、変数「trgtBook」で定義しています。
解説
保存したい場合は「False」を「True」に変えます。
「Close」対象ブックに変更が加えられている際に「SaveChanges」を指定していないと、保存するかどうかのダイアログが表示され、処理が止まってしまいます。
事例2|指定したExcelファイルを開く閉じる|Thisworkbook.pathを使う
1 2 3 4 5 6 7 8 9 10 |
Sub Sample2() Workbooks.Open ThisWorkbook.Path & "\Sample.xlsm" Dim trgtBook As Workbook Set trgtBook = ActiveWorkbook 'ここに処理を入れる trgtBook.Close SaveChanges:=False End Sub |
1行目|処理開始
2行目|エクセルが保管されているフォルダ内の「Sample.xlsm」を開く
3行目|trgtBookをWorkbook型で宣言
4行目|ActiveWorkbookをtrgtBookにする(3行目で開いたSample.xlsmをtrgtBookとする)
5行目|処理を入れる
6行目|trgtBook.Closeで、エクセルを閉じます
7行目|処理終了
「Thisworkbook.Path」は、マクロ実行中のエクセルファイルが保管されているフォルダアドレスを指定します。
「\」を書き加えるのがコツです。たとえば「ThisWorkbook.Path & “\Sample.xlsm”」のように、「\」をつけるのを忘れないこと。
事例3|ダイアログでファイルを開く
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub Sample3() ChDir ThisWorkbook.Path 'カレントフォルダを「ThisWorkbook.Path」に変更 Dim myFolder As Variant myFolder = Application.GetOpenFilename("エクセルファイル(*.xlsm),*.xlsm") '「GetOpenFileName」でダイアログを開き、カレントフォルダを表示(ファイル形式は「"エクセルファイル(*.xlsm),*.xlsm"」に限定) If myFolder = False Then MsgBox "キャンセルされました。" Exit Sub Else MsgBox Dir(myFolder) & " が選択されました。" & vbCrLf & "対象ファイルを開きます。" Workbooks.Open myFolder Dim trgtBook As Workbook Set trgtBook = ActiveWorkbook End If 'ここに処理を入れる trgtBook.Close SaveChanges:=False End Sub |
1行目|処理開始
2行目|カレントフォルダを「ThisWorkbook.Path」に変更。
3行目|「myFolder」をVariant型で変数宣言。
4行目|「myFolder」に「Application.GetOpenFilename」を格納。変数定義と同時にダイアログが開かれる。
5行目|「myFolder」の値によって条件を分岐。
6行目|「キャンセルされました。」というメッセージボックスを表示。
7行目|「Exit Sub」で処理終了
8行目|IF文の分岐
9行目|「〇〇が選択されました。対象ファイルを開きます」というメッセージを表示。
10行目|「myFolder」に格納されているフルパスを指定して、ワークブックを開く
11行目|trgtBookをWorkbook型で宣言
12行目|ActiveWorkbookをtrgtBookにする
13行目|IF文終了
14行目|処理を入れる
15行目|エクセルを閉じる。SaveChanges:=Falseと書くと、保存しないで閉じることができます。
16行目|処理終了
カレントフォルダを作業中のエクセルが保管されているフォルダに設定する
理由は、ダイアログを開いたときに表示されるフォルダは作業中のカレントフォルダが開かれるからです。
そこで、あらかじめ目的のフォルダに変更します。
なお「Thisworkbook.Path」を他のパスに変更すれば、ダイアログを開いたときに表示されるフォルダを変更できます。
ファイルフィルターを指定することで、ダイアログで表示するファイルを限定することができます。
ここでは「”エクセルファイル(.xlsm),.xlsm”」を指定しているので、拡張子「.xlsm」以外のファイルは表示されません。
ダイアログ操作で、「×」ボタンや「キャンセル」ボタンを押した時には「False」を返します。
そのため、ファイルが指定されてない場合はファイルを開きません。
「Dir」関数は、フルパスからファイル名だけを取り出すことができます。
「Dir(myFolder)」とすることで、選択したファイルの名前だけを取得できます。
事例4|ファイルを読み取り専用で開く
1 2 3 4 5 6 7 8 9 10 |
Sub Sample4() Workbooks.Open Filename:=ThisWorkbook.Path & "\Sample.xlsm", ReadOnly:=True Dim trgtBook As Workbook Set trgtBook = ActiveWorkbook 'ここに処理を入れる trgtBook.Close SaveChanges:=False End Sub |
1行目|処理開始
2行目|「ThisWorkbook.Path」内にある「Sample.xlsm」を開く。この時、「ReadOnly:=True」と書くと、読み取り専用で開くことができます。
3行目|trgtBookをWorkbook型で宣言
4行目|ActiveWorkbookをtrgtBookにする。つまり、3-5行目で開いたSample.xlsmをtrgtBookとする
5行目|処理を入れる
6行目|エクセルを閉じる。SaveChanges:=Falseと書くと、保存しないで閉じることができます。
7行目|処理終了
ReadOnlyは省略可能ですが、余計な編集を加えたくない時や、誰かが開いている時は「ReadOnly:=True」とするとエラーが出なくなります。
もし編集可能な状態で開きたい場合は、「ReadOnly」に「False」を指定します。
事例5|エクセルを非表示で開く
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub Sample5() Dim ExcelApp As Object Set ExcelApp = CreateObject("Excel.Application") Dim Path As String Path = "C:\Users\-----\OneDrive\Book1.xlsm" Dim NewExcel As Workbook Set NewExcel = ExcelApp.Workbooks.Open(Path) 'ここに処理を入れる NewExcel.Close SaveChanges:=False Set ExcelApp = Nothing End Sub |
1行目|処理開始
2行目|「ExcelApp」をObject型で宣言
3行目|「Excel.Application」オブジェクトを生成し、「ExcelApp」に格納
4行目|「Path」をString型で宣言
5行目|対象となるブックのフルパス「C:\Users\—–\OneDrive\Book1.xlsm」を「Path」に格納
6行目|「NewExcel」をWorkbook型で宣言
7行目|「ExcelApp.Workbooks.Open(Path)」を「NewExcel」に格納。
8行目|処理を入れる
9行目|エクセルを閉じる。SaveChanges:=Falseと書くと、保存しないで閉じることができます。
10行目|「ExcelApp」オブジェクトを解放
11行目|処理終了
このオブジェクト生成は、決まり文句なので、このまま使えば問題ありません。
「Set ExcelApp = Nothing」で、生成したオブジェクトを解放しています。
これを行わないとオブジェクトが残ったままとなり、メモリに負荷をかけることになってしまいます。
そのため、解放することを覚えておくのが良いです。
ファイルを開く2|CSV やテキストを開く読み込む
事例7|テキストファイルを開く読み込む
以下でプログラムの解説をします。
事例6|CSV ファイルを開く読み込む
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub Sample6() Dim str As String Dim myAry As Variant Dim n As Long n = 1 Open ThisWorkbook.Path & "\Sample.csv" For Input As #1 Do Until EOF(1) = True Line Input #1, str myAry = Split(str, ",") With ThisWorkbook.Worksheets(1) .Range("A" & n).Value = myAry(0) .Range("B" & n).Value = myAry(1) End With n = n + 1 Loop Close #1 End Sub |
1行目|処理開始
2行目|「str」をString型で宣言
3行目|「myAry」をVariant型で宣言
4行目|「n」をLong型で宣言
5行目|「n」に初期値「1」を格納
6行目|指定したCSVファイルを開く
7行目|「Do Loop」で繰り返し処理を行う
8行目|変数「str」に1行分の値を格納
9行目|取得した「str」を「,」で区切って配列「myAry」に格納
10行目|「ThisWorkbook」1枚目のワークシートを「With」文でまとめる
11行目|A列n番目のセル「Range(“A” & n)」に配列の値「myAry(0)」を出力
12行目|B列n番目のセル「Range(“B” & n)」に配列の値「myAry(1)」を出力
13行目|With文終了処理を入れる
14行目|変数「n」に「1」を加える
15行目|繰り返し処理終了
16行目|開いたCSVファイルを閉じる
17行目|処理終了
対象はフルパスで指定し、ファイルを開く目的を「Input」で読み取りに指定しています。
また「#1」で任意の番号を指定しています。
繰り返しの条件式には「Until EOF(1) = True」を指定しています。
「EOF」は「End Of File」の略で、「EOF(1)」はCSVファイルの1列目の終端に到達した際に「True」を返すことを利用しています。
「Line Input #1, 変数」で1行ずつ値を取得し、変数(str)に格納します。
「Split(str, “,”)」で、「str」を「”,”」ごとに区切って変数「myAry」に格納しています。
「n = n + 1」と記載することで、nに1を加えることができます。
これで繰り返しが進むたびに転記するセルの位置を変えることができます。
ファイル名やフルパスではなく、開くときに指定した番号「#1」で対象ファイルを指定します。
事例7|テキストファイルを開く読み込む
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub Sample7() Dim str As String Dim myAry As Variant Dim n As Long n = 1 Open ThisWorkbook.Path & "\Sample.txt" For Input As #1 Do Until EOF(1) = True Line Input #1, str myAry = Split(str, vbTab) With ThisWorkbook.Worksheets(1) .Range("A" & n).Value = myAry(0) .Range("A" & n).Value = myAry(1) End With n = n + 1 Loop Close #1 End Sub |
1行目|処理開始
2行目|「str」をString型で宣言
3行目|「myAry」をVariant型で宣言
4行目|「n」をLong型で宣言
5行目|「n」に初期値「1」を格納
6行目|txtファイルを開く
7行目|「Do Loop」で繰り返し処理を行う
8行目|変数「str」に1行分の値を格納
9行目|取得した「str」を「Tab」で区切って、値を配列「myAry」に格納
10行目|「ThisWorkbook」1枚目のワークシートを「With」文でまとめる
11行目|A列n番目のセル「Range(“A” & n)」に配列の値「myAry(0)」を出力
12行目|B列n番目のセル「Range(“B” & n)」に配列の値「myAry(1)」を出力
13行目|With文終了処理を入れる
14行目|変数「n」に「1」を加える
15行目|繰り返し処理終了
16行目|開いたtxtファイルを閉じる
17行目|処理終了
「Split(str, vbTab)」で、「str」をタブごとに区切って変数「myAry」に格納しています。
CSVファイルでは行内の値は「”,”」で区切られているのに対して、テキストファイルの場合は「タブ」で区切られています。
それを利用し、Tabごとに区切ります。
ファイルを開く3|ワードやパワーポイントのファイルを開く閉じる
事例9|パワーポイントファイルを開く閉じる
事例8|ワードファイルを開く閉じる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub Sample8() Dim wordApp As Word.Application Set wordApp = CreateObject("Word.Application") wordApp.Visible = True Dim wordDoc As Word.Document Set wordDoc = wordApp.Documents.Open(ThisWorkbook.Path & "\Sample.docx") 'ここに処理を入れる wordDoc.Close wordApp.Visible = False Set wordApp = Nothing End Sub |
VBEで参照設定「Microsoft Word 〇〇.〇 Object Library」にチェックをいれる必要があります。
詳細はこちらの画像の通りです。
1.VBEを開いて頂いて、「ツール」→「参照設定」
2.Microsoft Word 〇〇.〇 Object Libraryのライブラリにチェックを入れて、OKをクリック
画像では「15.0」となっていますが、もっとも数字が大きいものを選択すれば問題ありません。
1行目|処理開始
2行目|「wordApp」をWord.Application型で宣言
3行目|「Word.Application」オブジェクトを生成し、「wordApp」に格納
4行目|生成したWordを表示
5行目|「wordDoc」をWord.Document型で宣言
6行目|「WordApp.Documents.Open(対象ファイルフルパス)」を「wordDoc」に格納
7行目|処理を入れる
8行目|wordDoc.Closeで、開いたドキュメントファイルを閉じる。
9行目|「wordApp」を非表示
10行目|「wordApp」オブジェクトを解放
11行目|処理終了
以下の記事では、エクセルとワードを連携させて差し込み印刷の事例を紹介しています。
ぜひ合わせて読んでみてください。
事例9|パワーポイントファイルを開く閉じる
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub Sample9() Dim powerPointApp As PowerPoint.Application Set powerPointApp = CreateObject("PowerPoint.Application") powerPointApp.Visible = True Dim powerPointPre As PowerPoint.Presentation Set powerPointPre = powerPointApp.Presentations.Open(ThisWorkbook.Path & "\Sample\Sample.pptx") 'ここに処理を入れる powerPointApp.Quit Set powerPointApp = Nothing End Sub |
VBEで参照設定「「Microsoft PowerPoint 〇〇.〇 Object Library」」にチェックをいれる必要があります。
詳細はこちらの画像の通りです。
1.VBEを開いて頂いて、「ツール」→「参照設定」
2.Microsoft PowerPoint 〇〇.〇 Object Libraryのライブラリにチェックを入れて、OKをクリック
画像では「16.0」となっていますが、もっとも数字が大きいものを選択すれば問題ありません。
1行目|処理開始
2行目|「powerPointApp」を、PowerPoint.Application型で宣言
3行目|「PowerPoint.Application」オブジェクトを生成し、「powerPointApp」に格納
4行目|生成したPowerPointを表示
5行目|「powerPointPre」をPowerPoint.Presentation型で宣言
6行目|「PowerPointApp.Presentations.Open(対象ファイルフルパス)」を「powerPointPre」に格納
7行目|処理を入れる
8行目|「powerPointApp.Quit」で、パワーポイントアプリケーションを閉じる
9行目|「powerPointApp」オブジェクトを解放
10行目|処理終了
Excel.Application、Word.Applicationと違って、「Visible=False」を指定できません。
そこで「Quit」を使い、プレゼンテーションファイル、パワーポイントアプリケーションを一度に終了させます。
以下の記事では、エクセルとパワーポイントを連携させてグラフを作成する事例を紹介しています。
ぜひ合わせて読んでみてください。
ファイルを開く4|複数ファイルを開く閉じる
複数ファイルのうち、条件に一致するファイルを開く処理を紹介します。
事例10|ワイルドカードで条件一致したエクセルファイルのみ開く
1 2 3 4 5 6 7 8 9 10 11 |
Sub Sample10() Dim trgtDir As String trgtDir = ThisWorkbook.Path & "\Sample\" Dim str As String str = Dir(trgtDir & "201904*.xlsx") Do While str <> "" Workbooks.Open trgtDir & str str = Dir() Loop End Sub |
1行目|処理開始
2行目|「trgtDir」をString型で宣言
3行目|「trgtDir」に対象となるフォルダパスを格納
4行目|「str」をString型で宣言
5行目|「str」に対象となるファイルフルパスを格納
6行目|「Do Loop」で繰り返し処理を行う
7行目|5行目で指定した「trgtDir」フォルダ内の対象のファイルを開く
8行目|変数「str」に同じ条件に当てはまる次のファイル名を格納
9行目|繰り返し処理終了
10行目|処理終了
変数「str」に「Dir」関数とワイルドカードを使って、対象となるファイルのファイル名の初期値を格納します。
サンプルコードでは、ワイルドカードを使うことによって、「201904」から始まる「.xlsx」ファイルの1番目を取得しています。
繰り返しの条件式には「While buf <> “”」を指定しています。
13行目で「Dir()」を使って条件に当はまる次のファイル名を「str」に格納しています。
そして、「Dir()」は同じ条件のファイルが見つからない場合は、「””」(空の文字列)になります。
この性質を利用し、繰り返し条件としています。
「Dir()」は、同じ条件に一致する、次のファイル名を取得することができます。
これを変数「str」に再度格納し、次々にループ処理を行っていきます。
複数ファイルを一括処理するプログラム
VBAで複数ファイルを一括処理するプログラムは以下の記事で詳しく解説しています。
ファイルを開く5|PDFファイルを開く
事例12|フォルダ内のPDF ファイルを上から順番に開いて結合する
事例11|フォルダ内のPDF ファイルをすべて開く
以下の記事で解説しています。
事例12|フォルダ内のPDF ファイルを上から順番に開いて結合する
以下の記事で解説しています。
その他にも複数の PDF ファイルを処理するプログラムを紹介しています。
ぜひ合わせて読んでみてください。
エクセルを自分用に編集アレンジして使いたいなら、エクセルマクロの無料動画で学ぼう
この記事では、ファイルを開くことについて紹介しました。ここで紹介したマクロを利用すれば、作業の自動化が可能になります。
しかしデメリットもあります。それはカスタムできないことです。
なぜなら、色々な要望が増えるからです。
この動画を見たとき、「もっと○○ができるのでは?」や「ここはなんとかならないのか」と感じる人は少なくないはずです。
例えば、「他の条件を付け加えたい」や「日付毎に条件を変えたい」といった要望が出るかもしれません。
このような要望を満たすには、マクロを勉強して自力でマクロを編集できるようになる必要があります。
もし、自力でマクロを編集できるようになれば、今より仕事の効率はグッと上がります。
実際、私も自力でマクロを書けるようになってからは、仕事の生産性が一気に上がりました。
他の人が30分~1時間かけて行う仕事が、ボタン一つで終わらせることができるようになったのです。
その結果、周囲からの信頼も増し、仕事で高い評価を得られるようになりました。
ただ、要望に応えるようになるためには、マクロを学ぶ必要があります。
まずは無料でマクロを勉強してみる
ウェブや書籍で勉強すれば、マクロを習得できると考えている人は少なくありません。
しかし、仕事で使えるマクロを習得したいなら、仕事で使える部分に特化した教材で学ぶことをお勧めします。
なぜなら、ウェブや書籍には仕事に関係しない部分まで提供していることが多いからです。
例えば、マクロ初心者なのに配列を学ぼうとする人がいます。実は配列なしでも仕事で使えるマクロを書くことは可能です。
しかし、マクロ初心者ほど「全ての知識が必要だ」と考えて、無駄な学習に時間を使ってしまうのです。詳しくは、こちらの記事で紹介しています。
そこで、私がお勧めするのは仕事に直結するマクロ教材です。とくにお勧めするのは、こちらの無料オンライン動画です。
なぜなら、仕事に直結する部分に絞って、エクセルマクロを学ぶことができるからです。
マクロの作り方・考え方から解説しているので、教材をしっかり学べばここで紹介したマクロをゼロから書けるようになります。
マクロ初心者が、仕事に直結したいマクロを学ぶなら、まずはこちらの無料オンライン動画を試すのがいいです。
興味がある人は、まずは無料でエクセルマクロの勉強を始めてみてください。
もっと学びたいと感じたら、さらに深く勉強をしてみることをお勧めします。