- ベストアンサー
エクセルマクロで列を連続してコピーする方法
- エクセルで列を連続してコピーするには、マクロを使用します。
- 縦方向に連続してコピーする場合は、Loopを使用してセルの範囲を指定し、コピーしてください。
- 横方向に連続してコピーする場合は、セルの範囲を指定し、指定した列間隔でコピーしていきます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんなことでよろしいでしょうか? Sub test() Dim srcRange As Range, destRange As Range Const columnOffset as Long = 2 Set srcRange = Range("a2:a10") Set destRange = Range("c2") Do Until destRange.Column > 100 srcRange.Copy destRange Set destRange = destRange.Offset(, columnOffset) Loop End Sub
その他の回答 (3)
- hotosys
- ベストアンサー率67% (97/143)
もちろん繰り返しの命令で記述するのがセオリーだとは思いますが、こんな方法もあります。 手動での操作を考えてもらうとわかるのですが例えばA1:B3範囲をコピーして、A4:C15範囲を選択してペーストするとA4からに3回ペーストしたと同じになります。 最初のA2:B92範囲を縦へコピーする場合は以下でも記述できます。 Sub sample() Range("A2:B92").Select Selection.Copy Range("A93:B2822").Select ActiveSheet.Paste End Sub また、上記は以下でも記述できます。(2行目から92行目までの91行を30回ペーストする) Sub sample2() Range("A2:B92").Select Selection.Copy Range("A93").Resize(91 * 30, 2).Select ActiveSheet.Paste End Sub 質問に対する回答です。 横にコピーする場合も同じなのですが、1行おきの場合は少し違いますが、C列とE列位なら(もう少しあっても)以下で記述できます。 Sub sample3() Range("A2:A10").Select Selection.Copy Range("C2:C10,E2:E10").Select ActiveSheet.Paste End Sub ただしあまり多くなるとRange("範囲")の範囲の文字数の関係でエラーが出る場合があるけれど、その場合はunionを使います。 p.s. range("A2")とかをcells(1,2)と記述する方法は計算的には楽なのですが、画面上のV25やAC25とかの列番号が大きくなった時には直観的に列番号が分かりにくかったりします。 画面変更があった場合やデバッグではrangeとoffsetやresizeでプログラムしておく方が変更しやすかったり直観的にどのセルか分かりやすかったりします。 なのでrangeとcellsはケースバイケースで使い分ければいいと思います。 ただOption Explicitと変数の宣言は絶対した方がいいと思います、個人的には。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >Range("A"+Format(GYOU1)).Select この感覚は良く分かります。別の言語を習ったことがあるのでしょうか。ただ、VB系では、数値は、自動キャストといって、そのまま、文字列に変化します。ところで、ExcelではVBAは、あまり、Do ~Loop を使わないです。理由は、作業が計数化できるからだと思います。 なるべく、変数の宣言はしてくださいね。 '--------------------------------- Sub Test1() Dim r As Range Dim i As Long Set r = Range("A2:B92") For i = 1 To 31 r.Copy Cells(i * 91 + 2, 1) Next i Set r = Nothing End Sub '------------------------------- Sub Test2() Dim r As Range Dim i As Long Set r = Range("A2:A10") For i = 1 To 5 r.Copy Cells(2, i * 2 + 1) Next i Set r = Nothing End Sub
- imogasi
- ベストアンサー率27% (4737/17070)
何処かで、コード実例を見て、まねているのだろうが、 Range("A"+Format(GYOU1)).Select は中途半端だ。 Cells(i,j) のi,jを規則性を捉えて式化する方が、応用が広い。 ーー Sub test01() Dim sh1 Dim sh2 Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") '-- d = sh1.Range("A65536").End(xlUp).Row r = sh1.Range("IV1").End(xlToLeft).Column '-- k = 1 l = 1 For i = 1 To d Step 3 '3行おき1、4、5、・・ For j = 1 To r Step 2 '2列おき1,3,5、・・ sh1.Range(sh1.Cells(i, j), sh1.Cells(i + 1, j)).Copy sh2.Cells(k, l) l = l + 1 Next j k = k + 3 '2行1ブロック+空白1行 l = 1 Next i End Sub 上記は小生側で、テストしやすいよう91行目ごとを2行目ごととか に変えてある。 結果は別シートSheet2に出している。 本当はテスト・実行データの無い回答者のことを慮ってそういう簡素化した実例を挙げるべきだといつも思う。 そのほか見やすいようにSheet2で1行空白列を入れているが不要ならk = k + 3 の3を変えてください。 よくコード読んで類推して、上記コードを質問者の場合に合わせて修正してください。 ーー 上記のコードは色々なコードのスキルが詰まっている。 2シートの扱い 最終行・最終列を捉えてForNextに持ち込み(DoUntilとどちらがよいかは好みなれど) ForNextのの利用 Copyメソッドの引数利用 貼り付け先のコントロールの仕方。 など最小行数でを目指した。
補足
ありがとうございました。 見まねでやっている者ですので、基礎知識が全くありません。申し訳ありませんが、以下、教えて頂けませんでしょうか。 Do Until destRange.Column > 100 このColumnはどういう役割をしているのでしょうか?また、ColumnをRowに替えると、下方向に進んでいくのでしょうか? srcRange.Copy destRange これはsrcRangeで捕らえたものをdestRangeにコピーするという意味ですよね?質問では述べませんでしたが、実際使おうとしているのはシートをまたいだコピーペーストです。シート1にあるものをコピーしてシート2にペーストしたいのですが。その場合はどうしたらいいのでしょうか。