• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エラーになる理由とならない理由は?)

エラーになる理由とならない理由は?

このQ&Aのポイント
  • 同じアプリケーション内に複数のExcelファイルを開いている場合、別のファイル内のオブジェクトを操作する際にエラーが発生することがあります。
  • エラーの原因は、オブジェクトがアクティブではない状態で操作しようとしたためです。
  • Sheets関数を使うことで、明示的に操作するシートを指定することができるため、エラーが発生しなくなります。

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

>アクティブエックスのコマンドボタンを設置して このとき、マクロは「シートモジュール」に記載されます。 シートモジュールとは、VBE画面でプロジェクトエクスプローラからブックのプロジェクトを展開した時に、「Sheet1」などをWクリックして開いた「シート自身に取り付いているマクロモジュール」のことです。 ちなみに一方、一般のマクロは「標準モジュール」に記載します。 標準モジュールは、ブックに対してVBE画面で挿入メニューから標準モジュールを挿入したモジュールです。ブックに格納されていて、個別のシートと直接結びつきがありません。 以上の2種類のモジュールシートがある(ちなみにもう一つ、クラスモジュールというのもありますが今は関係ない)事を理解したうえで、ご質問についてです。 標準モジュールで range("A1") をただ呼び出すと、それは「アクティブシートの」A1セルが暗黙で宣言されます。 一方シートモジュールで range("A1") をただ呼ぶと、それは「シートモジュールが取り付いているシートの」A1セルが暗黙で宣言されます。 従って標準モジュールで sub macro1() range("A1") = 123 end sub と記入すれば、このマクロはいつでもアクティブシートのA1セルをタッチします でもご相談のようにシートモジュールに記載された private sub CommandButton1_Click() worksheets("Sheet2").select range("A1") = 234 end sub はアクティブシートとは無関係に、常に「自分シートのA1セル」を参照します。 シートモジュールから他のシートのセルを触るには、常に明示的に ワークシートオブジェクト.range("A1") あるいは今回ご相談のように 目的のブックオブジェクト.目的のシートオブジェクト.range("セル番地") のように、イチイチ指定してやる必要があるということです。

BTMNXIN
質問者

お礼

コマンドボタンからマクロを実行すると、シートモジュールから起動することになり、 表示されてないだけで常に「コマンドボタンが設置してあるシートの」となってしまうのですね。 ありがとうございました。大変参考になりました。