シートを指定する必要性
実務上、VBAでマクロを作るときに、シートの指定をせずに作成することが多くあります。
たとえば、次のようなコードです。
Range("A1").Value = "売上"
とてもシンプルで簡単なコードで、A1セルに「売上」と入力するだけの処理です。
ただし、このような処理をする場合、必ず考えておかなければいけないことがあります。それは、このコードが動作するのは、“今アクティブになっているシート”に対してのみということを理解しているか?ということです。
つまり、実行したときに選ばれていたシートが「Sheet1」ならSheet1のA1に入力されますが、「Sheet2」が選ばれていたら、Sheet2のA1に書き込まれてしまいます。
これがシートを指定しないことの落とし穴になることがあります。
なぜワークシートを明示すべきなのか?
マクロを使う目的は、Excelの操作を「自動化」することです。そのため、どんなタイミングで実行しても、毎回同じ動作になることが求められます。
ところが、アクティブシートに依存したコードは、状況によって動作が変わってしまいます。
たとえば、マクロを実行する前にSheet2を開いていた場合と、Sheet1を開いていた場合とで、結果が違ってしまうのです。
これでは自動化とはいえません。「いつ、どこで実行しても、正しいシートに処理がされる」ようにするには、ワークシートを明示しておくことがとても重要です。
もちろん、その認識をした上で、コードをシンプルにするために省略するのであれば、私自身は問題ないと思っていますが、必ずその点を意識しながらコードを書くようにしましょう。
今回はシートの指定方法についてお伝えしたいので、シートを指定すべき、という視点で記載していきます。
正しい書き方の例
処理対象のシートを明確にするには、次のように書きます。
Worksheets("売上表").Range("A1").Value = "売上"
このように書けば、「売上表」という名前のシートのA1セルに、確実に「売上」と入力されます。
たとえ他のシートが表示されていても、関係ありません。
もし複数のシートを操作する場合でも、それぞれを明示しておけば、処理ミスを防ぐことができます。
シートの指定は名前でも変数でもOK
「シート名を毎回書くのは面倒」と感じる方もいるかもしれません。その場合は、シートを変数に代入して使う方法もおすすめです。
変数に代入するには、Set構文を使って、「Set 変数 = シート」と指定して利用します。
Dim ws As Worksheet
Set ws = Worksheets("売上表")
ws.Range("A1").Value = "売上"
このようにしておけば、何度もシート名を書く必要がなく、コードもすっきりします。複雑な処理を組むときや、複数のセルに何度もアクセスする場合には、特に効果的です。
アクティブなシートを基準にしない習慣をつける
実務では、「Aシートからデータをコピーして、Bシートに貼り付ける」といった作業を自動化したいケースが多くあります。このとき、シートの指定を省略していると、貼り付け先が意図と違う場所になってしまったり、エラーで止まったりする原因になります。
特に、他の人と共有するマクロや、定期的に実行する処理では、動作が安定していることが非常に重要です。
そのためにも、「ワークシートは必ず指定する」というクセを、最初のうちから身につけておくことが大切です。
「ActiveSheet」「ThisWorkbook」などとの違いも理解しよう
ちなみに、似たようなキーワードとして ActiveSheet
や ThisWorkbook
などもあります。
ActiveSheet
は、今表示されているシートを表します。これもアクティブな状態に依存するため、安定性は低めです。ThisWorkbook
は、マクロが書かれているブックを指します。複数のブックを開いているときに、対象のブックを明示したいときに使います。
これらの違いを知っておくと、より正確にシートやブックを操作できるようになります。
まとめ
マクロが意図したとおりに動かない原因の多くは、「シートやセルの指定があいまいであること」にあります。
習い始めのうちに「ワークシートは必ず明示する」という習慣をつけておくと、後々トラブルを大きく減らすことができます。
マクロを書くときには、
Worksheets("○○").Range("A1")
このような「どこに対して処理をしているのか?」を明確に書くクセを、ぜひ意識してみてください。
コメント