ワークシートを開いた時にマクロを実行

中級VBA

ブックオープン時にも対応したい

 あるワークシートがアクティブになった時にマクロを実行したい場合、ワークシートのイベントプロシージャである Worksheet_Activate() を使用しますが、ブックが開いた時などで既にアクティブになっている場合は、このイベントはやって来ません。

 以下のような表があった時、シートが最初に表示された時に、表の値部分をクリアしたい場合を想定して、ブックが開いた時にも値を初期化できるようにマクロを組んでみます。

どのような時に初期化したいか

 ブック内に1つのシートしかない場合は、ThisWorkbook の Workbook_Open() でシートの初期化プログラムを書けば問題ないでしょう。

 複数のシートがある場合は、ブックを開いた時にどのシートがアクティブになっているかは不定なので、アクティブシート名を探る必要があります。これに関しては、ActiveSheet.Name で簡単に取得できます。

 やり方はいくつかあると思いますが、今回は、
・ブックを開いた時、アクティブシートが「Sheet1」だったら、初期化のマクロを実行
・その他のシートだったら初期化マクロは実行せず、シートがアクティブになった時に実行

 というスタンスでプログラムを組んでみます。

初期化のマクロ

 今回はシート上の値を初期化するマクロをシートモジュールに書いていきます。

'//以下のコードはSheet1のモジュールに記述します。
Sub clearTable()
    Range("B3:D5").ClearContents
    MsgBox "値をクリアしました。"
End Sub

Private Sub Worksheet_Activate()
    Call clearTable
End Sub

 最初の関数は、値部分をクリアする関数です。2つ目は、シートがアクティブになった時に呼ばれる、イベントプロシージャになります。
 イベントプロシージャは、コードウインドウ上部の「Worksheet」「Activate」から呼び出します。

 Worksheet_Activate()内で、上記の clearTable() を呼び出しています。
これでSheet1がアクティブになった時、 clearTable() が実行されるようになります。

 ただ、このままですとブックを開いた時、Sheet1が表示されても clearTable() は実行されません。

ブックが開いた時のマクロ

 ブックが開いた時に実行されるのは Workbook_Open() というプロシージャです。
プロジェクトウインドウの ThisWorkbook を選択して、コードウインドウ上部から、「Workbook」「Open」を選択して、Workbook_Open()を呼び出して、以下のようなプログラムコード記述します。

Private Sub Workbook_Open()
    If ActiveSheet.Name = "Sheet1" Then
        Worksheets("Sheet1").clearTable
    End If
End Sub

 プログラムでは、現在アクティブになっているシート名を取得して、それが 「Sheet1」だったら Sheet1にある初期化プログラムを実行するようにしています。

まとめ

 今回作ったプログラムでは、ブックが開いた時、シートが Sheet1 に変更された時に、clearTable() が実行されるようになります。

 ブックが開いた時も含めて、シートがアクティブになった時に何かをしたいというシチュエーションは、例えばクラスを初期化したい時などに使えるでしょう。

 その他の方法としては、ブックオープンでアクティブなシート名を保持しておき、それぞれのシートで初期化処理などを行い、最後にアクティブシートを元に戻すという方法も考えられます。
 いずれにせよ、シートのイベントプロシージャである Worksheet_Activate() だけでは役不足なので、Workbook_Open() も併用する必要があるでしょう。

コメント

タイトルとURLをコピーしました