プロが教える店舗&オフィスのセキュリティ対策術

エクセル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は列の変数です。
よろしくお願いします。

A 回答 (3件)

実証してませんが



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))では何故どのシートか指定しなくて通ったのでしょうか?
よろしくお願いします。

補足日時:2009/03/04 11:59
    • good
    • 0

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

行数が決まっているのなら上記でもいいかも?

この回答への補足

回答ありがとうございます。
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

補足日時:2009/03/04 14:03
    • good
    • 0

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などは全てシートを指定してあげた方が問題が起きなくて良いですよ。
    • good
    • 0

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