見出し画像

【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が開かれていること。
格納する際は、型を一致させる。

です。


この記事が気に入ったらサポートをしてみませんか?