VBAでマクロを書くとき、シートを指定せずに Range("A1").Value = "売上" と書くことがあります。シンプルで手軽な書き方ですが、このコードはそのとき選ばれていたシート(アクティブシート)にしか動作しないという落とし穴があります。
この記事では、なぜシートを明示すべきなのか、3つの指定方法とそれぞれの使い分けを解説します。
シートを明示しないと何が起きるのか?
次のコードはシートを指定していないため、実行時にアクティブになっているシートに書き込まれます。
' シートを指定していない例(非推奨)
Range("A1").Value = "売上"
Sheet1が開いていればSheet1に、Sheet2が開いていればSheet2に書き込まれます。毎回同じ動作になるとは限らないため、自動化としての信頼性が下がります。
シートをWorksheets名で明示するには?
シート名を直接指定するのが最も基本的な方法です。
Worksheets("売上表").Range("A1").Value = "売上"
「売上表」シートが表示されていなくても、常に正しいシートに書き込まれます。複数のシートを操作する場合もそれぞれ明示しておけば処理ミスを防げます。
シートを変数(Set)に代入して使うには?
同じシートを何度も参照する場合、変数に代入しておくとコードがすっきりします。
Dim ws As Worksheet
Set ws = Worksheets("売上表")
ws.Range("A1").Value = "売上"
ws.Range("A2").Value = "合計"
ws.Range("B1").Font.Bold = True
シート名を何度も書く必要がなくなり、シート名を変更する場合も1か所だけ修正すれば済みます。
ActiveSheet・ThisWorkbookとの違いを理解するには?
似たようなキーワードの違いを整理しておきましょう。
| キーワード | 意味 | 安定性 |
|---|---|---|
Worksheets("シート名") | 名前を指定したシート | 高い(推奨) |
ActiveSheet | 今アクティブなシート | 低い(状況依存) |
ThisWorkbook | マクロが書かれているブック | 高い(ブック指定に有効) |
ActiveSheet は今表示されているシートを指すため、アクティブ状態に依存して動作が変わります。特に共有するマクロや定期実行する処理では使用を避けるのが安全です。
複数ブックを扱う場合にシートを正確に指定するには?
複数のブックを開いている場合は、ブックも一緒に指定することで誤操作を防げます。
Dim wb As Workbook
Dim ws As Worksheet
Set wb = Workbooks("売上.xlsx")
Set ws = wb.Worksheets("売上表")
ws.Range("A1").Value = "売上"
「どのブックの、どのシートの」という階層を明示することが、安定したマクロの基本です。
まとめ
- シートを指定しないコードはアクティブシートに依存し、動作が不安定になる
Worksheets("シート名").Range()と明示することで常に正しいシートに処理できる- 同じシートを複数回使う場合は
Set ws = Worksheets("シート名")で変数に代入する ActiveSheetは状況依存のため、共有・定期実行マクロでは避けるのが安全- 「どのブックの、どのシートか」を明示する習慣がトラブルの少ない安定したコードにつながる
よくある質問
シート名を変更するとマクロが動かなくなりますか?
なります。Worksheets("売上表") はシート名で指定しているため、シート名が変わるとエラーになります。シート名が変わる可能性がある場合は、コード名(VBEプロパティに表示される Sheet1 などの名前)を使う方法もあります。
シートのインデックス番号で指定することはできますか?
できます。Worksheets(1) で左から1番目のシートを指定できます。ただしシートの順番が変わると意図しないシートを操作してしまうため、シート名での指定の方が安全です。
Sheets()とWorksheets()の違いは何ですか?
Worksheets はデータシートだけを対象にします。Sheets はグラフシートなどを含むすべてのシートを対象にします。通常のデータ操作には Worksheets を使うのが無難です。
ThisWorkbook.Worksheets()と書く必要はありますか?
複数のブックを同時に開いていない場合は Worksheets("シート名") だけで問題ありません。複数ブックを扱う場合や、どのブックのシートかを明確にしたい場合に ThisWorkbook.Worksheets() と書くと安全です。
シートを指定してもエラーが出る場合はどんな原因が考えられますか?
シート名のスペルミスや全角・半角の違いが最もよくある原因です。また、指定したシートが存在しない場合(削除・名称変更)もエラーになります。実行前に MsgBox Worksheets("売上表").Name でシート名を確認する方法が便利です。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



