• ベストアンサー

VBA cut&pasteが出来ない

セルのカット&ペーストをしようとしてますが、エラーになります。 activecell.offset(1,5).range("A1:H1").cut destination:=activecell.offset(4,2).range("A1") うろ覚えですが「○○定義エラー」。デバックモードでカーソルを当てて見ると、後半のoffsetの部分でエラーになってるようです。なぜでしょう?末尾のrange(A1)は自動マクロで作成し加工して作った際の残りです。

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

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

over_the_galaxy
質問者

お礼

ありがとうございます。 ・Resizeの使用 ・destinationは不要 ということですね。次回これで試してみます。 質問の後で、結局とった対策は、 activecell.offset(1,5).range("A1:F1").select selection.cut destination:=activecell.offset(省略) 一旦セレクトしておいて、次にカット&ペーストするとなぜか動きました。

その他の回答 (3)

回答No.4

#2の回答者です。 >destination:=の有無になりますが、無くても出来るのですね。 なぜ、省いたかというと、画面上で、右に長くなりすぎるので、桁折したのですが、その時に、Destination:= が入っていると、今回の場合、エラーになることがあるからです。 >カットアンドペースト以外の方法はあるのでしょうか?配列に読み込んでから移動先セルに書き込むのですか? VBAのコーディングで、普通は、必要な箇所をコピーして、張り付けした後に、不要な部分を削除するという方法を取ります。もちろん、配列という方法があることにはあるのですが、それは、私としては、やむを得ない場合に限ります。ここでは、配列による、Value(または、Text)値だけのコピーというのをあえてする必要性はないと思います。 なお、#2のコードで、飛び飛びにする場合は、For i= 1 To 最終数 Step 2  となどに書き加えます。

over_the_galaxy
質問者

お礼

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

回答No.2

こんにちは。 ご質問のマクロは、記録マクロからですね。 それも、「相対参照」になっていますから、意図的でなければ、設定を、「絶対参照」にして記録してください。それと、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 '// これを、標準モジュールに書くようにします。

over_the_galaxy
質問者

お礼

ありがとうございます。 同じ処理を大量に繰り返すため(10回×100回×200回)、相対参照で記録しました。回答頂いたソースコードではiを使って基準点を移動しますが、自動マクロで作った時は1個のプロシージャの最終行で基準点移動し、このプロシージャを繰り返すようにしてます。 回答のソースコードと質問文の最大の違いはdestination:=の有無になりますが、無くても出来るのですね。私自身、カットアンドペーストをマクロで作るのは初めてで、最初は自動マクロで作り、動作時間短縮のためネットで検索して変更しました。 カットアンドペースト以外の方法はあるのでしょうか?配列に読み込んでから移動先セルに書き込むのですか?

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! 両辺とも「主語」がダブっていて、どういったコトをしたいのか見えてこないのですが・・・ (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

over_the_galaxy
質問者

お礼

ありがとうございます。 アクティブセルの下1右5のセルを含めた8セルをカットし、アクティブセルの下4右2のセルでペーストさせます。回答頂いた中では(1)に近いです。ただ、移動するセルは複数(8個)です。 当初自動マクロで作りましたが、修正したら動かなくなったというのが背景です。 ActiveCell.Offset(1, 5).Range("A1:H1").select selection.cut activecell.offset(3,-3).Range("A1").Paste

関連するQ&A