• ベストアンサー

excelのマクロでrangeの選択がうまくいきません。

excelのマクロでrangeの選択がうまくいきません。 以下のマクロをsheet2に書きました。testcopyは動きますが、testcopy2は動きません。なぜなのでしょうか。どうすればいいのでしょうか。それ以外のマクロの部分との関係から、cellsを使い、数字を使ってrangeの処理をしたいのです。よろしくお願いします。 Sub testcopy() Worksheets("sheet1").Range("B3:C10").Copy Worksheets("sheet2").Range("e5").Select ActiveSheet.Paste End Sub Sub testcopy2() Worksheets("sheet1").Range(Cells(3, 2), Cells(10, 3)).Copy Worksheets("sheet2").Range("e5").Select ActiveSheet.Paste End Sub

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.5

>testcopyは動きますが、testcopy2は動きません testcopyは「動作したり、しなかったりする」が正しい表現です。   要するに今回testcopyが動いたのは▼たまたま▼ということです。 testcopy2 は当然ながらエラーになります。 何れにしろ、両方ともに問題があるということです。 その問題点は2つあります。 (1)アクティブでないシートのセルはSelect(Activate)できない (2)複数のシートを扱うときのセルの参照は    そのセルがどのシートのセルなのか明示する必要がある これを踏まえて、、、、 --------------- ●testcopy● これが動作するのは Sheet【2】がアクティブな状態で実行する場合です Sheet【1】がアクティブな状態で実行すると   Worksheets("sheet2").Range("e5").Select ここで、問題点(1)の理由によりエラー。 で、先ずシートを選択、次にセルを選択と2段階にしないといけません。   Worksheets("sheet2").Select   ActiveSheet.Range("E5").Select ---------------- ●testcopy2● ▼Sheet【1】がアクティブな状態で実行   testcopyと同じ場所、同じ理由でエラー ▼Sheet【2】がアクティブな状態で実行   Worksheets("sheet1").Range(Cells(3, 2), Cells(10, 3)).Copy   ここで、問題点(2)により、エラー。    Cellsの前にシートオブジェクトがないので  Cells(3, 2), Cells(10, 3)はアクティブなSheet【2】のセルとみなされ  (★実際はちょと違う場合もありますが今回はそう★)  Worksheets("sheet1").Range(  ← Sheet【1】  Cells(3, 2), Cells(10, 3))   ← Sheet【2】 このようにSheet【1】【2】が混在していることになり、エラー で、Cellsの前にシートを付加してセルがどのシートのセルか明示してやる Worksheets("sheet1").Range(Worksheets("sheet1").Cells(3, 2), Worksheets("sheet1").Cells(10, 3)).Copy    --------------------------------- で、質問者のコードを修正すると '------------- Sub testcopy()  Worksheets("sheet1").Range("B3:C10").Copy  With Worksheets("sheet2")    .Select    .Range("E5").Select    .Paste  End With End Sub '------------- Sub testcopy2()  With Worksheets("sheet1")    .Range(.Cells(3, 2), .Cells(10, 3)).Copy  End With  With Worksheets("sheet2")    .Select    .Range("E5").Select    .Paste  End With End Sub '-------------- ●ただ今回のような単純なコピーの場合は  既出の回答にあるようにSelectなしで書くのがふうつです。 '----------- Sub testcopy111()  Worksheets("sheet1")    .Range("B3:C10").Copy Worksheets("sheet2").Range("E5")  End With End Sub '----------- Sub testcopy222()  Worksheets("sheet1")   .Range(.Cells(3, 2), .Cells(10, 3)).Copy Worksheets("sheet2").Range("E5")  End With End Sub '----------- 今回の件は重要事柄ですので覚えておきましょう。 以上です。  

qso
質問者

お礼

たくさんの方々からの回答、本当にありがとうございます。 selectは使用しなくて済めば、使用しない方がいいこと、activeでないと、selectできないこと、たとえrangeの中でも、cellsは丁寧に指定しないといけないこと、など多くの基本的なことを学びました。

その他の回答 (4)

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.4

ActiveでないSheetのオブジェクトはSelectできません。質問の場合他の回答者さんのいうようにSelectは必要ないのですが、どうしてもSelectしたければ、Worksheets("Sheet2").Activateなどとしますが、速度が遅くなるだけです。 Sub testcopy3() With Worksheets("Sheet1") .Range(.Cells(3, 2), .Cells(10, 3)).Copy End With Worksheets("Sheet2").Cells(5, 5).PasteSpecial End Sub

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.3

Cellsもシート名で修飾する必要があります。 With Worksheets("sheet1") .Range(.Cells(3, 2), .Cells(10, 3)).Copy End With soixanteさんが言われるようにSelectする必要はありません。 With Worksheets("sheet1") .Range(.Cells(3, 2), .Cells(10, 3)).Copy Destination:=Worksheets("sheet2").Range("e5") End With

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

>以下のマクロをsheet2に書きました。testcopyは動きますが、testcopy2は動きません。なぜなのでしょうか。 初級ですが、良く間違いをすることです。 まず、マクロコードは、イベントドリブン型など以外は、標準モジュールに書きましょう。 testcopy2の 動かない理由は、 Sub testcopy2()   Worksheets("sheet1").Range(Cells(3, 2), Cells(10, 3)).Copy   Worksheets("sheet2").Range("e5").Select   ActiveSheet.Paste End Sub    >.Range(Cells(3, 2), Cells(10, 3)) Sheet2 のモジュールに置いたとします。 Worksheets("sheet1").Range(------) は、確かに、Sheet1 ですが、中身のセル・プロパティの Cells(3, 2)  Cells(10, 3) の親オブジェクトは、Sheet2 だからです。中で、不整合が起きてしまっています。この問題は、おそらく、Excel VBAをMicrosoftで開発する時に、開発段階で、ミスしたのだと思っています。Range でくくれば、そのプロパティは、Range の親オブジェクトを引き継ぐのは当たり前なのに、その引き継ぐ設定をし忘れたように思います。それと、Range プロパティとCells プロパティは、開発では別々に考えられたものだったに違いありません。 書き方としては、以下のようにします。 Sub Test1() With Worksheets("Sheet1")  .Range(.Cells(3, 2), .Cells(10, 3)).Copy Worksheets("Sheet2").Range("E5") End With End Sub Sub Test2()  Worksheets("Sheet1").Range("B3").Resize(8, 2).Copy Worksheets("Sheet2").Range("E5") End Sub

  • soixante
  • ベストアンサー率32% (401/1245)
回答No.1

Sub testcopy3() Worksheets("Sheet1").Range(Cells(3, 2), Cells(10, 3)).Copy Worksheets("Sheet2").Cells(5, 5) End Sub 不必要ならいちいちSelectしないほうがよいですよ。

関連するQ&A