アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (5件)

Sub testcopy3()



Worksheets("Sheet1").Range(Cells(3, 2), Cells(10, 3)).Copy Worksheets("Sheet2").Cells(5, 5)

End Sub


不必要ならいちいちSelectしないほうがよいですよ。
    • good
    • 0

>以下のマクロを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
    • good
    • 0

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
    • good
    • 0

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
    • good
    • 0

>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
'-----------

今回の件は重要事柄ですので覚えておきましょう。
以上です。
 
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/07/10 19:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています