他のブックを見に行くには
別のブックを参照したい場合は、ブック名、もしくはブック番号を指定する必要があります。
ブック番号とは現在開いている数でファイルを開いた順に割り振られます。
ただ、ブック番号を指定して処理するというケースはほとんどないと思いますのでブック名を指定する方法を紹介します。
「ブック名」とは「ファイル名」になります。
Workbooks(“Book2.xlsx”).Sheets(“Sheet1”).Range(“A1”) = “値”
ただし、これはそのファイルが開いている場合の話です。
ファイルが開いていない場合は、ファイルを開いてからブックを指定します。
ファイルを開くときは当然「フルパス+ファイル名」が必要になります。
これはパスが違えば、同じファイル名でも存在できるためです。
※ちなみに同じファイル名のブックは開く事が出来ません。
ファイルが開いている時のブック指定
Workbooks(“Book2.xlsx”).Sheets(“Sheet1”).Range(“A1”) = 1
ファイルが開いていれば、ファイル名(=ブック名)を指定すればOKです。
別ブックのシート上の値を参照する時は、シート名も指定する事になると思います。
このブックを何度も使いたい時は変数に代入して使う事が多いです。
Dim wb As Workbook
Set wb = Workbooks(“Book2.xlsx”)
オブジェクト変数には Set が必要ですので忘れないようにしましょう。
ファイルが開いていないブックを指定
ファイルが開いていない場合は、ブックを開いてから指定します。
もし、現在開いているファイルと同じフォルダ内にある場合は、ThisWorkbook.Path とすることができます。
パスとファイル名をつなぐには¥マークを忘れないようにしましょう。
以下のサンプルでは、もしファイルが無かった時のエラー処理も付けました。
Sub workbookOpenTest()
Dim wb As Workbook
Dim filename As String
filename = "Book2.xlsx"
On Error Resume Next '①エラーを無視
Set wb = Workbooks.Open(ThisWorkbook.Path & "_\" & filename)
On Error GoTo 0 '②エラー無視を解除
If wb Is Nothing Then '③ファイルが開けない時は Nothing となる
MsgBox "ファイルが開けませんでした。"
Exit Sub
End If
wb.Worksheets("Sheet1") = "TEST"
wb.Save '④書き込んだのでセーブする
wb.Close '⑤ファイルを閉じる
End Sub
①On Error Resume Next は、それ以降の処理でエラーメッセージを出さないようにします。
ファイルを開くなど目的の処理を終えたら、②On Error GoTo 0 で通常通りエラーメッセージが出るように設定を戻します。
③ファイルが正常に開いていない場合は Nothing となるので、それを捕まえてエラーメッセージを出しています。
④もし、値を書き込んだのであればセーブも必要です。書き込んでいなければ Save は不要です。
⑤で開いたファイルを閉じています。
ファイルダイアログでブックを指定
ユーザーにファイルダイアログでExeclファイルを指定してもらう方法を示します。
前半のファイル名(フルパス)の取得までは、「備忘録」のページの「ファイルオープンダイアログでファイル名取得」の部分を使っています。
こちらはフルパスでファイル名を取得できるので、そのまま使用できます。
あとは前と同じ内容になります。
Sub workbookOpenTest2()
Dim vfilename As Variant
ChDir ThisWorkbook.Path '開くフォルダを指定したい時
vfilename = Application.GetOpenFilename("Excelブック,*.xls?")
If vfilename = False Then
Exit Sub
End If
Set wb = Workbooks.Open(vfilename)
wb.Worksheets("Sheet1") = "TEST"
wb.Save '書き込んだのでセーブする
wb.Close 'ファイルを閉じるEnd Sub
End Sub
他のブックのシートやセルを選択
別ブックのセルに直接、値を代入したり、取得したりする場合はブックをアクティブにする必要はありませんでしたが、別ブックのシートやセルを選択するには、そのブックをアクティブにする必要があります。
シートを変数に入れていても、Slectを実行するとエラーとなります。
Sub selectMySheet()
Dim sh As Worksheet
Set sh = Workbooks("Book2.xlsx").Worksheets("Sheet1")
sh.Range("B2") = "Hello" '①
Workbooks("Book2.xlsx").Activate
sh.Range("B3").Select '②
End Sub
上のプログラムは、”Book2.xlsx”がアクティブでない状態で実行した時、
①の値の代入は、”Book2.xlsx”がアクティブでなくても実行できます。
しかし、別ブックのシートやセルを選択するには、ブックがアクティブな状態でないとエラーとなります。
シートやセルを Slect したい時は、該当するブックを Activate にしておく必要があります。②
セルやシートをアクティブにするには、Sleectメソッド を使用しましたが、ブックの場合は、Activateメソッドを使用します。
Slectではない点に注意しましょう。
まとめ
別ブックを参照するためには、
ファイルパスを指定 → ファイルを開く → エラー処理
という風に少々面倒な手順を踏むことになります。
ただパターンは決まっていますので、以前使ったコードを使い回したりすれば問題ありません。
基本的なパターンを覚えて、それをうまく組み合わせていくような感じでマスターすると良いと思います。