プロが教える店舗&オフィスのセキュリティ対策術

初めて質問します。よろしくお願いいたします。

エクセルで上から下へ繰り返しコピーをする際のマクロは、例えば以下のようにLoopを使ってできると思うのですが、
例)
Range ("A2:B92").select
Selection.Copy

GYOU1 = 93
Do Until GYOU1 = 2823

Range("A"+Format(GYOU1)).Select
ActiveSheet.Paste

GYOU1 = GYOU1 + 91

Loop

同じような連続の動作を横方向(列方向)に行うにはどういうマクロを組めばよいか教えてください。例えば、A2:A10 -> C2:C10 -> E2:E10のように2列間隔で横方向にコピーペーストしていくマクロです。

よろしくお願いいたします。

A 回答 (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

この回答への補足

ありがとうございました。
見まねでやっている者ですので、基礎知識が全くありません。申し訳ありませんが、以下、教えて頂けませんでしょうか。

Do Until destRange.Column > 100
このColumnはどういう役割をしているのでしょうか?また、ColumnをRowに替えると、下方向に進んでいくのでしょうか?

srcRange.Copy destRange
これはsrcRangeで捕らえたものをdestRangeにコピーするという意味ですよね?質問では述べませんでしたが、実際使おうとしているのはシートをまたいだコピーペーストです。シート1にあるものをコピーしてシート2にペーストしたいのですが。その場合はどうしたらいいのでしょうか。

補足日時:2008/11/25 02:15
    • good
    • 1

もちろん繰り返しの命令で記述するのがセオリーだとは思いますが、こんな方法もあります。



手動での操作を考えてもらうとわかるのですが例えば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と変数の宣言は絶対した方がいいと思います、個人的には。
    • good
    • 1

こんばんは。



>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
    • good
    • 0

何処かで、コード実例を見て、まねているのだろうが、


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メソッドの引数利用
貼り付け先のコントロールの仕方。
など最小行数でを目指した。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています