- 締切済み
VBAのCopyコマンドについて
エクセルVBAでシート3のRangeの値をからシート2のRangeへデータをコピーしようとしているのですが Sheets(3).Range("B3:B100").Copy _ Sheets(2).Range(Cells(3, col2 - 1), Cells(100, col2 - 1)) がうまくいって、 Sheets(3).Range(Cells(2, col1), Cells(100, col1)).Copy _ sheets(2).Range(Cells(2, col2), Cells(100, col2)) が何故、オブジェクト定義エラーになってしまうのがわかりません。 col1、col2は列の変数です。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- bkbkb
- ベストアンサー率33% (97/289)
Sheets(3).Range("B3:B100").Copy _ Sheets(2).Range(Cells(3, col2 - 1), Cells(100, col2 - 1)) これは、まず Sheets(3).Range("B3:B100").Copy はOKですね。直接指定なので。 Sheets(2).Range(Cells(3, col2 - 1), Cells(100, col2 - 1)) これがOKなのは多分偶然です。 多分たまたまSheet(2)を開いてVBAを実行してませんか? Cellsと指定せずに書くと、今アクティブなシートのCellsを使います。 なので、逆に言うとSheet(3)を開いた状態で実行するとエラーになりますよ。 更に補足すれば 下の文では Sheets(3).Range(Cells(2, col1), Cells(100, col1)).Copy ですが、Sheet(2)を開いた状態で実行すると Sheets(3).Range(Sheets(2).Cells(2, col1), Sheets(2).Cells(100, col1)).Copy という意味になっちゃうので、 "シート3"の中の、"シート2"の2,col1から100,col1まで っていう矛盾した文になるのでエラーになるんです。 こういうエラーが起きにくくするために、多少複雑なVBAの時のCellsやRangeなどは全てシートを指定してあげた方が問題が起きなくて良いですよ。
- n-jun
- ベストアンサー率33% (959/2873)
>Sheets(3).Range("B3:B100").Copy _ >Sheets(2).Range(Cells(3, col2 - 1), Cells(100, col2 - 1)) を実行している時シート(2)がアクティブなっているでしょう。 もしシート(2)以外をアクティブな状態にして実行すれば、同様のエラーが発生します。 即ち、 Cells(3, col2 - 1) などが常にアクティブなシートに対して有効な状態ですから、 >Sheets(3).Range(Cells(2, col1), Cells(100, col1)).Copy _ がさすのは、シート(3)のRangeに対してアクティブなシート(たぶんシート2) のCellsになるからでは? Sheets(3).Cells(2, col1).Resize(99).Copy _ Sheets(2).Cells(2, col2) 行数が決まっているのなら上記でもいいかも?
- bkbkb
- ベストアンサー率33% (97/289)
実証してませんが Sheets(3).Range(Cells(2, col1), Cells(100, col1)).Copy _ sheets(2).Range(Cells(2, col2), Cells(100, col2)) この中のCellsがどのシートのCellsか指定していないからではないでしょうか? Sheets(3).Range(Sheets(3).Cells(2, col1), Sheets(3).Cells(100, col1)).Copy _ sheets(2).Range(sheets(2).Cells(2, col2), sheets(2).Cells(100, col2)) で、どうでしょうか?
補足
ありがとうございます。うまくいきました。 エクセルVBAでいつもこのような定義のところで詰まってしまいます。 追加で質問させて頂きたいのですが、質問文の上の式 Sheets(2).Range(Cells(3, col2 - 1), Cells(100, col2 - 1))では何故どのシートか指定しなくて通ったのでしょうか? よろしくお願いします。
補足
回答ありがとうございます。 Sheets(2).Range(Cells(3, col2 - 1), Cells(100, col2 - 1)) を実行しているときはSheets(3)をアクティブにしています。 また、Copyの引数部分はシートを指定しなくても通りました。 ですので、どういうときはシートの指定が必要というのがわからなくなってしまいました。(Rangeで変数を使用する場合?でも引数内ではい必要ない?) 度々すいませんが教えて頂ければと思います。 一応、全ての処理分を下に乗せました。 col1 = 3 col2 = 2 For col1 = 3 To 14 Sheets(3).Activate Sheets(3).Range("A2:X100").Sort Key1:=Sheets(3).Cells(2, col1),Order1:=xlDescending, Header:=xlYes, OrderCustom:=1,MatchCase:=False, Orientation:=xlTopToBottom, SortMethod:=xlPinYin,DataOption1:=xlSortNormal Sheets(3).Range("B3:B100").Copy Sheets(2).Range(Cells(3, col2 - 1), Cells(100, col2 - 1)) Sheets(3).Range(Sheets(2).Cells(2, col1), Sheets(2).Cells(100, col1)).Copy Sheets(2).Range(Sheets(2).Cells(2, col2), Sheets(2).Cells(100, col2)) col2 = col2 + 2 Next col1