エクセルVBAで行のコピー貼り付けについて

このQ&Aのポイント
  • エクセルVBAを使用して行のコピー貼り付けを行いたい初心者です。
  • セル範囲A1からK40までの表を下にコピーしながら増やしたいです。
  • また、2007年のエクセルでは行数が65536行ではないため、最終行を取得する方法も教えてください。
回答を見る
  • ベストアンサー

エクセルVBAで行のコピー貼り付けについて

初心者、勉強中でエクセル2007です。 A1行からK40行までの表があります。 これを下にコピーをしながら増やしていってるのですが、マクロでしようと思い下記のとおり 考えました。 selecion.row.Offset(39, -1).Select ここでオブジェクトが必要ですと出ます。 それからその下の?とを色々ぐぐってみますがどうしてもわかりません。 それと2007ですので65536行ではないのですが、MaxRow = Cells(Rows.Count, 1).End(xlUp).Row だと動かないみたいですので下記としています。 よろしくご教授お願いします。 Sub Gcopy() MaxRow = Range("B65536").End(xlUp).Offset(-39, -1).Select データの入ってる最終行を取得 Selecion.row.Offset(39, -1).Select 選択された行から上に39行移動し選択 ?                    下へ39行まで選択   MaxRow = Range("B65536").End(xlUp).Offset(1, -1) 最終行を取得 ActiveSheet.Paste 貼り付け End Sub

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

んーと?  RowsとRowがごっちゃになっているようですが,結局ご自分でマクロを作成できたので,ご質問は解決でいいんですね。 整理: rowsは「行単位のセル範囲」というモノ(Rangeオブジェクト)を返します。 sub macro7() range("A3:B10").rows.select end sub rowsを使って「3行目から10行目までの行範囲(セル範囲)」という「モノ」が取得できたので,それをselectしたり,countで個数(この場合は「行数」)を数えたりできます。 rowは「セル.row」のようにして,指定のセルの行番号という数字(プロパティ)を返します。 sub macro8() msgbox activecell.row end sub rowを使って「今のセルの行番号」を取得します。これはただの数字でしかないので,たとえばselectしたりとかは全然お門違いです。

kyon0512
質問者

お礼

そうです、質問は解決しました。 それで最後に2~3質問よろしいでしょうか? それとも一旦ここはしめた方が良いでしょうか? もしここでよろしいのでしたら 1.変数を使ってますが使ったほうがよいのでしょうか? 使わない方法があるのでしょうか? 2. Sub macro5() Dim lastrow As Long lastrow = 10 lastrow = Cells(Cells.Rows.Count, 2).End(xup).Row.Copy End Sub no.1の解答で教えて頂いたこれ、オブジェクト定義エラーとなるのですが? 宜しくお願いします。

kyon0512
質問者

補足

わかりました。 ありがとうございました。

その他の回答 (3)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

>cellsで調べるとCellsは(行番号,列番号)しか出てきません。  : >意味を教えて頂けませんでしょうか? sub macro1() range("B3").select end sub sub macro2() cells(4, 4).select end sub sub macro3() cells(5,"E").select end sub などのように書いて動作を確認し,そのような書きぶりができるんだなと納得してください。 >38行下がるときはこういう書き方をするのですか? 違います。 sub macro4() dim lastrow as long lastrow = 44 range(cells(lastrow, "B"), cells(lastrow - 38, "B")).select end sub などのように書いて動作を確認し,どのセルをどうやって指定しているのか理解してください。 sub macro5() dim lastrow as long lastrow = 55 cells(lastrow - 38, "B").select end sub などのように書いて動作を確認し,どこが選ばれるのか見ながら「どうしてそうなるのか」理解してください。 >結局は適材適所です。こういうことですね。 勿論その通り,当然のことですね。「ヤリタイ事」に応じたマクロの書きぶりを選択します。 エクセルには「何が出来るのか」を知っておくことで,手持ちのカードも増えていきます。 >これはなぜ、最終行に1足すのがA列なんでしょうか? それはあなたがご質問に掲示された,アナタが書いたマクロがやっていることです。 参照:  MaxRow = Range("B65536").End(xlUp).Offset(1, -1) 最終行を取得 このマクロは間違っていますが,やりたかったことは 1.B65536セルからCtrl+↑でB列の最下端のセルにジャンプする 2.そのセルから,下に一行下がり,左に1列移動したセルを取得する 3.(間違い箇所)そのセルの行番号を取得し,maxrowに入れたかった つまりアナタが書いたマクロでやりたかったのは,B列最終行のセルから更に1行下がった「空き行の行番号」を取得したかったのです。 従ってワタシの書いたマクロではlastrowに+1して,一行下の行を指定しています。

