Sibainu Relax Room

愛犬の柴犬とともに過ごす部屋

EXCEL データがある複数のシートの選択

MicroSoft の解説

MicroSoft のホームページ Learn > Office VBA リファレンス > Excel > 概念 > ブックとワーク の中の「複数のシートを参照する」の解説によりますと

複数のシートを同時に指定するには、 Array 関数を使います。

とあります。

そして次のコードが掲載されています。

copy

Sub Several() 
 Worksheets(Array("Sheet1", "Sheet2", "Sheet4")).Select 
End Sub

このようにできれば次のようにもできます。

copy

Sub Several1()
    Dim Target        As Variant

    Target = Array("Sheet1", "Sheet2", "Sheet4")
    
    Worksheets(Target).Select

End Sub

データがある複数のシートの選択

考えの方向は、前のコードの配列「 Target 」にデータがあるシートの名前を格納する方法を検討することになります。

シートの設定

シート「 sheet1 」「 sheet3 」「 sheet4 」のセル「 A1 」に 1 をセットし、他のシートには何もセットしていません。

この設定で、シート「 sheet1 」のセルをダブルクリックしてみます。

想定とおりシート「 sheet1 」「 sheet3 」「 sheet4 」が選択状態になりました。

シート「Sheet1」のコード

コードは、シート「 sheet1 」にVBエディターで次のコードを書いています。

copy

Option Explicit
'---------------------------------------
'
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _
                                        Cancel As Boolean)

    Call Several2
    
End Sub
'---------------------------------------
'
Sub Several2()
    Dim Sh              As Worksheet
    Dim iCount          As Long
    Dim Target()        As Variant

    'データがあるシートの名前を格納します。
    'とりあえずシートの数だけ確保
    ReDim Target(Worksheets.Count - 1)

    For Each Sh In Worksheets
        'データの有無の判定
        'この例のシートでは UsedRange 左上のトップで判定しています。
        If Sh.UsedRange.Cells(1, 1) <> "" Then
            Target(iCount) = Sh.Name
            iCount = iCount + 1
        End If
    Next Sh

    If iCount > 0 Then
        '余分な配列の除去
        ReDim Preserve Target(iCount - 1)
        'シートの一括選択
        Worksheets(Target).Select
    End If

End Sub

データなしの定義

使用範囲の取得に UsedRange を使っていますが、取得する範囲は表面上「空」の状態でも計算式のあるセルも含みますので、どういう状態をデータがないと定義するかにかかわります。

したがって、データがない判定は書式など状況に応じて決める必要があります。