新規作成ブックとシート。アクティブ状態でやっておくこと

vbanameeyecatch

エクセルVBAで新規作成するブックとシートについて、まず最初のアクティブな状態の時にやっておくことがあります。

「新規作成=名前が無い」という事です。

これではコードでの操作が非常に不便な状態になります。

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

エクセルVBAで、アクティブセル、アクティブシート、アクティブブックという「現在参照中の・・・」というオブジェクトがあります。

今回の「VBA最速で理解」は、この「ActiveWorkbook」「ActiveSheet」「ActiveCell」の重要な使い方について説明します。

新規作成ブックとシート。アクティブ状態でやっておくこと

vbanamep004

最初に、「ActiveWorkbook」と「ThisWorkbook」とを区別しておきましょう。

簡単に言うと

  • 「ActiveWorkbook」は「今、参照しているワークブック」
  • 「ThisWorkbook」は「この操作中のVBAコードが記述されているワークブック」

になります。

ですので、「ThisWorkbook」は、対象のワークブックで、そのVBAを実行している間は変わりません。

対して「ActiveWorkbook」は、今の参照の対象から外れるともうActiveWorkbookではなくなるということです。

これは「ActiveSheet」も「ActiveCell」同様です。

その様な性格の「Active・・・」ですが、ブックやシートを新規追加する時には特に重要な存在となります。

新規にブックを追加する時のActiveWorkbook

新しくブックを追加して、そこにデータや計算結果を落とし込み、最終的に本体ブックとは別名で保存する。

と、言うようなVBAコード組み立てる事もそれなりの頻度であるでしょう。

ワークブックを3つや4つ開きながらの作業になる事も多いと思います。

そういった場面で何が一番の問題かというと、「新規ブックには名前が無い」ということです。

VBAコードで「新規ブック」を呼び出そうとしても、「名前が無い」と呼び出すことも出来ません。

「 ActiveWorkbook でいいんじゃないの?」っていう話は通用しません。

それは、先ほど説明した「Active・・・」の性格のためです。

コードの進め方で、一旦フォーカスが外れて(アクティブでなくなって)しまえば、

もう新規作成のブックは「名前が無い」ので掴むことが出来なくなっています。

そこでこの対策としては、 ActiveWorkbookを使って新規のブック名を変数で特定化してしまう事です。

例題1

ブックを新規追加するコードの直下に「Set 「変数」 = ActiveWorkbook」のコードを配置します。

参考記事

Format関数の使い方についてはこの記事を参考にしてください。

VBAFormateyecatch Format関数は書式設定のテッパン関数!実務の書式と重要5例
VBA
Option Explicit

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」で行うことが出来ます。

実行結果

vbaname001

新規にシートを追加する時のActiveSheet

例題2

シートの場合も、シートの追加のコードの直下に「Set 「変数」 = ActiveSheet」のコードを配置します。

VBA
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・・・文」の置く位置の違いで狙い通りに変数に新規作成のシートが填まるかを調べてみました。

結果を見ると、「追加コードの直下」に置かないとダメということが分かります。

実行結果

vbaname002

Activecellを使ったコード1例

例題3

「 For Next 」と「 Offset 」を使って、ActiveCell が移動していきます。

状態が見えるようにセルに値を入力していきます。

ある特定のセルがアクティブになっている状態で、別の操作をしようとするときは、

Set 「変数」 = ActiveCell」のコードを設置して取り出すことが出来ます。

VBA
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

実行結果

vbaname003

アクティブ状態でやっておくこと まとめ

vbanamep005

既に名前を付けて保存されているエクセルBOOKやシートを開いて、非表示になっているところを「 Activate 」で表示する。

そのオブジェクトを指定するのに「ActiveWorkbook」「ActiveSheet」「ActiveCell」を使うメインの使い方。

今回はそうではなく、新規作成のブックやシートに対しての使い方を説明しました。

名無しのブックや名無しのシートでは、それに対して操作することが難しくなります。

「新規作成時はアクティブ状態」というエクセルの特性を利用して、

「Set 「変数」 = Active・・・」で(変数で)マーキングしてしまいましょうということです。

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

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

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

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

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

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