kyon0512
質問者

お礼

お返事ありがとうございます。 1.これは最終行を44行と変数で指定してB列の最終行から上へ38行上がったところまでをrangeで範囲指定するっていう事ですね。理解できました。 sub macro4() dim lastrow as long lastrow = 44 range(cells(lastrow, "B"), cells(lastrow - 38, "B")).select end sub 2.これは55行を変数で指定して38行上がったところのセルを指定ってことですね、これはつまりoffsetと同じってことですね。offsetを使うより簡単に出来るってことですね。これもがってんしました sub macro5() dim lastrow as long lastrow = 55 cells(lastrow - 38, "B").select end sub これはrangeとcellの違いを良く認識できました 3.それでこれはB列の最終行のセルから上へ38行上がったB列までの行のrange範囲をコピー、最終行から1行下がったA列セルにdestination貼り付けということなんですね。 いままで、VBAのサイト見てきましたが、これほどよくわかる例を挙げていただいたことはないです。 range(cells(lastrow, "B"), cells(lastrow - 38, "B")).entirerow.copy _   destination:=cells(lastrow + 1, "A") 4.ただこれがやはり良くわかりません  lastrow = cells(cells.rows.count, "B").end(xlup).row 最終行に変数を代入はわかりますがb列の最終rows行のcount数を数えるですか? 5.アプリケーション定義オブジェクト定義エラーとなるのですが? Sub macro4() Dim lastrow As Long lastrow = 40 lastrow = cells(cells.rows.count, 2).end(xup).row 6.つまりアナタが書いたマクロでやりたかったのは,B列最終行のセルから更に1行下がった「空き行の行番号」を取得したかったのです。 従ってワタシの書いたマクロではlastrowに+1して,一行下の行を指定しています。 そうですね、すいません、そうでした。 7.普通はNO.2の人が考えたみたいに長くなるんでしょうが、keithinはプロなんでしょうね。 僕らが見ても簡潔にまとめられてますよね、それでちなみに後学のために伺うのですが、僕が最初に考えたのを修正すると Sub Gcopy() MaxRow = range("B65536").End(xlUp).Offset(-39, -1).Select Selecion.Row.Offset(39, -1).EntireRow.Copy MaxRow = range("B65536").End(xlUp).Offset(1, -1) ActiveSheet.Paste 貼り付け End Sub 感じとしてはこのようになるんでしょうけどSelecion.Row.Offset(39, -1).EntireRow.Copy がまず違いますね、この構文を使用するとしたらどこをどうしたら動くのでしょうか? 最後に以上宜しくお願いします。

kyon0512
質問者

補足

keithinさん ちなみにご覧のとおり1行~40行目まであるA社の請求書と41行目~80行目まであるB社の請求書を聞いてこらせてどちらかを入力最終行の下へペーストをどうせ動かないだろうなあと思いながら見よう見まねでやってみましたらななな何と動くではありませんか、もう嬉しくて嬉しくてこれもkeithinさんのお陰です。ほんとうにここにいらしたら一杯おごってあげたいくらいです。 Sub Skcopy() Dim lastrow As Long Dim Skc As Integer On Error Resume Next Skc = InputBox("どちらをコピー?1.A社  2.B社") If Skc = 1 Then lastrow = Cells(Cells.Rows.Count, "b").End(xlUp).Row Range("1:40").Copy _ Destination:=Cells(lastrow + 1, "A") ElseIf Skc = 2 Then lastrow = Cells(Cells.Rows.Count, "b").End(xlUp).Row Range("41:80").Copy _ Destination:=Cells(lastrow + 1, "A") Else MsgBox "1か2を入力して!" End If End Sub

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

