エクセルVBAで新規作成するブックとシートについて、まず最初のアクティブな状態の時にやっておくことがあります。
「新規作成=名前が無い」という事です。
これではコードでの操作が非常に不便な状態になります。
エクセルVBAで、アクティブセル、アクティブシート、アクティブブックという「現在参照中の・・・」というオブジェクトがあります。
今回の「VBA最速で理解」は、この「ActiveWorkbook」「ActiveSheet」「ActiveCell」の重要な使い方について説明します。
こんにちは、じゅんぱ店長(@junpa33)です。

















コンテンツ
新規作成ブックとシート。アクティブ状態でやっておくこと
最初に、「ActiveWorkbook」と「ThisWorkbook」とを区別しておきましょう。
簡単に言うと
「ActiveWorkbook」は「今、参照しているワークブック」のことで、
「ThisWorkbook」は「この操作中のVBAコードが記述されているワークブック」になります。
ですので、「ThisWorkbook」は対象のワークブックは、そのVBAを実行している間は変わりません。
対して「ActiveWorkbook」は今の参照の対象から外れるともうActiveWorkbookではなくなるということです。
これは「ActiveSheet」も「ActiveCell」同様です。
その様な性格の「Active・・・」ですが、ブックやシートを新規追加する時には特に重要な存在となります。
新規にブックを追加する時のActiveWorkbook
新しくブックを追加して、そこにデータや計算結果を落とし込み、最終的に本体ブックとは別名で保存する。
と、言うようなVBAコード組み立てる事もそれなりの頻度であるでしょう。
ワークブックを3つや4つ開きながらの作業になる事も多いと思います。
そういった場面で何が一番の問題かというと、「新規ブックには名前が無い」ということです。
VBAコードで「新規ブック」を呼び出そうとしても、「名前が無い」と呼び出すことも出来ません。
「 ActiveWorkbook でいいんじゃないの?」っていう話は通用しません。
それは、先ほど説明した「Active・・・」の性格のためです。
コードの進め方で、一旦フォーカスが外れて(アクティブでなくなって)しまえば、
もう新規作成のブックは「名前が無い」ので掴むことが出来なくなっています。
そこでこの対策としては、 ActiveWorkbookを使って新規のブック名を変数で特定化してしまう事です。
ブックを新規追加するコードの直下に「Set 「変数」 = ActiveWorkbook」のコードを配置します。
Sub Activeテスト1() Dim Newbook As Workbook Dim FN As String Workbooks.Add Set Newbook = ActiveWorkbook ’ ↓ これ以降は、新規ブックからフォーカスが外れてもOK Newbook.Worksheets(2).Activate FN = Format(Now(), "yymmdd-hhmm") Newbook.SaveAs Filename:=ThisWorkbook.Path & "\テストBOOK_" & FN & ".xlsx" End Sub
これで新規で作成したブックは、「変数Newbook」を使えば、呼び出すことも、名前を付けることも出来ます。
新規作成ブックのシートを呼び出すのも「Newbook.Worksheets(1).Activate」で行うことが出来ます。
実行結果
新規にシートを追加する時のActiveSheet
シートの場合も、シートの追加のコードの直下に「Set 「変数」 = ActiveSheet」のコードを配置します。
Sub Activeテスト2() Dim Ms As Worksheet '宣言文の直下に「Set・・・」を配置 ✖ Set Ms = ActiveSheet Debug.Print Ms.Name ThisWorkbook.Worksheets.Add after:=Worksheets("Sheet3") ActiveSheet.Name = "テストシート" '追加コードの直下に「Set・・・」を配置 Set Ms = ActiveSheet Debug.Print Ms.Name End Sub
シートの場合は、ブック以上に頻繁にフォーカスが変わってしまう事が多いと思います。これで「変数Ms」で新規シートを掴むことが出来ます。
Debug.Print で「 Set・・・文」の置く位置の違いで狙い通りに変数に新規作成のシートが填まるかを調べてみました。
結果を見ると、「追加コードの直下」に置かないとダメということが分かります。
実行結果
Activecellを使ったコード1例
「 For Next 」と「 Offset 」を使って、ActiveCell が移動していきます。
状態が見えるようにセルに値を入力していきます。
ある特定のセルがアクティブになっている状態で、別の操作をしようとするときは、
「Set 「変数」 = ActiveCell」のコードを設置して取り出すことが出来ます。
Sub Activeテスト3()
Dim i As Long, V As Long
Dim Mc As Range
Cells(1, 1).Activate
For i = 1 To 10
ActiveCell.Value = i * 2
If i = 5 Then
Set Mc = ActiveCell
V = Mc.Value
Cells(i, 2) = V
End If
ActiveCell.Offset(1, 1).Activate
Next i
End Sub
実行結果
アクティブ状態でやっておくこと まとめ
既に名前を付けて保存されているエクセルBOOKやシートを開いて、非表示になっているところを「 Activate 」で表示する。
そのオブジェクトを指定するのに「ActiveWorkbook」「ActiveSheet」「ActiveCell」を使うメインの使い方。
今回はそうではなく、新規作成のブックやシートに対しての使い方を説明しました。
名無しのブックや名無しのシートでは、それに対して操作することが難しくなります。
「新規作成時はアクティブ状態」というエクセルの特性を利用して、
「Set 「変数」 = Active・・・」で(変数で)マーキングしてしまいましょうということです。
短期間でエクセルVBAの独学習得を目指したいなら
エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。
けれども、
出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。
独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。
先人が行った勉強方法をあなたがそのまま利用すればよいということです。
独習のための大切な7つのポイントは、上記記事にて解説しています。
独習によるVBA習得のキーワードは、
出来るだけ多くの実例に触れること!
です。
正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。
ハッキリ言って、
本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、
手っ取り早く短期間習得できるというのは間違いないでしょう。
このサイトでよく使うVBAのコードのトピックを纏めています。
今回の記事はここまでです。 最後までご覧いただき有難うございました。