「vba シート追加 アクティブにしない」
といった検索で、このサイト・インストラクターのネタ帳へのアクセスがあることに気づきました。
Excel VBA(Visual Basic for Applications)で、シートの追加を行ったときに、その追加されたばかりのシートをアクティブにしない方法を探している方による検索です。
シート追加時に新しいシートがアクティブになるのがExcelの仕様
まずは、あらためてExcelでシートの挿入操作を行ってみてください。
ショートカットキー[Shift]+[F11]でも、[ワークシートの挿入]ボタンを使っても、シートの挿入を行ったときには、新たに挿入されたシートがアクティブになります。
これがExcelの仕様です。
そしてExcel VBAは、そのようなExcel操作を自動化することが主な目的のプログラミング言語です。
ですから、Excel VBAからシートを追加したときにも、追加された新しいシートがアクティブになるのが仕様です。
オブジェクト変数を使ってシート追加時にアクティブシートを変更しないサンプルマクロ
シートを追加したときに、アクティブシートを変更したくないのであれば、追加前にアクティブだったシートを、シートの追加処理を行ったあとでアクティブにしなおしましょう。
Dim sh As Object ' Worksheet or Chart
Set sh = ActiveSheet
Sheets.Add
sh.Select
オブジェクト変数にアクティブなシートをセットしておいてから、
Set sh = ActiveSheet
シートの追加を行って、
Sheets.Add
オブジェクト変数を使って元のアクティブシートを選択すると、
sh.Select
VBAからシートを追加したときに、アクティブシートが切り替わらないように見せられます。
文字列型の変数を使ってシート追加時にアクティブシートを変更しないサンプルマクロ
オブジェクト変数を理解できていない方の場合は、以下のマクロのほうがわかりやすいでしょう。
Dim sh_nm As String ' アクティブシートの名前
sh_nm = ActiveSheet.Name
Sheets.Add
Sheets(sh_nm).Select
こちらは、文字列を格納しておく普通の変数に、シート追加前のアクティブシートの名前を代入しておいて、
sh_nm = ActiveSheet.Name
シートの追加処理を行ったあとに、そのシート名を使って選択しなおしています。
Sheets.Add
Sheets(sh_nm).Select
先ほどのオブジェクト変数を利用したマクロでは、オブジェクト変数を使って元々のアクティブシートを取得していますが、この文字列型の変数を使ったマクロではSheetsコレクションオブジェクトのデフォルト引数に文字列を指定するオブジェクト式で、元々のアクティブシートを取得しています。
オブジェクト変数の中身を確認しておきましょう
オブジェクト変数がどうも苦手という方は、オブジェクト変数を使ったマクロをただコピペするのではなく、マクロのステップ実行中に、オブジェクト変数の中身を眺めておきましょう。
文字列や数値が入る普通の変数は、
「変数とはデータを入れておく箱みたいなものです」
という例えの解説でなんとなく理解できてしまいますが、オブジェクト変数の場合はこのような箱の例えだけでは、決してわかるようにはなりません。
オブジェクト変数に何が入っているのかを、ローカルウィンドウを使って見ることやオブジェクトブラウザーを調べることを何度も繰り返すことが、オブジェクト変数の理解につながります。
今回のオブジェクト変数を使ったマクロの場合、オブジェクト変数にアクティブシートを表すオブジェクトをセットする、
Set sh = ActiveSheet
の行を過ぎたあとで、ローカルウィンドウを見ましょう。
たくさんの項目が並んでいるので何を見たらいいのか、最初はわからないと思いますが、Name・Type・Indexあたりをまずは見ましょう。
Nameにはアクティブシートの名前、アクティブシートがワークシートだったのであればTypeにはxlWorksheetというワークシートであることを表す定数、Indexにはアクティブシートが左から何番目かが、それぞれ表示されているはずです。
このようなセットされているオブジェクトの持つ、たくさんの情報にアクセスできるのがオブジェクト変数です。ローカルウィンドウに表示されているその他の項目も、オブジェクト変数から取得できる情報です。
このオブジェクト変数の中身を見る体験を積み重ねないと、オブジェクト変数を本当に理解することはできないはずです。
- Newer:MergeArea.Countとは
- Older:配列を使ってアクティブシート以外のシートを選択する
Home » エクセルマクロ・Excel VBAの使い方 » Sheets・Worksheet » VBAでシートの追加時にアクティブシートを変更しないように