エクセルブックのアクティブ化は大切。あるあるミスと記述

vbabookactiveeyecatch

エクセルVBAでブックのアクティブ化はActivateメソッドを使います。
簡単なことですが、怠ると大変な結果を招くこともあります。
ミス例と記述方法を紹介します。

こんにちは、じゅんぱ店長(@junpa33)です。

エクセルブックをアクティブにするには「Activateメソッド」を使用します。

VBAコードでブック、シート、セルを操作・編集するためには、前提として操作する対象がアクティブになっている必要があります。

ブックをアクティブにすることは、VBAコード処理の前提条件ともなりますので、しっかり押さえておく必要があります。

ブックをアクティブにしなければ・・・

vbabookactivep004

一例として次のような状況を考えてみます。

エクセルブック「Book1.xlsm」のModule1に次のマクロを設置します。

エクセルブック「Book1.xlsm」をクリックで開いて、そのModule1にVBAコードを書き出しているのですから、当然、操作される主体は「Book1.xlsm」であると ” 思い込んで ” しまうかもしれません。

VBA
Sub ブックをアクティブ1()
        Worksheets("Sheet1").Range("B3").Copy _
                Workbooks("Book2.xlsm").Worksheets("Sheet1").Range("D5")
End Sub

Book1.xlsmの「Sheet1」の「セルB3」に「あいうえお」、Book2.xlsmの「Sheet1」の「セルB3」に「アイウエオ」と入力しておきます。

vbabookactivep001

マクロを実行した期待値としては、” エクセルブック「Book2.xlsm」の「Sheet1」の「セルD5」に「あいうえお」が入力される。” ことです。

マクロを実行すると、

vbabookactivep002-1

結果として「アイウエオ」が入力されてしまいました。

VBAコードの書き出しの「Worksheets(“Sheet1”).Range(“B3”)」は、「” アクティブブック ” のSheet1のセルB3」という意味です。

原因としては、マクロ実行前に「Book2.xlsm」の「セルB3」に「アイウエオ」と、セル入力したために、アクティブブックが変更され、コピー元の「Sheet1」を「Book1.xlsm」でなく「Book2.xlsm」の方で参照されたため、ということです。

なので、正しく修正したVBAコードは、Workbooks(“Book1.xlsm”).Activate を追加記述します。

VBA
Sub ブックをアクティブ2()
        Workbooks("Book1.xlsm").Activate
        Worksheets("Sheet1").Range("B3").Copy _
                Workbooks("Book2.xlsm").Worksheets("Sheet1").Range("D5")
End Sub
vbabookactivep003

また、VBAコードの他の記述方法として、

VBA
Sub ブックをアクティブ3()
        Workbooks("Book1.xlsm").Worksheets("Sheet1").Range("B3").Copy _
                Workbooks("Book2.xlsm").Worksheets("Sheet1").Range("D5")
End Sub

でもOKです。

アクティブな状態は常に移り気なので、シートやセルを指定するときは「何処の何方さんのブック」かをいつも表現できているようにしましょう。

たくさんコードを書いていて、書き疲れで”やらかしてしまう”凡ミスのあるあるです。

ブックのActivateの記述方法

vbabookactivep005

ブックをアクティブにする記述法はこのようになります。

Activateの構文

ブックオブジェクト.Activate

記述法を一覧にすると・・・

Workbooks(“Book1.xlsm”).Activateブック名を指定してアクティブ化(拡張子を付けるのを忘れないで!)
Workbooks(1).Activateインデックス番号を指定してアクティブ化します。
MyWb.Activateオブジェクト変数を使ってアクティブ化(Setステートメントで変数化”MyWb”)
Workbooks(“Book1”).Activate例外で、新規作成したブックを名前を付けて保存前にアクティブ化する場合
ActiveWorkbook現在アクティブ化しているブックを指定する場合に使います。
ThisWorkbook.Activateマクロ(VBAコード)を実行しているブックをアクティブ化する。

まとめ

vbabookactivep006

ブックのアクティブ化が正確にされていないと、記述したVBAコードも意図通りに動いてくれません。

そうなれば、間違ったデータを取り出してきて思わぬ実行結果になることもしばしばです。

あるいはまた、Activateメソッドを利用しなくても、

Workbooks(“Book1.xlsm”).Worksheets(“Sheet1”)」あるいは「With Workbooks(“Book1.xlsm”)~End With」などの表現方法でVBAコードを記述することも可能です。

vbawithstateeyecatch With~End Withの使い方。VBAコードを簡潔に記述する

更に、Activateとよく似たSelectの使い方も関連知識として続けて知っておくこともおすすめします。

vbaselacteyecatch VBA 似た者SelectとActivateの違いを理解 vbanameeyecatch 新規作成ブックとシート。アクティブ状態でやっておくこと

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min