非表示のシートを挿入する


マクロの中で、非表示のワークシートを作成し、そこで何かの処理をすることがあります。そんなとき、多くの人が冗長な書き方をしていますね。まずは、冗長バージョンから。

Sub Sample1()
    Dim NowSheet As Worksheet, NewSheet As Worksheet
    Set NowSheet = ActiveSheet
    Sheets.Add
    Set NewSheet = ActiveSheet
    NewSheet.Visible = False
    NowSheet.Select
    NewSheet.Range("A1") = 100
End Sub

思いっきり冗長にしてみましたw

さて、これはどう考えるのかというと。まず、Sheets.Addの「Addメソッド」は、挿入したシートを返します。

ここで重要なことは、Excelは新しいシートを挿入すると必ずそれは、アクティブシートの左側に挿入されるということです。これ重要ですから、よく覚えておいてください。

さて、挿入したあと、次にやりたいのは、この挿入したシートを非表示にすることです。非表示状態のシートをいきなり挿入することはできませんから、挿入する→非表示にする という2ステップが必要です。シートを非表示にするには、シートのVisibleプロパティにFalseを指定します。

いま非表示にしたいシートとは何ですか?さっきの Sheets.Add で挿入したシートでしょ。

で、Sheets.Add が、その挿入したシートを返すんでしたよね。

だから、これでいけます。

シートを非表示にするとどうなりますか?シートを非表示にすると、必ず非表示になったシートの右側にあるシートがアクティブシートになります。よろしいですか?先ほど"覚えておいてください"と言った重要なExcelの挙動がありましたね。そう、新しく挿入したシート(非表示にするシート)は、必ず Sheets.Add を実行する前のアクティブシートから見て左側に挿入されるんです。で、その挿入したシートを非表示にすると、右側のシートがアクティブシートになるんでしょ。それって、Sheets.Add する前のアクティブシートですよね。ですから、シートを挿入して非表示にした後で「前のアクティブシートに戻る」という動作は不要なんです。自動的に戻りますから。当然、前のアクティブシートをオブジェクト変数に入れて覚えておく、なんて必要はありません。

したがって先のコードのうち、非表示のシートを挿入して、前のアクティブシートに戻る部分

Sub Sample1()
    Dim NowSheet As Worksheet, NewSheet As Worksheet  ''---ここから---
    Set NowSheet = ActiveSheet
    Sheets.Add
    Set NewSheet = ActiveSheet
    NewSheet.Visible = False
    NowSheet.Select                                   ''---ここまで---
    NewSheet.Range("A1") = 100
End Sub

は、次の1行で済みます。

Sub Sample1()
    Sheets.Add.Visible = False
    NewSheet.Range("A1") = 100
End Sub

では、挿入した非表示シートを操作するには、どうしたらいいでしょう。でも、その挿入した非表示シートって、必ずアクティブシートの左側にあるんですよね。だったら、それを表す Previous というプロパティがあります。Previous プロパティは、指定したシートの左側にあるシートを返します。ちなみに右側にあるシートを表すときは Next プロパティを使います。したがって、

Sub Sample1()
    Sheets.Add.Visible = False
    ActiveSheet.Previous.Range("A1") = 100
End Sub

となります。

Previous プロパティや Next プロパティに関しては

隣のシートを返すプロパティ

をご覧ください。