Excel VBA(Visual Basic for Applications)で、
Rangeプロパティを使った「Range("A1")」
Cellsプロパティを使った「Cells(1, 1)」
といったコードで、アクティブシートのRangeオブジェクトを取得できることを知った方からいただく、定番の質問があります。
「アクティブではないシートのRangeを取得するにはどうしたらいいのでしょうか?」
といった主旨のご質問です。
このサイト・インストラクターのネタ帳のアクセスログを見ていても、同じことを探していたと思われる、
「マクロ オブジェクト range シート 指定」
「エクセル vba range シートから指定」
「エクセル vba cells range シートを選択しない」
といった検索キーワードでのアクセスがあります。
シート名を指定してRangeを取得するサンプル
簡単なサンプルマクロをご紹介しましょう。
「2016年4月」という名前のワークシートが存在しているときに、以下のマクロを実行すると「2016年4月」シートのA1セルの値が、メッセージボックスに表示されます。
MsgBox Worksheets("2016年4月").Range("A1").Value
End Sub
上記のマクロのような「Worksheets("2016年4月").Range("A1")」といったオブジェクト式で、「2016年4月」という名前のワークシートのA1セルを表すRangeオブジェクトを取得できます。
Rangeオブジェクトを取得するオブジェクト式「Range("A1")」の前に、Worksheetオブジェクトを取得する「Worksheets("2016年4月")」というオブジェクト式を書いて「.」(ドット・ピリオド)でつなげます。
「Worksheets("2016年4月").」の後ろは、Rangeオブジェクトを取得する他のオブジェクト式でもOKですから「Worksheets("2016年4月").Cells(1, 1)」といった書き方もできます。
本来オブジェクトは階層を辿って取得する
Excelのオブジェクトは、
Applicationオブジェクト
└Workbookオブジェクト
└Worksheetオブジェクト
└Rangeオブジェクト
という階層構造になっていて、階層を順番に辿って取得するのが、原則です。
ですが、よく使われるオブジェクトは、階層を辿らずに上位のオブジェクト式を省略して記述できるように作られているのです。
Rangeオブジェクトを取得する多くのプロパティは、上位のオブジェクト式を省略した場合、アクティブなブックの、アクティブなワークシートのRangeを取得するようになっているのです。
つまり、
Range("A1").Value
というコードは、
Application.ActiveWorkbook.ActiveSheet.Range("A1").Value
と同じことを意味しています。
この記事のメインテーマである、アクティブでないシートのRangeを取得する場合には、シートを取得するオブジェクト式を、Rangeオブジェクトを取得するオブジェクト式の前に書けばいいわけです。
シートを取得するオブジェクト式の書き方はいくつかありますが、シート名をWorksheetsプロパティの引数に指定するのが一つの方法で、その具体例が上記のマクロで利用している「Worksheets("2016年4月").Range("A1")」というオブジェクト式です。
シートのインデックスを指定Rangeを取得するサンプル
以下のマクロを実行すると、一番左にあるワークシートの、A1セルの値がメッセージボックスに表示されます。
MsgBox Worksheets(1).Range("A1").Value
End Sub
インデックス(何枚目のシートか)を指定して、Worksheetオブジェクトを取得することもできます。
「Worksheets(2).Range("A1")」なら左から2枚目のワークシートのA1セルを表すRange、「Worksheets(3).Range("A1")」なら左から3枚目のワークシートのA1セルを表すRangeがそれぞれ取得できます。
ループ処理の中で、複数のワークシート上のRangeを順番に取得したいときなどに、この数字を使った指定が便利です。
他にもシートを指定してRangeオブジェクトを取得する記述方法はありますが、まずは名前を指定する方法とインデックスを指定する方法を、使えるようになりましょう。
最終更新日時:2021-12-16 09:31
Home » Excel VBA Rangeオブジェクト » シートを指定してRangeを取得する