ExcelマクロVBA技術解説
エクセルVBAでのシート指定方法

ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
最終更新日:2019-10-25

エクセルVBAでのシート指定方法

ExceのマクロVBAにおいてシート指定は必須になりますが、
シートの指定方法は何種類かあり、それぞれの特徴があります。


シート指定方法ごとに使い方を簡単に説明しながら、
それぞれの主な使用場面やメリット、デメリット等を解説します。

インデックス指定

シートのインデックス(順番の数値)で指定する方法になります。

シートのインデックスは、シートの左からの順番通りになります。
ただし、非表示シートも含んでいますので注意してください。
左から、1,2,3・・・の順になります。

マクロ VBA 画像

インデックスを定数値で指定

定数値を直接指定します。
Worksheets(1).Range("A1") = "test1"

手動でシートの順番を入れ替えてしまうと別のシートになってしまうので、
VBAにおいて、このような使い方をするのはかなり限定的になります。

あるシートを先頭に移動する場合
Worksheets("Sheet2").Move Before:=Worksheets(1)
このようにWorksheets(1)の前に移動させることで実現します。

一番後ろに移動する場合
Worksheets("Sheet2").Move After:=Worksheets(Sheets.Count)
Sheets.Countがブック内の全シート数になります。

実際に存在しないシートのインデックスを指定した場合はエラーとなります。

マクロ VBA 画像


変数で指定

変数を使って指定します。



Dim i As Long
For i = 1 To Worksheets.Count
  Worksheets(i).Range("A1") = "test1"
Next

全シートに対する処理をする場合の定番一つになります。

練習問題26(全シート処理とハイパーリンク)
マクロVBA練習問題 全シートのハイパーリンク付き一覧を先頭シートに作成します。現在のブックの先頭に新規シートを追加し、既存シートのシート名一覧をハイパーリンク付きで作成して下さい。※これは実務においても非常に良く発生する要求です。
VBAこれだけは覚えておきたい必須基本例文10
VBAを覚える順序としては、・文法から始める方法 ・実践例文から始める方法 どちらが良いとは言い切れませんが、もし文法習得に限界を感じているなら、実践的な基本例文を暗記することから始めてみると良いでしょう。また、VBA習得において、・何を目標にやっていけばよいのか ・どの程度出来たらVBAができると言えるのか こんな疑問もでてくるでしょう。

インデックス指定を使う場面は主に以下になります。
・先頭シートを指定
・最終シートを指定
・全シートの処理


名称指定

シートの名称で指定する方法になります。
マクロVBAにおいては、最も多く使われる方法になります。

定数値で指定

定数値を直接指定します。
Worksheets("Sheet1").Range("A1") = "test2"

一般的で最も良く書かれているVBAコードになります。

VBAの記述が長くなってしまうので、Withステートメントやオブジェクト変数を使うようにします。

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ステートメント
Withステートメントを使う事で、Withに指定したオブジェクトに対してオブジェクト名を再度記述することなく、プロパティやメソッドを記述することができます。文章で例えて言えば、主語を一度書いたら、その後は主語を省略するような書き方になります。
第52回.オブジェクト変数とSetステートメント
変数のデータ型の説明において、Object…オブジェクト型 というのがあった事を覚えているでしょうか。数値や文字ではなく、オブジェクトを入れる変数がオブジェクト変数です。オブジェクトと言っても、いろいろなものがあります。

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はエラーとなってしまいます。

マクロ 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で変更することが出来ます。

マクロ VBA 画像

初期のオブジェクト名は、このようにSheet1から順に番号が振られています。
このオブジェクト名は、VBEもしくはVBAからしか変更できませんので、
通常のユーザーが間違って変更してしまう事はありません。
プロパティのNameがシート名になります。
シート名を変更してもオブジェクト名に影響はありません。
Sheet1.Range("A1") = "test"
このように、オブジェクト名を直接記述するだけになります。

VBA記述時にわかり易く読みやすいように、オブジェクト名は適切な名前にしておきましょう。
obj○○○
sht○○○
このように接頭子を付けておくと管理しやすいと思います。

オブジェクト名で指定すると、
ActiveXコントロールをシートに追加した時は、コントロールが入力候補に表示されます。
以下は、Sheet1にActiveXのチェックボックスを追加してある場合です。

VBA マクロ 画像

この方法の場合、
シート位置やシート名称に左右されないという利点があります。
オブジェクト名はVBEからでなければ変更できないので、間違って変更してしまう事もないでしょう。
ただし、シートが都度増減したりコピーしたりする場合には、この方法は使えませんので、
固定的なシートにおいてのみ使う方法になります。

ブックの保護

VBAでシートを指定している限り、対象のシートが削除されてしまうとVBAはエラーとなります。
これは避けて通れません。
これに対応するには、
マクロの先頭で、必要なシートが揃っているかどうかを確認するようにすれば良いでしょうが、
さすがに、少々面倒な気がしてしまうと思います。
もしそこまでする必要があるのであれば、その前にブックの保護をしておくことをお勧めします。

マクロ VBA 画像

ブックを保護してしまうと、
VBAで臨時にシートを追加することも出来なくなってしまいます。
そのような場合は、
マクロ内で、ブックの保護を解除してからシートを挿入し、最後にまたブック保護しておく必要があります。

ThisWorkbook.Unprotect
Worksheets.Add
ThisWorkbook.Protect

第68回.シートの保護、ブックの保護(Protect)
せっかく作ったExcelシートを間違って壊してしまったり、Excel操作に慣れない人が壊してしまったりしたら困ります。無用な改変、意図しない変更からシートを保護するには、ワークシートを保護します。ただしシートの削除は、シート保護では守れません、シートの保護に対応するには、ブックの保護が必要です。

VBAでのシート指定方法

VBAにおいて、シートの指定は必ず必要になるもので、避けては通れないものです。
しかし、このシート指定は意外とVBA記述が面倒なものです。
使い方にあわせて、シートの指定方法を検討してみるとVBA記述がかなり楽になる場合も多いと思います。



同じテーマ「マクロVBA技術解説」の記事

複雑な条件(複数除外等)のオートフィルター(AutoFilter)
クリップボードを使わないセルのCopy
Rangeの使い方:最終行まで選択を例に
フルパスをディレクトリ、ファイル名、拡張子に分ける
Colorプロパティの設定値一覧
VBAを定型文で覚えよう
VBAこれだけは覚えておきたい必須基本例文10
エクセルVBAでのシート指定方法
文字列結合&でコンパイルエラーになる理由
手動計算時の注意点と再計算方法
VBAの用語について:ステートメントとは


新着記事NEW ・・・新着記事一覧を見る

VBAにおける変数のメモリアドレスについて|VBA技術解説(11月8日)
空文字列の扱い方と処理速度について(""とvbNullString)|VBA技術解説(1月7日)
Errオブジェクトとユーザー定義エラー|VBA入門(11月5日)
シングルクォートの削除とコピー(PrefixCharacter)|VBA技術解説(11月4日)
ユーザー定義型の制限とクラスとの使い分け|VBA技術解説(11月3日)
クリップボードに2次元配列を作成してシートに貼り付ける|VBA技術解説(11月1日)
VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)|VBA技術解説(10月31日)
VBAクラスのAttributeについて(既定メンバーとFor Each)|VBA技術解説(10月19日)
VBAの用語について:ステートメントとは|VBA技術解説(10月16日)
VBAのマルチステートメント(複数のステートメントを同じ行に)|VBA技術解説(10月14日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • エクセルVBAでのシート指定方法

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。




    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