こんにちは! 外していたらごめんなさい。 A1~K40セル(40行目は気にせず、最終行まで)のデータを2行ずつ同じものを表示すれば良い訳ですよね? そういうコトだとしての一例です。 やり方 (1)最終行からデータの1行下に行を挿入 (2)挿入行の1行上のA~K列をコピーとしています。 Sub test() Dim i As Long Application.ScreenUpdating = False For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1 Rows(i + 1).Insert Range(Cells(i, 1), Cells(i, 11)).Copy Cells(i + 1, 1).Select ActiveSheet.Paste Next i Application.CutCopyMode = False Application.ScreenUpdating = True Cells(Rows.Count, 1).End(xlUp).Offset(1).Select End Sub こんな感じではどうでしょうか? ※ コードの書き方は人それぞれですが、、 行の挿入・削除は最後の行から行っていかないと、元の行番号が変わってしまう。 という考え方でやっています。 参考になれば良いのですが、 的外れならごめんなさいね。m(__)m

kyon0512
質問者

お礼

解答大変ありがとうございます。 やってみましたら、ActiveSheet.Pasteで結合されたセルの一部を変更することは出来ません。と出ます。17行目と18行目を結合してるからでしょうか? 宜しくお願いします。

kyon0512
質問者

補足

tom04さん、セルを結合している部分があるので先の方がやっていた方法でやってみましたが Destination:=Cells(i + 1, 1)でも Destination:=activesheetでも駄目です。構文エラーとなります。 宜しくご指導お願いします。 Sub test() Dim i As Long Application.ScreenUpdating = False For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1 Rows(i + 1).Insert range(Cells(i, 1), Cells(i, 11)).Copy Destination:=Cells(i + 1, 1) Next i Application.CutCopyMode = False Application.ScreenUpdating = True Cells(Rows.Count, 1).End(xlUp).Offset(1).Select End Sub

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

(考え方の例) 何をコピーしたいのか:  B列の最下端のセルを基点にして  上に39行分遡った行範囲 どこに貼り付けたいのか:  B列の最下端のセルを基点にして  一行下の行のA列のセルに 作成例: sub macro1()  dim lastrow as long  lastrow = cells(cells.rows.count, "B").end(xlup).row  range(cells(lastrow, "B"), cells(lastrow - 38, "B")).entirerow.copy _   destination:=cells(lastrow + 1, "A") end sub #参考 こんな書き方もあります: range("B" & lastrow).offset(-38, 0).resize(39,1).entirerow.copy _ #参考 別にExcel2007以降でも,実際のデータが6万行も無いなら,程々に下のセルからCtrl+↑することで最下行のセルを十分検出できます。 lastrow = range("B10000").end(xlup).row でも lastrow = range("B65536").end(xlup).row lastrow = cells(cells.rows.count, 2).end(xup).row でも,実質的には関係ないということです。

kyon0512
質問者

お礼

解答ありがとうございます。 出来ました。しかし、いままで調べてきた方法と全然違うので”えー、こんな解答になるの?”って感じなんですが少し質問させて下さい。 やはり変数を使わないとだめなんですね、そうではないかと思ってましたが cellsで調べるとCellsは(行番号,列番号)しか出てきません。 cells(cells.rows.count, "B")はB列を・・? 意味を教えて頂けませんでしょうか? range(cells(lastrow, "B"), cells(lastrow - 38, "B")).entirerow.copy _ 38行下がるときはこういう書き方をするのですか? EntireRowは行全体を選択するんですね。 それからDestinationは ちなみに、「Destination:=の方が優れている!」と言うわけじゃないです。Destination:=の方は速いけど全ての情報をまるごとコピペしかできない、???.Copyと???.PasteSpecialの方は遅いけど書式だけコピペしたり、値だけコピペなど多機能というメリット・デメリットがあるので、結局は適材適所です。こういうことですね。 destination:=cells(lastrow + 1, "A") これはなぜ、最終行に1足すのがA列なんでしょうか? 以上宜しくお願いします。

