• ベストアンサー

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

  • VBA セル内改行+他セルの文字をカット&ペースト

    A1セル内文字の最後部分にカーソルを持っていって、Alt+Enterを押してA1セルを2行に改行する、 B1にある値をカットして、A1の改行した部分に貼り付け というマクロを作るべく、「マクロの記録」をしてみたところ、A1のテキストがそのままマクロに書き込まれてしまって応用ができないです。 改行部分に貼り付けするにはB1セルの値はコピーではなくカットが必要だと思いますが、これも「マクロの記録」だと動作ではなくテキストそのものが書き込まれてしまい、応用が効きません。 Sub A1改行カットペースト() ' ' A1改行カットペースト Macro ' ' ActiveCell.FormulaR1C1 = "RO20-001" & Chr(10) & "" Range("B1").Select ActiveCell.FormulaR1C1 = "" Range("A1").Select ActiveCell.FormulaR1C1 = "RO20-001" & Chr(10) & "8/7到着" Range("F4").Select End Sub "RO20-001"と"8/7到着"はA1とB1の値であって、この記述ではこのマクロをループさせた時、他の全部のセルに"RO20-001"と"8/7到着"が貼りついてしまいます。 改行やテキストのカット&ペーストの「動作」はどのように記述すれば良いのでしょうか? どなたかご存じの方がいらっしゃいましたら、教えて下さい。 よろしくお願いします。

  • ExcelのVBAのAutoFillの使い方について

    Excel97のマクロでAutoFillを使おうとしているのですが、エラーが出て実行できません。 何も表示されていないシートでコマンドボタンを押すと、AutoFillを使ってA1セル~E1セルとA2セル~E2セルに数字の1~5が表示されるようにしたいと考えています。 下記のようにマクロを書いたところ、A1~E5はうまくできたのですが、 「Selection.AutoFill Destination:=ActiveCell.Range("A2:E2"), Type:=xlFillSeries」 の行でエラーが発生します。 「実行時エラー:1004 RangeクラスのAutoFillメソッドが失敗しました。」と表示されます。 Private Sub CommandButton1_Click()   ActiveSheet.Range("A1").Select   ActiveCell.FormulaR1C1 = "1"   Selection.AutoFill Destination:=ActiveCell.Range("A1:E1"), Type:=xlFillSeries   ActiveSheet.Range("A2").Select   ActiveCell.FormulaR1C1 = "1"   Selection.AutoFill Destination:=ActiveCell.Range("A2:E2"), Type:=xlFillSeries End Sub どなたかエラーの原因を教えていただけないでしょうか? よろしくお願いいたします。

  • カット&ペーストのマクロ(エクセル)

    Sub test()  Dim r1 As Range  Set r1 = Range(ActiveCell.Address)   On Error GoTo er:    For i = 0 To r1.End(xlToRight).Column - r1.Column    ActiveCell.Offset(-i, 0) = ActiveCell.Offset(0, i).Value    Next i   er: End Sub 上記のマクロを実行すると、以下のように横に入力されているものが縦にコピーされます。 A SS DDD FF GGG   ↓ ↓ ↓ ↓ GGG FF DDD SS A SS DDD FF GGG これを、コピーではなくカット&ペーストに変更するにはどうすればいいでしょうか?

  • Excel VBAで表組みしたらデバック発生

    Excel VBAの初心者です。Windows Vistaで Excel2007を使っています。 表をマクロの実行で作成したいと思っています。 何もないエクセルブックより 「開発」→「マクロの記録」→「相対参照」 →「表の作成」→「記録終了」→「相対参照で記録の解除」 →「エクセルマクロ有効ブックで保存」 ところがこのマクロ記録が入ったブックを再度立ち上げ、 表をオールクリアにし、マクロボタンより表作成を実行 させようとすると、次のエラーメッセージがでました。 『実行時エラー'9' インデックスが有効範囲にありません。』 デバックからModule1をみると以下の記述となっていました。 Sub 表組み() ' ' 表組み Macro ' ' ActiveCell.Range("A1:E5").Select Selection.Copy Windows("Book1").Activate ActiveSheet.Paste ActiveCell.Columns("A:A").EntireColumn.Select ActiveCell.Rows("1:1").EntireRow.RowHeight = 11.25 ActiveCell.Rows("1:5").EntireRow.Select Selection.RowHeight = 21.75 ActiveCell.Columns("A:A").EntireColumn.ColumnWidth = 14.88 ActiveCell.Offset(0, 4).Range("A1").Select Application.CutCopyMode = False With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With ActiveCell.Offset(1, -3).Range("A1:D4").Select Selection.NumberFormatLocal = "#,##0_ " ActiveCell.Select ActiveCell.FormulaR1C1 = "78000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "102000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "9800" ActiveCell.Offset(-2, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "65000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "204000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "500" ActiveCell.Offset(-2, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "86000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "151000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "10200" ActiveCell.Offset(-2, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(RC[-3]:RC[-1])" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(RC[-3]:RC[-1])" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" ActiveCell.Offset(0, -3).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" ActiveCell.Offset(-4, -2).Range("A1:D1").Select Selection.AutoFilter End Sub 上から9行目(?)のWindows("Book1").Activateに 黄色い矢印が示され、また行全体が黄色く四角に 覆われていました。 おそらくこの記述に問題があると思いますが、 どんな記述に変えたらいいのか分かりません。 Excel VBAにお詳しい方ご教示願います。 なお、マクロで作成したい図を添付いたします。 参考にしていただければ幸いです。

  • マクロで、カット→”値”だけをペーストで、

    セル:B2 は、1(数字) C2は、2(数字) D2は、(式)=B2+C2 が入っています。すなわち、3 です。 B2から下にある数行をカットして”値”だけ別表の下に貼り付けようとしますが、 ( Copy → ペーストなら下記のマクロで出来ますが ) Sub aaa() With ActiveSheet .Range("B2", .Range("D65536").End(xlUp)).Copy _ Destination:=Worksheets("Sheet2").Range("F65536").End(xlUp).Offset(1, 0) End With End Sub Copy を Cut にすると、動きません。 どこがミスしているかを教えていただきたくお願いします。 マクロ初心者です。

  • 【エクセル】 VBAでエラーが出てわかりません。。

    やりたいことは、関数をマクロでセルに記入してオートフィルで指定した行数まで伸ばしたいのです。 (すでに関数で作成したファイルがあるのですが、行数が多いため、とても重い。。^^;) まずマクロの記録で次のマクロを取得しました。 Sub Macro4() Range("C4").Select ActiveCell.Formula = "=SUM(A2:A10)" Range("C4").Select Selection.AutoFill Destination:=Range("C4:C12"), Type:=xlFillDefault Range("C4:C12").Select Range("D11").Select End Sub そして、 Sheet2に貼り付けて > ActiveCell.Formula = "=SUM(A2:A10)" の"=SUM(A2:A10)"部分をちょっと長い関数ですが、 "=IF(ISERROR(INDEX(Sheet1!$I$1:Sheet1!$I$400,SMALL($A$2:$A$400,ROW(A1)),1)),"",INDEX(Sheet1!$I$1:Sheet1!$I$400,SMALL($A$2:$A$400,ROW(A1)),1))" と書き換えてマクロを実行すると「アプリケーション定義またはオブジェクト定義エラーです。」 というエラーが出てしまうんですが、どこを直せばわからないです。。 おかしいところを教えてください、よろしくお願いします。 わかり図らい説明かと思いますが。。この件(1行目の文)について似たようなことを解説して いるサイトがありましたら、教えて欲しいです。

  • VBA Pasteで教えて下さい!

    Book1で指定したセル範囲(C2:C41)を Book2のSheet1の(AB4:AB43)とSheet2の(AU10:AU49)にペーストを行うに あたり、ボタン押下にて実行する下記コードをBook1に作成しましたが、 2番目のPasteで実行時エラー1004「アプリケーション定義または オブジェクト定義のエラーです」と出ます。 複数Sheetの別々のセルにペーストする方法を 教えていただけないでしょうか? Book1とBook2は共に開いた状態です。 Book2のシートは、それぞれVBAで保護をかけていますが、 .protect UserInterfaceOnly:=Trueで変更可能な状態に しています。 Private Sub copy_Click()  Range("C2:C41").Copy  Windows("Book2").Activate  Sheets("Sheet1").Range("AB4:AB43").PasteSpecial Paste:=xlPasteValues  Sheets("Sheet2").Range("AU10:AU49").PasteSpecial Paste:=xlPasteValues  (↑ここでエラーが出ます) End sub

  • excel vbaでの質問になります

    このようなマクロを作成したのですが、セルに数式が入れてあると、どうしてもその下の空白の行に値を入力されてしまいます。 数式が入っているセルにもそのままセルに値を入れたいのですが・・ 宜しくお願いします。 Dim wb1 As Worksheet, r1 As Range Dim N As Integer, i As Integer Dim mycount As Long   Set wb1 = ThisWorkbook.Worksheets("請求書") mycount = Range("B111").CurrentRegion.Rows.Count Cells(111 + mycount, 2).Select ActiveCell.Offset(0, 0).Value = wb1.Range("C60").Value ActiveCell.Offset(0, 1).Value = wb1.Range("C61").Value ActiveCell.Offset(0, 12).Value = wb1.Range("C66").Value ActiveCell.Offset(0, 13).Value = wb1.Range("C74").Value ActiveCell.Offset(0, 14).Value = wb1.Range("C75").Value ActiveCell.Offset(0, 15).Value = wb1.Range("C84").Value ActiveCell.Offset(0, 16).Value = wb1.Range("C85").Value ActiveCell.Offset(0, 20).Value = wb1.Range("C69").Value ActiveCell.Offset(0, 22).Value = wb1.Range("C68").Value ActiveCell.Offset(0, 23).Value = wb1.Range("C76").Value ActiveCell.Offset(0, 24).Value = wb1.Range("C77").Value Exit Sub

  • エクセルxpのVBA

    VBA初心者です。下記を実行すると、「elseに対応するifがありません」と出ます。なぜかわからず困っています。 For hiniti = DateSerial(Range("A3"), Range("A4"), 21) To DateAdd("m", 1, DateSerial(Range("A3"), Range("a4"), 20)) ActiveCell.Value = hiniti ActiveCell.Offset(0, 1).Select If ActiveCell.Column = 7 Then ActiveCell.Offset(1, -7).Select Else: ActiveCell.Offset(0, 1).Select End If next end sub

  • VBAについて

    いつもお世話になっています マクロ・VBA超初心者です。 質問させてください。 現在シート1の完売のセルの欄に○が入っていれば日付をみてシート2の同じ日付の隣のセルに○を入力しようと思っているのですが、シート2の日付を検索はしているんですが入力がいきません Sheet1  ↓セルA1 ↓セルB1  5月26日   26           B1のセルはDAY(A1)にて出してます         完売  A氏     ○             Sheet2  ↓A列   ↓B列 5月  1日  ・  ・  ・  26日    ○           ←シート1の所に○が付いているとシート1セルB1と同じ  27日                  日付の隣のセルに○を入力  28日 VBA Sub test() Sheets("Sheet2").Select Range("A1").Select Do Until ActiveCell = "" ActiveCell.Offset(1, 0).Activate If ActiveCell.Value = Worksheets("Sheet1").Range("B2") Then ActiveCell.Offset(0, 1).Activate If ActiveCell.Value <> "○" Then ActiveCell.Valu = "○" ActiveCell.Offset(0, -1).Activate Else ActiveCell.Offset(0, -1).Activate End If Else End If Loop Sheets("Sheet2").Select Range("A1").Select End Sub どこが間違っているかわからない状態です。 分かりにくい説明ではあるんですが教えてください お願いします。

専門家に質問してみよう