• ベストアンサー

VBA コピーを有効行までループをする方法

VBAをはじめたばかりの初心者です。 業務でマクロ処理をするよう言われましたが、苦戦しております。 なんとか今週中にしあげなければならない状況で、ご存知の方がいらっしゃれば助けていただければと思います。 1行目・・・項目が記載されています。 2行目以降・・・A列~G列・I~K列に住所などの情報があり、H列とL列にはとある計算式をいれています。 件数は約500件(500行)程度で、毎回変更します。 H2とL2に計算式を入れて、 セルH2の値をH3にコピー、セルL2の値をL3にコピーするマクロが自動記録で次のようにできました。 Range("H2").Select Selection.Copy Range("H3").Select ActiveSheet.Paste Range("L2").Select Application.CutCopyMode = False Selection.Copy Range("L3").Select ActiveSheet.Paste これを、H4・L4、H5・L5・・・・と繰り返してコピーをしていき、データがなくなったらループを修了するという記述をしたいのですが、わかりません。 いろいろネットで探してみたのですが、データ数を指定するやり方(?)ではなく、「Do~Loop」を使った方法でやりたいと思っております。 どなたか教えていただけませんでしょうか。 宜しくお願いいたします。

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.4

方法はいくつかあると思いますが。。。 '------------------------------------- Sub Test1()  Dim Lastrow As Long  Lastrow = Cells(Rows.Count, "A").End(xlUp).Row  Range("H2").AutoFill Range("H2:H" & Lastrow)  Range("L2").AutoFill Range("L2:L" & Lastrow) End Sub '-------------------------------------- Sub Test2()  Dim Lastrow As Long  Lastrow = Cells(Rows.Count, "A").End(xlUp).Row  Range("H2").Copy Range("H3:H" & Lastrow)  Range("L2").Copy Range("L3:L" & Lastrow) End Sub '----------------------------------- Sub Test3()  Dim R As Long  For R = 3 To Cells(Rows.Count, "A").End(xlUp).Row    Range("H2").Copy Cells(R, "H")    Range("L2").Copy Cells(R, "L")  Next R End Sub '--------------------------------- A列のデータで最終行を判断してます。  

naoko5138
質問者

お礼

こんばんわ。 いろんな記述があるのですね。 直感で(?) Test3を試したところ、無事うまくいきました! 実は、HとLだけでなくコピーしたい列が複数ありましたので、 「Range("H2").Copy Cells(R, "H")」のように、 1行でシンプルに記述する方法は、とってもうれしいです! 本当にありがとうございます。

その他の回答 (3)

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.3

もう一つ、以下の操作も「マクロの記録」をしてみてください。 H2に数式を入れ、その後、記録スタートするとします。 1.H2~H10を選択(マウスを使っても、キーボードのShift+↓を使ってもOKです) 2.Ctrl+d 後はマクロの記録には出てきませんが、RangeやCellsを上手く使えばできます。 実際のデータを見ていないので確かなことは言えませんが、Do~Loopや For~to~Nextなどは使わなくてもできると思います。

naoko5138
質問者

お礼

こんばんわ。 たびたびありがとうございます。 Ctrl+dは、知りませんでした! これは大変使えそうです。 Do~Loopや For~to~Nextを使わずにするやり方も習得したいと思います。 ありがとうございます。

  • Sinogi
  • ベストアンサー率27% (72/260)
回答No.2

せっかく「Do~Loop」にまで到達しているならヘルプを見て自分で考えるのがBestです。 VBAからヘルプを呼び出し、目次から Visual Basic プログラミングのヒント→Do...Loop ステートメントの使い方 に詳しく書いています。

naoko5138
質問者

お礼

こんばんわ。 ヘルプがあるんですね! いろいろ用語がわからず困っていましたので、 助かります。 ありがとうございます。

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.1

こんばんは 以下の操作を「マクロの記録」してみてください。 1.A列の一番下のセルを選択 2.Ctrlキーを押しながら↑キーを押す。 マクロの記録ですともう少し長い記述となりますが、自分でVBAを書くと以下のようになります。 Cells(Rows.Count, "A").End (xlUp) [A65536]を使わないのはバージョンが2003以前と2007のどちらでも対応できるようにするためです(もっとも、いずれの場合にも最後の行までデータを入れることはないという前提です)。 最後の行を知りたい場合には、 Cells(Rows.Count, "A").End(xlUp).Row とします。

naoko5138
質問者

お礼

こんばんは。 早速のご回答ありがとうございます。 「End (xlUp)」を初めて知りました。 大変便利で、応用がききそうです。バージョンによっても記述が違うのですね・・・。 ありがとうございます。

関連するQ&A

専門家に質問してみよう