エクセルVBAでのシート指定方法
ExceのマクロVBAにおいてシート指定は必須になりますが、
シートの指定方法は何種類かあり、それぞれの特徴があります。
シートのインデックスで番号
シートの名称で指定
シートのオブジェクト名で指定
それぞれの主な使用場面やメリット、デメリット等を解説します。
シートのインデックス番号で指定
ただし、非表示シートも含んでいますので注意してください。
左から、1,2,3・・・の順になります。

インデックスを定数値で指定
Worksheets(1).Range("A1") = "test1"
VBAにおいて、このような使い方をするのはかなり限定的になります。
このようにWorksheets(1)の前に移動させることで実現します。
一番後ろに移動する場合
Sheets.Countがブック内の全シート数になります。
実際に存在しないシートのインデックスを指定した場合はエラーとなります。

変数で指定
Dim i As Long
For i = 1 To Worksheets.Count
Worksheets(i).Range("A1") = "test1"
Next
全シートに対する処理をする場合の定番一つになります。
・最終シートを指定
・全シートの処理
シートの名称で指定
マクロVBAにおいては、最も多く使われる方法になります。
定数値で指定
Worksheets("Sheet1").Range("A1") = "test2"
With Worksheets("Sheet1")
.Range("A1") = "test1"
.Range("A2") = "test2"
End With
Dim sht As Worksheet
Set sht = Worksheets("Sheet1")
sht.Range("A1") = "test1"
sht.Range("A2") = "test2"
第51回.Withステートメント
Constで指定
複数フロシージャーで同じシートを指定する場合、
使う都度に指定するのは、メンテナンス性が悪くなります。
シート名を変更したい時に、VBAコードの何か所も変更しなければならなくなるからです。
PublicのConst宣言で指定しておくことで、一か所で管理できます。
Public Const sht1 = "Sheet1"
Sub sample()
Worksheets(sht1).Range("A1") = "test2"
End Sub
シート名を変更する場合は、Constの値を変更するだけで完了できるようになります。
シート関数
例えば、"Sheet1"を"Sheet11"と変更してしまうと、
Worksheets("Sheet1).Range("A1") = "test1"
このVBAはエラーとなってしまいます。

とにかく、目的のシートのシート名を取得できるようにします。
例えば、
「シート指定」というシーを追加して、A1セルに、
=RIGHT(CELL("filename",Sheet1!A1),LEN(CELL("filename",Sheet1!A1))-FIND("]",CELL("filename",Sheet1!A1)))
このように入れると、A1セルには、
Sheet1
と表示されます。
そこで、このセルの値を使ってシート指定します。
Dim sht As String
sht = Worksheets("シート指定").Range("A1")
Worksheets(sht).Range("A1") = "test"
「シート指定」シートは、VBAでしか使用する必要が無いので、非表示にしておけば良いでしょう。
この方法であれば、シートを削除しない限りVBAの変更はしなくて良くなります。
シートのオブジェクト名で指定
オブジェクト名は、VBEで変更することが出来ます。

このオブジェクト名は、VBEもしくはVBAからしか変更できませんので、
通常のユーザーが間違って変更してしまう事はありません。
プロパティのNameがシート名になります。
シート名を変更してもオブジェクト名に影響はありません。
Sheet1.Range("A1") = "test"
このように、オブジェクト名を直接記述するだけになります。
obj○○○
sht○○○
このように接頭子を付けておくと管理しやすいと思います。
ActiveXコントロールをシートに追加した時は、コントロールが入力候補に表示されます。
以下は、Sheet1にActiveXのチェックボックスを追加してある場合です。

シート位置やシート名称に左右されないという利点があります。
オブジェクト名はVBEからでなければ変更できないので、間違って変更してしまう事もないでしょう。
ただし、シートが都度増減したりコピーしたりする場合には、この方法は使えませんので、
固定的なシートにおいてのみ使う方法になります。
ブックの保護
これは避けて通れません。
これに対応するには、
マクロの先頭で、必要なシートが揃っているかどうかを確認するようにすれば良いでしょうが、
さすがに、少々面倒な気がしてしまうと思います。
もしそこまでする必要があるのであれば、その前にブックの保護をしておくことをお勧めします。

VBAで臨時にシートを追加することも出来なくなってしまいます。
そのような場合は、
マクロ内で、ブックの保護を解除してからシートを挿入し、最後にまたブック保護しておく必要があります。
ThisWorkbook.Unprotect
Worksheets.Add
ThisWorkbook.Protect
第68回.シートの保護、ブックの保護(Protect)
VBAでのシート指定方法
しかし、このシート指定は意外とVBA記述が面倒なものです。
使い方にあわせて、シートの指定方法を検討してみるとVBA記述がかなり楽になる場合も多いと思います。
同じテーマ「マクロVBA技術解説」の記事
Colorプロパティの設定値一覧(カラー定数、XlRgbColor列挙)
VBAを定型文で覚えよう
VBAこれだけは覚えておきたい必須基本例文10
エクセルVBAでのシート指定方法
文字列結合&でコンパイルエラーになる理由
手動計算時の注意点と再計算方法
VBAの用語について:ステートメントとは
オブジェクト変数とは何か
VBAの少数以下の演算誤差について
スピルでVBAの何が変わったか
CharactersプロパティとCharactersオブジェクト
新着記事NEW ・・・新着記事一覧を見る
Select Caseでの短絡評価(ショートサーキット)の使い方|VBA技術解説(1月3日)
VBA100本ノック 迷宮編:巡回セル問題|VBA練習問題(12月31日)
VBA100本ノック 58本目:番号リストを簡潔にした文字列で返す|VBA練習問題(12月30日)
VBA100本ノック 57本目:ファイルの更新日時|VBA練習問題(12月29日)
VBA100本ノック 56本目:数式内の自身のシート名を消す|VBA練習問題(12月28日)
VBA100本ノック 55本目:他ブックのマクロを起動|VBA練習問題(12月26日)
VBA100本ノック 54本目:シートのChangeイベント|VBA練習問題(12月25日)
VBA100本ノック 53本目:テーブルの扱いと年齢計算|VBA練習問題(12月23日)
VBA100本ノック 52本目:複数シートの一括印刷|VBA練習問題(12月22日)
VBA100本ノック 51本目:シート一覧と印刷ページ数|VBA練習問題(12月21日)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.繰り返し処理(Do Loop)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- エクセルVBAでのシート指定方法
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。