Excelのブックを「開く」ってどうすればいいの?
Excel VBAでブックを開く操作は難しいと思われているかもしれません。
確かに、絶対パスや相対パスなど専門用語で分かりづらい点もありますが、イメージができると初心者の方でもブックの操作ができるようになります。
パスを理解してマクロを作るのと、そうでないのではVBAの成長速度が大きく変わってきます。
そこで初心者の方にも理解しやすいように、図解を用いて専門用語をなるべく分かりやすく解説していきます。
ブックを開くときのイメージ
VBAのコードだけで別のExcelブックを開くことができます。
そこで、ブックを開くときに重要になるのが「パス」です。
目的ファイルまでの道順のこと。
パスは目的のファイルやフォルダまでの住所や道順を表しているイメージです。
ブックを開くときは道順を示す「パス」を指定することで、目的のブックにたどり着き開くことができます。
そして、ブックを開くときのパスには「絶対パス」と「相対パス」の2通りで道順を指定することができます。
絶対パスとは、住所
絶対パスとは、ファイルの場所を示した住所でありドライブから記述します。
住所でいえば都道府県から記述して宛名で終わるイメージです。
例えば「pakaji.xls」ファイルの場所を探すときには、
Cドライブ→ユーザーのデスクトップ→フォルダ→pakaji.xlsという順序になります。
絶対パスは、この住所が分かれば指定できますが、途中の住所の名前が変わると目的地までたどり着けなくなってしまいます。そこで便利なのが「相対パス」です。
相対パスとは、現在地からの道順
相対パスとは、今いる現在地からどの道順で行けば目的地にたどり着けるかを指定する方法です。
現在地を基準として、「同じフォルダ内」もしくは「前や先のフォルダ」にファイルがあるのかを判断します。
現在開いているワークブックと同じフォルダ内にあるブックを指定する場合、
ThisWorkbook.Path & “ブック名.xlsx”
というコードで指定します。
ワークブックを開く
ワークブックを開くには下記のコードで開きます。
'
Workbooks.Open パス
'
絶対パスでワークブックを開く
Sub fileOpen()
'絶対パスでファイルを開く
Workbooks.Open "C:\Users\デスクトップ\フォルダ\sample"
End Sub
絶対パスで解説したパスをWorkbooks.Openの後に記述するだけです。
具体的に絶対パスを指定する方法は、プロパティを使うと便利です。
【絶対パスでブックを開く手順】
①開きたいブックを右クリックしてプロパティを表示する
②プロパティの場所に表示されてるパスをコピーする
③VBAに Workbooks.Open の次にコピーしたパスをペーストする
④プロパティに戻り、今度はファイル名をコピーする
⑤VBAのペーストしたパスの後ろに\ファイル名となるようにペーストする
相対パスでワークブックを開く
Sub fileOpen()
'相対パスでファイルを開く(同じフォルダ内の場合)
Workbooks.Open ThisWorkbook.Path & "\sample.xlsx"
End Sub
具体的な相対パスの指定方法は開きたいブックの道順を調べるだけです。
【相対パスでブックを開く手順】
※同じフォルダ内にある場合
①開きたいブックが何処にあるか確認する
②同じフォルダの場合はThisWorkbook.Path & “\ファル名.xlsx”と記述する
異なる階層のフォルダへ相対パスを指定する
同じフォルダ内であれば ThisWorkbook.Path & “\ファイル名.xlsx” だけで相対パスを指定できますが、違う階層のフォルダに開きたいブックがあるときは「../」や「./フォルダ名」などを使用します。
パソコンのフォルダは地下構造になっておりデスクトップを地上をしたとき、デスクトップに表示されてるフォルダを開くと、そこは地下1階になるイメージです。
ちなみに作業中のフォルダ(現在地)のことを「カレントディレクトリ」と呼びます。
<相対パスで階層を指定>
階層 | 階層を示すコード | 記述例 |
2つ上の階層 (2つ前) | \../../ | ThisWorkbook.Path & “\../../ファイル名.xlsx” |
1つ上の階層 (1つ前) | \../ | ThisWorkbook.Path & “\../ファイル名.xlsx” |
現在のフォルダ内 | なし | ThisWorkbook.Path & “\ファイル名.xlsx” |
1つ下の階層 (1つ先) | \./フォルダ名 | ThisWorkbook.Path & “\./フォルダ名\ファイル名.xlsx” |
2つ下の階層 (2つ先) | \./フォルダ名\./フォルダ名 | ThisWorkbook.Path & “\./フォルダ名\./フォルダ名\ファイル名.xlsx” |
ブックを開く最適なコード
ブックを開く時には予期しないことでエラーになったりします。
①フォルダやブックが存在しない場合
②誰かが開いている場合
そこで、これらの事態を想定してプログラムを組み込んでおけばエラーにならずに済みます。
Sub fileOpen()
Dim check
Dim book
Dim file
'開きたいブックを格納
file = "C:\Users\デスクトップ\フォルダ\sample.xlsx"
'➀ブックの存在をチェック
check = Dir(file)
If check = "" Then
MsgBox file & vbCrLf & "はありません"
Exit Sub
End If
'➁同名のブックが開かれていないかをチェック
For Each book In Workbooks
If book.Name = check Then
MsgBox check & vbCrLf & "は今開いています"
Exit Sub
End If
Next book
'目的のブックを開く
Workbooks.Open file
End Sub
① ブックの存在をチェックする
ファイルが存在するか確認するときはDir関数を使います。
Dir(パス):パス通りにファイルが存在すれば、ファイル名を返す関数。もし、ファイルが存在しなければ空白(””)を返す。
このDir関数を用いてファイルが存在すれば問題ないですが、存在しない場合はMsgBoxで表示すると分かりやすいです。
➁同名のブックが開かれていないかをチェックする
同名のブックが開いているか確認するには「For Each ~ Next」文を使うと便利です。
繰り返し処理のことで、グループの中を最後まで繰り返し処理してくれる。
For Each 変数 In コレクション
処理
Next 変数
※コレクションとは、WorkbooksやWorksheetsなど同じ種類のオブジェクトの集合体のこと。
For ~ Next文は回数を指定できるのに対して、For Each ~ Next文は回数しては無く、最後まで繰り返す。
「For Each ~ Next」文を用いて、今開いてるワークブックの名前を知りたいので、
「For Each 変数 In Workbooks」として今開いているワークブックを順番で探しに行きます。
※ブックを開いた順番で探しに行きます。
そして、「If 変数.Name = Dir(パス) Then」で今開いているワークブックの名前と開きたいブックの名前が一緒かを確認して、同じ場合はMsgBox関数で注意メッセージを表示させます。
コメント