プロが教えるわが家の防犯対策術!

セルのカット&ペーストをしようとしてますが、エラーになります。
activecell.offset(1,5).range("A1:H1").cut destination:=activecell.offset(4,2).range("A1")

うろ覚えですが「○○定義エラー」。デバックモードでカーソルを当てて見ると、後半のoffsetの部分でエラーになってるようです。なぜでしょう?末尾のrange(A1)は自動マクロで作成し加工して作った際の残りです。

A 回答 (4件)

こんにちは!


両辺とも「主語」がダブっていて、どういったコトをしたいのか見えてこないのですが・・・

(1)選択セルから1行下・5列右側セルを選択セルの4行下・2列右側セルにカット&ペーストしたい場合
With ActiveCell
.Offset(1, 5).Cut .Offset(4, 2)
End With

(2)A1~H1セルを選択セルから4行下・2列右側セルにカット&ペーストしたい場合
Range("A1:H1").Cut ActiveCell.Offset(4, 2)

(3)A1~H1セルをA1セルの4行下・2列右側セルにカット&ペーストしたい場合
Range("A1:H1").Cut Range("A1").Offset(4, 2)

といった感じになりますが、
いずれにしても左辺の「主語」は
ActiveCell.Offset(1, 5) なのか Range("A1:H1") なのか?
右辺の「主語」は
ActiveCell.Offset(4, 2) なのか Range ("A1") なのか?
ひとつに決めてやらないとエラーとなります。m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます。
アクティブセルの下1右5のセルを含めた8セルをカットし、アクティブセルの下4右2のセルでペーストさせます。回答頂いた中では(1)に近いです。ただ、移動するセルは複数(8個)です。

当初自動マクロで作りましたが、修正したら動かなくなったというのが背景です。
ActiveCell.Offset(1, 5).Range("A1:H1").select
selection.cut
activecell.offset(3,-3).Range("A1").Paste

お礼日時:2014/03/08 13:33

こんにちは。



ご質問のマクロは、記録マクロからですね。
それも、「相対参照」になっていますから、意図的でなければ、設定を、「絶対参照」にして記録してください。それと、Cut & Paste マクロは、Excelのバージョンによっては、理由なくエラーが出ることがあります。ですから、長年、VBAを書いている人は、Cut & Pasteのコードは滅多に書きません。

ただ、
>うろ覚えですが「○○定義エラー」
質問では、うろ覚えではなく、正確なエラーの内容を書いてください。再現性があるのかないのかの判定もします。再現性のない場合は、ご自身の、Excelのワークシートの環境的な問題だと思ってください。

今回の質問は、Excelのバージョンなど示されていませんので、今のところ再現性は確認できません。

ActiveCell.Offset(1,5).Range("A1:H1")
という表記の仕方は、見慣れない方もいるようですが、これは記録マクロの相対参照モードにしか登場しないコードです。

これは、問題ないといえば問題ないのですが、貼り付け先が実際にはないところにもマクロを実行しようとしてしまいます。その場合は、エラーはあるはずです。

後は、ちゃんとVBAを段階的に学習つもりがあるのでしたら、別の回答にもなりますが、手っ取り早く解決したいのでしたら、記録マクロを質問で公開するよりも、どのようにしたいのか、きちんと言葉で説明されたほうがよいと思います。ここの回答者さんが、あらためてコードを書いてくれるはずです。

例えば、アクティブセルが、A1にあるとして、10行続けようとすれば、このようにはなりますが、ここでも、どこを基点にするかというものが、重要になってきます。

'//
Sub Test1()
Dim i As Long
For i = 1 To 10
Cells(i, 1).Select '←ここが基点(最初はA1)
ActiveCell.Offset(1, 5).Range("A1:H1").Cut _
 ActiveCell.Offset(4, 2).Range("A1")
Next i
End Sub

'//
これを、標準モジュールに書くようにします。
    • good
    • 0
この回答へのお礼

ありがとうございます。
同じ処理を大量に繰り返すため(10回×100回×200回)、相対参照で記録しました。回答頂いたソースコードではiを使って基準点を移動しますが、自動マクロで作った時は1個のプロシージャの最終行で基準点移動し、このプロシージャを繰り返すようにしてます。

回答のソースコードと質問文の最大の違いはdestination:=の有無になりますが、無くても出来るのですね。私自身、カットアンドペーストをマクロで作るのは初めてで、最初は自動マクロで作り、動作時間短縮のためネットで検索して変更しました。

カットアンドペースト以外の方法はあるのでしょうか?配列に読み込んでから移動先セルに書き込むのですか?

お礼日時:2014/03/08 14:21

No.1です。



>アクティブセルの下1右5のセルを含めた8セルをカットし、
>アクティブセルの下4右2のセルでペーストさせます。
>回答頂いた中では(1)に近いです。ただ、移動するセルは複数(8個)です

というコトですので、
8個とは列方向に向かって8個
仮にActiveセルがA1だと Offset(1, 5) はF2セルになりますので、
F2~M2セルデータを Offset(4, 2) → C5セルにコピー&ペーストです。

Sub Sample1()
With ActiveCell
.Offset(1, 5).Resize(, 8).Cut .Offset(4, 2)
End With
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます。
・Resizeの使用
・destinationは不要
ということですね。次回これで試してみます。

質問の後で、結局とった対策は、
activecell.offset(1,5).range("A1:F1").select
selection.cut destination:=activecell.offset(省略)
一旦セレクトしておいて、次にカット&ペーストするとなぜか動きました。

お礼日時:2014/03/08 14:38

#2の回答者です。


>destination:=の有無になりますが、無くても出来るのですね。
なぜ、省いたかというと、画面上で、右に長くなりすぎるので、桁折したのですが、その時に、Destination:= が入っていると、今回の場合、エラーになることがあるからです。

>カットアンドペースト以外の方法はあるのでしょうか?配列に読み込んでから移動先セルに書き込むのですか?

VBAのコーディングで、普通は、必要な箇所をコピーして、張り付けした後に、不要な部分を削除するという方法を取ります。もちろん、配列という方法があることにはあるのですが、それは、私としては、やむを得ない場合に限ります。ここでは、配列による、Value(または、Text)値だけのコピーというのをあえてする必要性はないと思います。

なお、#2のコードで、飛び飛びにする場合は、For i= 1 To 最終数 Step 2 
となどに書き加えます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
コピー&ペーストした後削除、なるほどエラー対策ならばやった方がいいですね。

お礼日時:2014/03/09 09:12

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