【VBA】作業シートを明示すべき理由と簡単な指定方法

ひとり働き方改革
記事内に商品プロモーションが含まれていることがあります。

この記事では以下のことが分かります。

  • シートを明示すべき理由
  • シートを変数に代入するメリット
  • シートを変数に代入する方法

この記事を読むことで、不安定なコードを書くリスク下げる・コードの入力ミスを減らすことが出来るようになります。

シートを明示すべき理由とか変数に代入するメリットとかはどうでもいいので、肝心の指定方法だけ知りたいという方は、シートを変数に代入する方法までスキップしてください。

シートを明示すべき理由は思わぬ動作を防ぐため

実務では複数のExcelが開いている・複数のシートがある状態はザラだと思います。その状態で、単純にセルを指定すると、思った通りの動きをしない場合があります。

例えば、ExcelファイルAと ExcelファイルBを開いていて、それぞれのファイルに「使い方」シート・「データ」シートが有る場合を想定します。

この場合、指定が「A1セル」だけでは、

  • ファイルAの使い方シートのA1セル
  • ファイルAのデータシートのA1セル
  • ファイルBの使い方シートのA1セル
  • ファイルBのデータシートのA1セル

の4パターンの内、どれを指定しているのかわかりません。

「ファイルAの使い方シートのA1セル」の値を取得したかったのに、「ファイルBのデータシートのA1セル」の値を取得してしまったら、当然結果はおかしくなってしまいます。

そのため、複数のExcelファイル、シートがあったとしても、絶対に理想通りの動きをするように、どのExcelファイルのどのシートなのかを明示する必要があります。

シートを変数に代入するメリット

指定が簡単になり、コードが見やすくなる

Excelファイル・シートを指定する方法は変数を利用しなくても、下記のようにで指定できます。

Workbook(ブック名). Sheets(シート名)

または、ThisWorkbook.Sheets(シート名)

けれども、すべてのセル指定(RangeやCells)の前に上記文字を入力する必要があり、このままでは単純なコードを書く場合にも文字数がとても多くなってしまいます。

例えば、「A2セルとB2セルを乗算した結果をC2セルに入力する」といった単純な指示でも、下記のように長くなってしまいます。

ThisWorkbook.Sheets(“data”).Range(“C2”)
=ThisWorkbook.Sheets(“data”). Range(“A2”)* ThisWorkbook.Sheets(“data”). Range(“B2”)

そこで、事前にシートを変数に代入します。そうすることでコードが短く見やすくなります。

上記例文は、変数を利用すると下記のようになります。

wsA. Range(“C2”) = wsA. Range(“A2”) *wsA. Range(“B2”)

予測入力機能を利用できるようになる

コードを書くときに、途中まで入力して「Ctrl」+「スペース」キーを押すと、予測入力機能が働きます。

予測入力機能のイメージ画像

けれども、WorksheetsやSheetsを入力すると、その後予測入力機能が利用できなくなります。

シートを変数に代入しておけば、その後も予測入力機能が使えるので、入力ミスが減ります。

そのため、短いマクロでもさぼらずに変数に代入することをおすすめします。

シートを変数に代入する方法

Setで変数に代入する

シートを変数に代入する方法は以下の通りです。

    Dim 変数名 As Worksheet

    Set 変数名 = ThisWorkbook.Sheets(シート名)

(または、Set 変数名 = Workbook(ブック名).Sheets(シート名)

Worksheet はオブジェクト型な為、set を変数に前に付けて代入を行います。

オブジェクト型とは?

Long型やString型で宣言した変数にはデータが1個しか入りません。

けれども、オブジェクト型で宣言した場合は、関連する複数のデータを1つの変数に入れて扱います。

今回のWorksheet型の場合、シート名やインデックスなどシートに関連する様々なデータを1まとめとして扱っています。

詳しくは知りたい方は、「オブジェクト指向」で検索してください。

ただ、完璧に理解しようとするとある程度時間が必要なので、とりあえず初心者は複数のデータを1度に扱える変数なんだと理解していただければ十分です。

オブジェクト名で変数に代入する

既存のシートの場合、変数の宣言を行わなくても変数に代入することが出来ます。

VBE(コードを書くウィンドウ)のプロパティウィンドウのオブジェクト名を変更すると、その名前を変数として利用できます。

  • 手順1
    プロジェクトウィンドウで変数に代入したいシートをダブルクリックする
    シートオブジェクトの選択のイメージ画像

    プロジェクトウィンドウが表示されていない場合は、ツールバーの「表示」→「プロジェクトエクスプローラー」をクリックしてください。

  • 手順2
    プロパティウィンドウに詳細が表示されるので、オブジェクト名を変更する
    オブジェクト名の変更の説明画像

    プロパティウィンドウが表示されていない場合は、ツールバーの「表示」→「プロパティウィンドウ」をクリックしてください。

以上! ね、簡単でしょう?

メリット・デメリットご確認の上、変数の宣言で指定するのか、オブジェクト名で指定するのかをご選択ください。

オブジェクト名で指定するメリット
  • シート名を変更しても問題なく動く
オブジェクト名で指定するデメリット
  • Set で変数に代入する方法しか知らない人には、何のシートが代入されているのか分からない
  • プログラム実行中に追加されたシートを変数に代入できない
  • 複数のファイルに同じオブジェト名があった場合にうまく動かない

新規追加したシートを変数に代入する

シートをプログラム実行中に途中で追加する場合がありますよね。その場合には以下の方法で、変数を代入することをおすすめします。

    Dim 変数 As Worksheet

    Set 変数 = ThisWorkbook.Sheets.Add

必ず、シートを追加したらすぐに代入しましょう。

ActiveSheetで新規追加したシートを特定する方法もありますが、それよりも上記のように最初から変数に入れてしまう方が確実です。

まとめ:シートを明示する癖を付けよう

1行ずつ実行しながら動作確認していた時には問題なく動いていたのに、いざ実行するとおかしな結果になる……というときには、シートの指定を忘れていることが多いです。

シートの明示を忘れていた。たったそれだけでも原因箇所の特定に時間がかかります。どんなに短いコードを書く場合でも、シートを明示することを癖にしましょう。

コメント

タイトルとURLをコピーしました