Home » エクセルマクロ・Excel VBAの使い方 » 配列 » 配列を使ってアクティブシート以外のシートを選択する

配列を使ってアクティブシート以外のシートを選択する

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

「マクロ アクティブシート以外を選択 array」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。

配列変数を使って、アクティブシート以外のシートをすべて選択するには、VBA(Visual Basic for Applications)でどのようなコードを書けばいいのか、探していた方による検索キーワードです。

そもそも配列を使う必要があるのか、まず考えていただきたいところではありますが、ここでは配列を使ったコードの練習の意味から、そんなマクロをご紹介します。

[スポンサードリンク]

配列を使って全シートを選択するサンプルマクロ

「マクロ アクティブシート以外を選択 array」
という検索をなさった方が、どの程度のスキルでらっしゃるのかがわかりませんが、もしも配列にまだあまり慣れていない段階なのであれば、まずは、より簡単な全シートを選択するマクロを配列を使って書いてみることをおすすめします。

全シートを選択するには「Sheets.Select」という1行のコードで実際には済んでしまいますが、配列に慣れていない方で、配列を使えるようになりたいという方は、トレーニングとして以下のようなマクロを、自分自身で考えて書いてみてください。

Sub 配列を使って全シートを選択する()

 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

アクティブシート以外のシートをすべて選択するサンプルマクロ

配列を使って、アクティブシート以外の全シートを選択する場合、上記のマクロと基本構造は似ていますが、考えるなければいかないことが増えます。

このマクロに限らず、プログラミングでは全部に対して処理するよりも、一部にだけ処理するほうが面倒なケースが多いものです。

Sub 配列を使ってアクティブでない全シートを選択する()

 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の使い方 » 配列 » 配列を使ってアクティブシート以外のシートを選択する

TrackBack:0

TrackBack URL

Home » エクセルマクロ・Excel VBAの使い方 » 配列 » 配列を使ってアクティブシート以外のシートを選択する

「配列」の記事一覧

検索


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

.