
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
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
'-----------
今回の件は重要事柄ですので覚えておきましょう。
以上です。
たくさんの方々からの回答、本当にありがとうございます。
selectは使用しなくて済めば、使用しない方がいいこと、activeでないと、selectできないこと、たとえrangeの中でも、cellsは丁寧に指定しないといけないこと、など多くの基本的なことを学びました。
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
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
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
No.1
- 回答日時:
Sub testcopy3()
Worksheets("Sheet1").Range(Cells(3, 2), Cells(10, 3)).Copy Worksheets("Sheet2").Cells(5, 5)
End Sub
不必要ならいちいちSelectしないほうがよいですよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) 他のシートからコピーする下記マクロで貼付け位置をWorksheets(1).Range("A3")の 8 2023/01/30 18:48
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) ExcelVBAの転記について 1 2022/03/23 20:13
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- Visual Basic(VBA) Sheet1をフィルターで「りんご」を抽出し、Sheet2へ地域を貼り付ける下記マクロを変更して S 2 2022/12/11 03:01
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
【Excel VBA】エラー番号400
Excel(エクセル)
-
EXCELマクロで☓400とでます
Excel(エクセル)
-
-
4
VBAで、セル(Range)のオブジェクトが取得できない
Excel(エクセル)
-
5
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
6
括弧があるとHYPERLINKで飛べない?
Excel(エクセル)
-
7
特定のPCだけ動作しないVBAマクロがあります。その理由は?
Visual Basic(VBA)
-
8
VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます
Visual Basic(VBA)
-
9
別ファイルを開かず、INDIRECT関数を使用せずに、別ファイルのデータを求めたい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA For Each Next構文...
-
Copyコマンドについて
-
エクセルで赤い字のセルを抽出
-
EXCELのマクロで一覧表に...
-
EXCELで2つの数値のうち大きい...
-
エクセルで二つの数字の小さい...
-
Excelで隣のセルと同じ内容に列...
-
PowerPointで表の1つの列だけ...
-
EXCELで 一桁の数値を二桁に
-
エクセルでオートフィルタのボ...
-
エクセル 同じ値を探して隣の...
-
Excel 文字列を結合するときに...
-
お店に入るために行列に並んで...
-
エクセル(勝手に太字になる)
-
Excelで中央揃えが出来ない?
-
「B列が日曜の場合」C列に/...
-
ある一定時間を超えた場合の超...
-
エクセルのオートフィルタで最...
-
2つのエクセルのデータを同じよ...
-
エクセルで文字が混じった数字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルの表示形式を保ったま...
-
excelのマクロでrangeの選択が...
-
エクセル 1つのセル毎に入力...
-
Excel VBA For Each Next構文...
-
Excel2000 VBA ダブルクリック...
-
Excel VBAのComboboxのRemoveItem
-
EXCEL 行内のデータを2行に分け...
-
#N/A表示を空白にしたいのです...
-
Copyコマンドについて
-
【Excel関数】商品コードと商品...
-
ISERROR関数
-
EXCELで2つの数値のうち大きい...
-
エクセルで二つの数字の小さい...
-
Excelで隣のセルと同じ内容に列...
-
PowerPointで表の1つの列だけ...
-
エクセルで、2種類のデータを...
-
エクセルでオートフィルタのボ...
-
エクセルで特定の文字が入って...
-
エクセルのオートフィルタで最...
-
EXCELで 一桁の数値を二桁に
おすすめ情報