関連するQ&A

  • シート1のC列の最終行をコピーして同じ行に値貼り付けしたい

    シート1のC列の最終行を取得して その行を丸々値貼り付けするマクロを作りたいと思います。 シート3のB18の値をシート1のC列の最終行の1つ下のセルに値貼り付け すると、その行のA、B列に日付が入力される関数が入っています。(下まで) 関数が入ったままだと、うまくいかない時があるので最終行をコピーして値貼り付けしたいのですが、マクロの作り方を教えてください。 シート1の最終行に貼り付け Sheets("Sheet3").Select Range("B18").Select Selection.Copy Sheets("Sheet1").Select Range("C65536").End(xlUp).Offset(1).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub 最終行をコピーして値貼り付け Dim 最終行 As Integer 最終行 = Range("C65536").End(xlUp).Row Range("A6:C" & 最終行).Select Selection.Copy Sheets("Sheet1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub このマクロだと、A6からC列の最終行まで全てコピーされてしまうので、C列の最終行のAからC列まで1行だけコピーできないでしょうか?

  • エクセルマクロについて

    最終行の1つ下の行に100000と入力したいですが Range("b65536").Select Selection.End(xlUp).Select ActiveCell.Offset(0, 1).Value = 100000 としてもうまく行きません Selection.End(xlUp).Select この部分だけで なんとかなるのでしょうか よろしくお願い致します

  • Excel2013VBA列選択の拡大

    ExcelVBA2013です。 列の取得でつまづいております。 お手数ですが、ご教授下さい。 下記のコードで選択範囲のコピー貼り付けは出来ていますが、列幅がコピーされていませんでした。 CC3のセルを基準にOffsetとResizeで範囲拡大してコピーしているためだと思います。 CC3の左隣のAX3:CB3はセル結合されています(○月)。(その下の4行目は日付の1~31が入力) 列は、今回はAX3:CC3まで(1月分)取得できればよいです。(可変します) MaxCol = Range("J5").End(xlToRight).Column  で列取得できます。 行の位置は、MaxRow = Range("I5").End(xlDown).Row  で取得した値です。 それで、列全体を取得しようと、 MaxCol = Columns(MaxCol).Select で最終列は取得できましたが、そこから列選択の拡大ができればと思っています。 現在は、AX3:CC237まで取得コピーして、隣の列に貼り付けで列幅が違う。 希望はAX:CCまでの列を取得選択コピーして貼り付け。 Sub SAMPLE() Dim MaxRow As Variant, MaxCol As Variant Dim r As Range, c As Range MaxRow = Range("I5").End(xlDown).Row '最終行番号 MaxCol = Range("J5").End(xlToRight).Column '最終列番号 Set c = Cells(3, Cells(3, Columns.Count).End(xlToLeft).Column) '表の右上角のセル番地を取得 c.Select c.Offset(0, -31).Resize(MaxRow - 2, 32).Copy c.Offset(0, 1) '表右上から1月分選択範囲拡大してコピー隣の列より貼りつけ End Sub

  • VBA 最終行を選んだシートにコピーする。

    VBAど初心者です。どうしても最終行のデータを選んだシートにコピーできません。 LastRow.Selectのところで、止まってしまいます。どのように行を設定していいのかさっぱりわかりません。どなたか、ご指導のほどよろしくお願いします。 Sub copy_last_line() Dim LastRow As Long Sheets("Sheet1").Select LastRow = Cells(Rows.Count, 1).End(xlUp).Row LastRow.Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("A1").Select End Sub

  • ExcelのVBAでコピーのやり方

    シート1のAL列の3行目以降の中から0以外の 値が入っているAJ列~AN列の行を全てコピーして、 シート2のB列~F列に貼り付けたいです。 シート2のB列~F列の7行目から下にコピーした値を入れていきたく、 値が入っていたらその次の行に貼り付けたいです。 例えば、7行目~15行目まで値が入っていたら、16行目から貼り付けるようにしたいです。↓のように書いてみたのですが、 コピーしている状態になるだけで、シート2の方へ貼り付けができない状態です。 また、オブジェクトが必要ですと表示が出ます。 どこをどうなおしたらいいでしょうか。 文章がわかりにくく申し訳ありません。 回答よろしくお願いいたします。 sub 値をコピー() Dim rTargetRange As Range, ii As Long Set rTargetRange = Nothing For ii = 4 To Cells(Rows.CountLarge, "AL").End(xlUp).Row If (Cells(ii, "AL").Value <> 0) Then If (rTargetRange Is Nothing) Then Set rTargetRange = Cells(ii, "AJ").Resize(, 5) Else Set rTargetRange = Application.Union(rTargetRange, Cells(ii, "AJ").Resize(, 5)) End If End If Next With Worksheets("sheet2") With .Cells(.Rows.CountLarge, "B").End(xlUp) If (.Row = 1 And .Value = "") Then rTargetRange.Copy .Offset(0) Else rTargetRange.Copy .Offset(1) End If End With End With End Sub また、↓のような違ったコードも試しましたが、 うまくいきませんでした。 N=Sheet2.Cells(Rows.CountLarge, "AL").End(xlUp).Row+1 SHEET1.SELECT For ii = 4 To Cells(Rows.CountLarge, "AL").End(xlUp).Row If Cells(ii, "AL").Valu e <> 0 Then RANGE("AJ" & ii & ":AN" & ii).COPY SHEET2.RANGE("B" & N) N=N+1 END IF NEXT

  • エクセル・マクロで最終行を表示することについて

    エクセル・マクロで最終行を表示することについて C列の最終行を表示する場合、以下のマクロで表示できます。 今回はC列に C1=A1&B1 C2=A2&B2  ↓ という式が入力されている場合について質問します。 A列とB列が空白の場合、C列には0が表示されます。 したがって、下記のマクロだとこの0の行が最終行となります。 私の希望はこのC列の0は空白とみなし、0以外の値や文字が入力されている最終行を表示することです。 どのような工夫をすれば可能でしょうか? ご指導よろしくお願いします。 Sub 最終行表示() maxrow = Range("c65536").End(xlUp).Row MsgBox maxrow End Sub

  • マクロ EXCELの範囲をコピーして貼付け

    『End(xlDown).Row』で取得した値を使ってセルの範囲指定&コピーを行い、 新しく追加したシートに貼り付けたいのですがうまくいきません。 Sub attendanceJoin() Dim MaxRow As Integer 'シートの最終行の値 Workbooks("test.xls").Activate Dim NewWorkSheet As Worksheet Set NewWorkSheet = Worksheets.Add() '新しいシートを追加する MaxRow = Worksheets(2).Range("M1").End(xlDown).Row  'A列の最終行を取得 NewWorkSheet.Name = "統合"  '新しく追加したシートの名前を変更 With Workbooks("test.xls") .Worksheets(2).Range("A1:M&MaxRow").Copy   'コピーするセルの範囲を指定    '↑ここでエラー。.Worksheets(2).Range("A1:M38").Copy を指定するイメージです。 .Worksheets("統合").Range("A1").PasteSpecial End With End Sub どなたか間違っている箇所のご教示お願い出来ますでしょうか。 どうぞよろしくお願い致します。

  • VBAを実行しても結果が反映されない??

    下記のVBAを作成しましたが結果が反映されません ※実際は反映されているのかもしれませんが思うような結果ではありません やりたいこととしてはボタンを選択すると 特定のシート[BBB]の[B2:D2]を シート[AAA]の最終行と同じ行番号までコピーすることです おかしい個所をご指摘いただきたいです ※同様の質問を他の形でさせていただきましたがうまくいかなかったため新しく組み直したものです --- Private Sub CommandButton_Click() Dim ws As Worksheet Set ws = Worksheets("BBB") Range("B2:D2").Select Selection.AutoFill Destination:=Range("B2:D" & Sheets("AAA").Range("A1").End(xlUp).Row) Range("B2:D" & Sheets("AAA").Range("A1").End(xlUp).Row).Select End Sub

  • エクセルVBAの貼付けについて

    エクセルVBAの貼付けについて シートAとBがあって、シートBの1~7列をコピーし、シートAの最終行に貼り付ける方法を教えて下さい。 下記のように書いてみたのですがダメでした。 Sheets("B").Select Rows("1:7").Select Selection.Copy Sheets("A").Select With Range("A1").End(xlDown).Offset(1, 0) .ActiveSheet.Paste End With

  • エクセル VBA マクロについて

    VBA初心者です。 Sub 記入() Range("H8", "J14").Copy Range("C" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False Range("H15", "J21").Copy Range("C" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False Range("H22", "J28").Copy Range("C" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False Range("K13").Select End Sub こういうマクロを作り上手く作動しましたのでB列に日付を記入したいと思い Sub 日付() Range("("B" & Rows.Count).End(xlUp).Offset(1)","("C" & Rows.Count).End(xlUp).Offset(0, -1)").Value = Date End Sub このようなマクロを組みましたがエラーがでます。どなたか直して頂けませんか?よろしくお願いします。

専門家に質問してみよう