「マクロ アクティブシート以外を選択 array」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。
配列変数を使って、アクティブシート以外のシートをすべて選択するには、VBA(Visual Basic for Applications)でどのようなコードを書けばいいのか、探していた方による検索キーワードです。
そもそも配列を使う必要があるのか、まず考えていただきたいところではありますが、ここでは配列を使ったコードの練習の意味から、そんなマクロをご紹介します。
配列を使って全シートを選択するサンプルマクロ
「マクロ アクティブシート以外を選択 array」
という検索をなさった方が、どの程度のスキルでらっしゃるのかがわかりませんが、もしも配列にまだあまり慣れていない段階なのであれば、まずは、より簡単な全シートを選択するマクロを配列を使って書いてみることをおすすめします。
Dim cnt As Long ' シートの枚数
Dim arr() As String ' シート名
Dim i As Long
cnt = Sheets.Count
ReDim arr(1 To cnt)
For i = 1 To cnt
arr(i) = Sheets(i).Name
Next i
Sheets(arr).Select
End Sub行っている処理は以下のとおりです。
まず、シートの枚数を変数に格納しておいてから、
cnt = Sheets.Count
配列のサイズを決めて、
ReDim arr(1 To cnt)
For~Nextループの中で、全シートの名前を配列に格納して、
For i = 1 To cnt
arr(i) = Sheets(i).Name
ループを抜けたら、アクティブシートを除いたシート名を格納した配列を利用してシートを選択しています。
Sheets(arr).Select
アクティブシート以外のシートをすべて選択するサンプルマクロ
配列を使って、アクティブシート以外の全シートを選択する場合、上記のマクロと基本構造は似ていますが、考えるなければいかないことが増えます。
Dim act_sh As String ' アクティブなシート名
Dim cnt As Long ' シートの総数
Dim arr() As String ' シート名
Dim n As Long ' 配列のインデックス番号
Dim i As Long
cnt = Sheets.Count
If cnt = 1 Then Exit Sub
ReDim arr(1 To cnt - 1)
act_sh = ActiveSheet.Name
n = 1
For i = 1 To cnt
If Sheets(i).Name <> act_sh Then
arr(n) = Sheets(i).Name
n = n + 1
End If
Next i
Sheets(arr).Select
End Subシートの総数が3枚くらいのブックで、ローカルウィンドウで配列の中身をしっかりと確認しながら、ショートカットキー[F8]でステップ実行してみてください。
サンプルマクロの解説
先にご紹介した、全シートの選択マクロと同じく、シートの枚数を変数に格納しておきます。
cnt = Sheets.Count
シートの枚数が1枚だったときにはSubプロシージャを終了します。
If cnt = 1 Then Exit Sub
これは全シート選択マクロにはなかった処理です。
この処理が必要な理由は、次に登場する配列のサイズを決める処理に関係します。
シートの枚数が2枚以上だったときに、配列のサイズを決めます。
ReDim arr(1 To cnt - 1)
選択するのが全シートではないのでインデックス番号の上限を、シートの総数からマイナス1した値「cnt - 1」にしています。この「cnt - 1」によって、シートが1枚だったときには、
ReDim arr(1 To cnt - 1)
が、
ReDim arr(1 To 0)
となるために実行時エラーが発生します。これを避けるため先の、
If cnt = 1 Then Exit Sub
という処理が入っています。
アクティブなシートを除いたシートを選択したいので、現在アクティブになっているシートの名前を変数に格納しておきます。
act_sh = ActiveSheet.Name
全シート選択マクロの場合は、カウンター変数・iを配列のインデックス番号用の変数として利用できましたが、このマクロの場合は、ループ処理の途中、アクティブなシートを処理した時点から、カウンター変数と配列のインデックス番号がずれてしまいます。そのためインデックス番号用の変数を、別に用意しておきます。
n = 1
全シート選択マクロと同じく、すべてのシートに対してFor~Nextループを回して、
For i = 1 To cnt
シートの名前を調べて、アクティブなシートではなかったときに、
If Sheets(i).Name <> act_sh Then
そのシート名を配列に格納して、
arr(n) = Sheets(i).Name
配列のインデックス番号をインクリメントしておきます。
n = n + 1
ループを抜けたら、アクティブシートを除いたシート名を格納した配列を利用して、シートを選択です。
Sheets(arr).Select
Home » エクセルマクロ・Excel VBAの使い方 » 配列 » 配列を使ってアクティブシート以外のシートを選択する