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

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

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

同じアプリケーション内にBook1.xlsとBook2.xlsを開き、 Book1.xlsのSheet1に アクティブエックスのコマンドボタンを設置して、 Private Sub CommandButton1_Click() Range("a1").Select End Sub としました。 このコードは問題なく実行できますが、 Book1.xlsのコマンドボタンから、 「Book2.xlsのSheet1を選択する」というコードをしたい時に、 Private Sub CommandButton1_Click() Windows("Book2.xls").Activate Range("a1").Select End Sub をすると、 「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。」 になります。 しかしなぜかRangeの前にSheets("Sheet1")を入れて Private Sub CommandButton1_Click() Windows("Book2.xls").Activate Sheets("Sheet1").Range("a1").Select End Sub にすると、問題なく実行できます。 Book1.xlsにもBook2.xlsにも「Sheet1」と言う名のシートはあります。 なぜ、Sheets("Sheet1").を入れるとエラーにならないのか教えてください。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答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
質問者

お礼

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

関連するQ&A

  • コマンドボタンが実行されません…

    簡単な命令文だと思うんですが、Rangeクラスのselectメゾットが失敗ってエラーが出ます。どうしてなんでしょう?よろしくお願いします。 Private Sub CommandButton1_Click() Sheets("1").Select Range("A1").Select Selection.Copy Sheets("2").Select End Sub

  • VBで、教えて下さい。

    現在、VBを使っていろいろと作成しておりまして・・・。 Private Sub CommandButton1_Click() Worksheets("Sheet1").Activate ActiveSheet.Range("A1").Select End Sub で、シートの移動は出来るのですが、 ”他のファイル(BOOK)”へ移動するには、どのように、書けば良いか教えて頂けないでしょうか? 仕事で、今日中に仕上げろと指示が御座いまして、困っております。

  • チェックボックスを使用したい

    コマンドボタンに、「ボタンを押すことによって、シート3のA8に飛ぶ」というマクロを 以前教えていただいて実行してみたのですが、下記のようにしてみると、 1行目でコンパイルエラー、End sub が必要です。と出てしまうのですが どこが、いけないのでしょうか? Private Sub CommandButton1_Click() ←ココでエラーがでます。 Public Sub jumpSheet3A8() Sheets("Sheet3").Select Range("A8").Select End Sub End Sub 素人ゆえの質問ですが、教えてください。

  • Book間の移動

    Excel VBA でBook2にシートを移動した後、元のBook1に自動で戻る VBAを教えたください。 Sub シートを移動する() Windows("Book1.xls").Activate Sheets(エリカ).Select Sheets(エリカ).Move After:=Workbooks("Book2").Sheets(1) このあとBook1に戻りたい! End Sub

  • ExcelVBA:ワークシートに付けたコマンドボタンから、セル全体をコピーするコード

    ExcelVBAでワークシートに付けたコマンドボタンを押すと、ワークシートを指定し、コピーするプログラムを作りたいのですが、「実行時エラー'1004':RangeクラスのSelectメソッドが失敗しました。」というようなエラーが出て動きません。 プログラムは以下の通りです。 Private Sub CommandButton1_Click() Sheets("Sheet1").Select Cells.Select Selection.Copy End Sub どのようにすればよいでしょうか? 回答よろしくお願いします。

  • エクセルのマクロについて

    エクセル97でマクロを組んで下記作業を行いたいと考えていますが(実際にやりたい事から抜粋した内容です)、不具合が起こっています。 ~やりたい事~ コマンドボタンを押すとあるシートのセルをコピーして、違うシートに貼り付ける。 ~不具合内容~ (1)普通にマクロを実行すると問題ないが、(2)コマンドボタンを使用するとエラーが起こる。 エラー内容は、 「実行時エラー'1004' RangeクラスのSelectメソッドが失敗しました。」 と言う内容です。 ~(1)のVB表記~ Sub Macro1() Sheets("sheet1").Select Range("A1").Select Selection.Copy Sheets("sheet2").Select Range("A1").Select ActiveSheet.Paste End Sub ~(2)のVB表記~ Private Sub CommandButton1_Click() Sheets("sheet1").Select Range("A1").Select (←ここでエラーが発生します) Selection.Copy  Sheets("sheet2").Select Range("A1").Select ActiveSheet.Paste End Sub ~質問事項~ 1)(2)の表記の何が原因でエラーが起こっているのでしょうか? 2)エラーが起きない為にはどのようにしたら良いでしょうか?

  • VBA Pasteで教えて下さい!

    Book1で指定したセル範囲(C2:C41)を Book2のSheet1の(AB4:AB43)とSheet2の(AU10:AU49)にペーストを行うに あたり、ボタン押下にて実行する下記コードをBook1に作成しましたが、 2番目のPasteで実行時エラー1004「アプリケーション定義または オブジェクト定義のエラーです」と出ます。 複数Sheetの別々のセルにペーストする方法を 教えていただけないでしょうか? Book1とBook2は共に開いた状態です。 Book2のシートは、それぞれVBAで保護をかけていますが、 .protect UserInterfaceOnly:=Trueで変更可能な状態に しています。 Private Sub copy_Click()  Range("C2:C41").Copy  Windows("Book2").Activate  Sheets("Sheet1").Range("AB4:AB43").PasteSpecial Paste:=xlPasteValues  Sheets("Sheet2").Range("AU10:AU49").PasteSpecial Paste:=xlPasteValues  (↑ここでエラーが出ます) End sub

  • コマンドボタンを押したときシート2のa行の空白セルを選択したいのですが

    コマンドボタンを押したときシート2のa行の空白セルを選択したいのですが以下のやり方では”RangeクラスのSelectメソッドが失敗しました。”のエラーが出てしまいます。どこがいけないのか教えてください。 Private Sub CommandButton1_Click() Worksheets("sheet2").Activate Range("a65536").End(xlUp).Offset(1).Select End Sub ちなみに、コマンドボタンはシート1にあります。 よろしくお願いします。

  • 同じブックに存在するシ-ト(X)の指定セル(A1:C10)を別のシート

    同じブックに存在するシ-ト(X)の指定セル(A1:C10)を別のシート(Z)のA2セルへコピーしたいのですが、マクロの記録で入手したコードをコマンドボタンで実行するとエラーになってしまい、先へ進めません。 Private Sub CommandButton1_Click() Sheets("X").Select Range("A1:C10").Select ← この部分が黄色! Selection.Copy Sheets("Z").Select Range("A2").Select ActiveSheet.Paste End Sub 正しく動作させる方法を教えて下さい。 よろしくお願いします。

  • マクロを教えてください

    同じフォルダ内にあるXlsブックのあるSheetのデータを他のBookにコピーして貼り付けて貼り付けた側のBookで加工したいのですがうまくマクロが組めません。 Bookを共有で使っているので困っています。 Sub ワードアート1_Click ' ActiveWindow.ScrollWorkbookTabs sition:=xlLast Workbooks.Open ("販売管理表み.xls") Sheets("在庫一覧").Select Cells.Select Range("A1").Activate Selection.Copy Windows("完成在庫.xls").Activate Sheets("完成在庫一覧").Select Range("A1").Select ActiveSheet.Paste End Sub って書いてみましたが、Workbooks…のところでエラーになってしまいました。(TOT)初心者ですみません。教えてください。

専門家に質問してみよう