Home » エクセルマクロ・Excel VBAの使い方 » Sheets・Worksheet » VBAでシートの追加時にアクティブシートを変更しないように

VBAでシートの追加時にアクティブシートを変更しないように

対象:Excel2007, Excel2010, Excel2013, Windows版Excel2016

「vba シート追加 アクティブにしない」
といった検索で、このサイト・インストラクターのネタ帳へのアクセスがあることに気づきました。

Excel VBA(Visual Basic for Applications)で、シートの追加を行ったときに、その追加されたばかりのシートをアクティブにしない方法を探している方による検索です。

シート追加時に新しいシートがアクティブになるのがExcelの仕様

まずは、あらためてExcelでシートの挿入操作を行ってみてください。

ショートカットキー[Shift]+[F11]でも、[ワークシートの挿入]ボタンを使っても、シートの挿入を行ったときには、新たに挿入されたシートがアクティブになります。

これがExcelの仕様です。

そしてExcel VBAは、そのようなExcel操作を自動化することが主な目的のプログラミング言語です。

ですから、Excel VBAからシートを追加したときにも、追加された新しいシートがアクティブになるのが仕様です。

[スポンサードリンク]

オブジェクト変数を使ってシート追加時にアクティブシートを変更しないサンプルマクロ

シートを追加したときに、アクティブシートを変更したくないのであれば、追加前にアクティブだったシートを、シートの追加処理を行ったあとでアクティブにしなおしましょう。

Sub シート追加時にアクティブシートを変更しない_オブジェクト変数()

 Dim sh As Object ' Worksheet or Chart

 Set sh = ActiveSheet
 Sheets.Add
 sh.Select

End Sub

オブジェクト変数にアクティブなシートをセットしておいてから、
 Set sh = ActiveSheet

シートの追加を行って、
 Sheets.Add

オブジェクト変数を使って元のアクティブシートを選択すると、
 sh.Select

VBAからシートを追加したときに、アクティブシートが切り替わらないように見せられます。

文字列型の変数を使ってシート追加時にアクティブシートを変更しないサンプルマクロ

オブジェクト変数を理解できていない方の場合は、以下のマクロのほうがわかりやすいでしょう。

Sub シート追加時にアクティブシートを変更しない()

 Dim sh_nm As String ' アクティブシートの名前

 sh_nm = ActiveSheet.Name
 Sheets.Add
 Sheets(sh_nm).Select

End Sub

こちらは、文字列を格納しておく普通の変数に、シート追加前のアクティブシートの名前を代入しておいて、
 sh_nm = ActiveSheet.Name

シートの追加処理を行ったあとに、そのシート名を使って選択しなおしています。
 Sheets.Add
 Sheets(sh_nm).Select

先ほどのオブジェクト変数を利用したマクロでは、オブジェクト変数を使って元々のアクティブシートを取得していますが、この文字列型の変数を使ったマクロではSheetsコレクションオブジェクトのデフォルト引数に文字列を指定するオブジェクト式で、元々のアクティブシートを取得しています。

オブジェクト変数の中身を確認しておきましょう

オブジェクト変数がどうも苦手という方は、オブジェクト変数を使ったマクロをただコピペするのではなく、マクロのステップ実行中に、オブジェクト変数の中身を眺めておきましょう。

文字列や数値が入る普通の変数は、
「変数とはデータを入れておく箱みたいなものです」
という例えの解説でなんとなく理解できてしまいますが、オブジェクト変数の場合はこのような箱の例えだけでは、決してわかるようにはなりません。

オブジェクト変数に何が入っているのかを、ローカルウィンドウを使って見ることやオブジェクトブラウザーを調べることを何度も繰り返すことが、オブジェクト変数の理解につながります。

今回のオブジェクト変数を使ったマクロの場合、オブジェクト変数にアクティブシートを表すオブジェクトをセットする、
 Set sh = ActiveSheet
の行を過ぎたあとで、ローカルウィンドウを見ましょう。

VBAでシートの追加時にアクティブシートを変更しないように

たくさんの項目が並んでいるので何を見たらいいのか、最初はわからないと思いますが、Name・Type・Indexあたりをまずは見ましょう。

Nameにはアクティブシートの名前、アクティブシートがワークシートだったのであればTypeにはxlWorksheetというワークシートであることを表す定数、Indexにはアクティブシートが左から何番目かが、それぞれ表示されているはずです。

このようなセットされているオブジェクトの持つ、たくさんの情報にアクセスできるのがオブジェクト変数です。ローカルウィンドウに表示されているその他の項目も、オブジェクト変数から取得できる情報です。

このオブジェクト変数の中身を見る体験を積み重ねないと、オブジェクト変数を本当に理解することはできないはずです。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » Sheets・Worksheet » VBAでシートの追加時にアクティブシートを変更しないように

「Sheets・Worksheet」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.