ユーザが変更可能な ワークシート名を使って複数のワークシートを管理する 場合、ユーザが意図せずワークシート名を変えてしまうとVBA実行時にエラーが発生します。このような場合、ワークシート「オブジェクト名」を使えば、問題を回避できます。
実は、VBAコード上でワークシートを扱う方法には、ワークシート名を使って複数のワークシートを管理する方法以外にもう1つの方法がありますので、その方法についてお話ししたいと思います。
今回は、下記ファイルを使いながらすすめますので、準備してくださいね。
Excelファイルの中身は、引き続きデータ整形前の シートを含む 3枚で構成されています。では、ワークシートの中身を確認しましたら、つぎにVBE画面を開いてみてください。
今回はコードの説明の前に、VBE画面左上のプロジェクトエクスプローラの画面を使ってお話しをします。
図の枠に囲まれた部分は、3枚のワークシートに対するオブジェクトモジュールになります。
青枠で囲った文字は、Excelシートの下部にも表示されてます「ワークシート名」です。先ほどExcelシートで確認した3枚のワークシート名が確認できますよね。
赤枠で囲った文字は、ワークシートの「オブジェクト名」と呼ばれるものです。実はExcelの中の1部品であるワークシートは、「ワークシート名」とは別に固有の名前を持っています。
Excelが自分自身のパーツ(オブジェクト)を管理するために、ユーザがつける名前(ワークシート名)とは別に設けた名前だと考えてください。
またこのオブジェクト名は、WorkSheetオブジェクトのCodeNameプロパティで取得できますので併せて覚えておいてくださいね。
今回は、このオブジェクト名(CodeNameプロパティ)を使ってVBA上で複数のワークシートを扱う方法になります。
では、お待たせしました。今回は前回の書き換えでOKですので、次のように修正してみてください。朱書き部が書き換えの対象箇所になりますが、アンダーラインは、コメントアウトするだけです。
赤枠は、「VBAコードにワークシート名を使う複数ワークシート管理法」の記事の中で「ワークシート名」で設定した変数名が書かれていた箇所でした。今回は先ほどお話ししました「オブジェクト名」に書き換えています。
では、書き換えが終わりましたら、そのまま実行してみてください。
エラーなく実行されましたでしょうか。
VBAコード上で管理するワークシートを、「オブジェクト名」に変えることにより、「ワークシート名」による変数を使ったときよりも、コードが2行(アンダーラインの箇所)減りましたよね。
このように、オブジェクト名を使う場合は、変数の宣言をしてワークシートを変数名にセットする必要がなくなるのです。
その理由は、管理する部品の1つとして、もとからExcel自身がワークシートに付けた名前なので、わざわざVBAコード上で宣言しなくても、Excelに認識されるからです。
さらに、ワークシートをオブジェクト名で扱う大きなメリットがあります。それは、ユーザがワークシート名を変更してもコードは問題なく動くことです。
一方、ワークシート名で扱う場合は、ユーザ側でワークシート名を変更されると、VBAコードはエラーになります。
なおオプジェクト名も、ワークシート名と同様、名前を変更できますが、ユーザ側で容易に変更できません。
実は、このワークシートのオブジェクト名ですが、オブジェクトモジュールの名前ですので、他の標準モジュールと同様、VBE画面左下のプロパティウィンドウのオブジェクト名欄を変更すれば変えることができます。
試しに、ワークシート名「テンプレート」のオブジェクトモジュール名を下図のように変えてみました。
まとめ
今回は、VBA上でワークシートを管理する方法として、ワークシートのオブジェクト名を使う方法をお話ししました。
VBA上でワークシートオブジェクトの扱いを「ワークシート名」か、「オブジェクト名」のどちらにするかは、ユーザ側でワークシート名を変更するかに、 よります。また経験上、管理するワークシート数が多いとか、コードが長いほど「オブジェクト名」で扱った方が楽です。
ただ、初心者の方は、オブジェクト変数を「Set」で定義するルールに慣れておいた方が良いと思います。理由は、今後VBA内で他の種類のオブジェクトを取り扱う際の理解がスムーズになるからです。
本ブログでもしばらくは、「ワークシート名」で設定する方法でVBAコードを書きます。そして、ご紹介するVBAコードが長く、ワークシート数が増えてきたら「オブジェクト名」で取り扱うようにしたいと思います。