【VBAでつまずきやすい】 ブックを変数へ格納する方法
EXCEL VBAを学び始めた当初、Bookをオブジェクト変数へ格納する方法に苦戦しました。
ネットで調べると数多くの方法が掲載されているのですが、自分で書くと、エラーになってしまうことがしばしば。
その結果、無為に時間を費やしてしまいました。
当時の失敗事例を思い出しながら、正しい方法を紹介してみます。
ここでは、"サンプル.xlsx"というBookをWorkbookのオブジェクト変数wbへ格納したいケースを取り上げます。
コードは"テスト.xlsm"というBookに記載する条件とします。
サンプル.xlsxとテスト.xlsmは同一階層内のフォルダに存在しているとします。
失敗コード1
Sub チャレンジ()
Dim wb As Workbook
Set wb = "サンプル.xlsx"
End Sub
結果:
エラーになります。
エラー原因:
そもそも、Bookを格納するためには、該当するBookを開いていなければいけません。
ここでは、"サンプル.xlsx"のことです。
ではBookを開いてから格納してみることにします。
失敗コード2
Sub チャレンジ2()
Dim wb As Workbook
Workbooks.Open (ThisWorkbook.Path & "\" & "サンプル.xlsx")
Set wb = "サンプル.xlsx"
End Sub
結果:
エラーになります。
エラー原因:
オブジェクト変数wbへの格納が文字列として認識されているためです。
"サンプル.xlsx"の部分が文字列として認識される書き方になっています。
Workbook型のオブジェクト変数wbに格納できるのは、Workbookオブジェクトのみです。
Workbookオブジェクトとして格納するためには以下のコードとなります。
成功コード 3
Sub チャレンジ3()
Dim wb As Workbook
Workbooks.Open (ThisWorkbook.Path & "\" & "サンプル.xlsx")
Set wb = Workbooks("サンプル.xlsx")
End Sub
結果:
成功
'
まず、"サンプル.xlslx"を開きます。
そして、Workbooksコレクションの中から(開かれているBookの中から)"サンプル.xlsx"を指定することで、オブジェクト変数wbへ格納できています。
語弊があるかもしれませんがざっくりいうと、Workbooksコレクションを使えば、Bookを格納できるとういことです。
ちなみに、上記コードは以下の書き方で使用することが多いです。
Dim wb As Workbook
Set wb=Workbooks.Open (ThisWorkbook.Path & "\" & "サンプル.xlsx")
Bookを開くと同時に、オブジェクト変数wbへ格納してます。
ほかにも格納する方法としては、
'アクティブ(現在表示している)なBookが格納される'
Dim wb As Workbook
Set wb=Activeworkbook
'テスト.xlsm"が格納される'
Set wb=Thisworkbook
などがあります。
応用例の紹介です。
いくつかのBookをすでに開いていて、特定のBookをオブジェクト変数へ格納したい場合のコードを書いておきたいと思います。
ここでは、特定のブック"新規ブック.xlsx"を格納したいケースです。
下記がコードです。
Sub 応用()
Dim wb as Workbook
Dim tmp_book As Variant
For Each tmp_book In Workbooks
If tmp_book.Name = "新規ブック.xlsx" Then
Set wb = tmp_book
Exit For
End If
Next
End Sub
For Each構文を使用し、開いているBookを検索していきます。
Book名が"新規ブック.xlsx"であればオブジェクト変数wbへ格納しています。
まとめ
今回は、Workbookをオブジェクト変数へ格納する方法について解説してみました。
ポイントは
格納したいBookが開かれていること。
格納する際は、型を一致させる。
です。
この記事が気に入ったらサポートをしてみませんか?