こんにちは!ぐーです。
いつもブログをご覧いただき、ありがとうございます!
今日は、Excel VBA(マクロ)を勉強し始めたばかりの人が、きっと一度は落ち込んだことがある「シートの指定方法」についてお話しします。
「せっかく書いたコードが、シート名を変えただけでエラーになった…もう嫌だ…」
そんな経験、ありませんか? 私も最初はそうでした。「インデックスが有効範囲にありません」というエラーメッセージを見るたびに、心が折れそうになりますよね。
この記事では、「名前で指定する方法」と「番号(インデックス)で指定する方法」の2つを使い分ける方法を説明します。
1. 名前で指定する(基本のキ)
これは「名前」で呼ぶ方法です。
例えば、「売上」という名前のシートを扱いたい場合。
Worksheets(“売上”).Activate
メリット: コードを見ただけで「どのシートを扱っているか」が誰でもわかります。
デメリット: 誰かが勝手にシート名を「売上(11月)」に変えると、エラーで止まります。
職場で「VBAツールでエラーが出る…」と相談されて見てみると、シート名を勝手に変えられたことが原因なんてこともよくあります。
2. インデックス番号で指定する(左から何番目?)
これは「左から数えて何番目のシートか」で指定する方法です。
一番左にあるシートなら「1」です。
Worksheets(1).Activate
メリット: シート名が「売上」から「売上確定版」に変わっても、場所(左から1番目)が変わらなければ動き続けます。
デメリット: シートの並び順を入れ替えられると、意図しないシートを処理してしまいます。
どっちを使えばいいの?
私の経験上、おすすめの使い分けはこうです。
- 特定の決まったフォーマットに入力したい時
→ 「名前」で指定(間違ったシートに書き込まないため) - 全てのシートをまとめて集計したい時
→ 「インデックス番号」でループ処理
コピペで使える!実践コード
ここでは、一番便利な「インデックス番号」を使って、「ブック内の全シートの名前をイミディエイトウィンドウに書き出す」コードを紹介します。
これを使えば、シート名がいちいち変わっても全シートを処理できます。
Sub ShowAllSheetNames()
Dim i As Long
' シートの総数を数えて、1番目から最後まで繰り返す
For i = 1 To Worksheets.Count
' i番目のシートの名前を表示する
Debug.Print "左から" & i & "番目のシート名は: " & Worksheets(i).Name
Next i
End Sub
この「使い分け」を知っているだけで、作ったツールはぐっと壊れにくくなります。まずは1つ、コピペして動かしてみましょう。
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。


コメント