• ベストアンサー

Excelのマクロでセルの値をコピーしたいのですが

 他の方も質問されているのかもしれませんが、見つけられなかったので教えてください。 Excelのセルに A1001~A2000まで数値が入っているとします それをA1~E1までにA1001~A1005までの数値を A2~E2までにA1006~A1010までの数値をコピー(参照)し、これを繰り返してA2000の数値まで対応したいのですが、マクロでコピーを組むにはどうしたらよいのでしょうか? ちなみに、OSはWin2000 ExcelはExcel2000です。  全く初歩的な質問ですみません。

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

なんかアルゴリズム大会になりそうな予感ですが、以下ではどうでしょう Option Explicit Sub DtCopy() Dim idxCopy, idxPaste As Long idxPaste = 1 Application.ScreenUpdating = False For idxCopy = 1001 To 2000 Step 5 Cells(idxPaste, 1).Offset(0, 0) = Cells(idxCopy, 1).Offset(0, 0) Cells(idxPaste, 1).Offset(0, 1) = Cells(idxCopy, 1).Offset(1, 0) Cells(idxPaste, 1).Offset(0, 2) = Cells(idxCopy, 1).Offset(2, 0) Cells(idxPaste, 1).Offset(0, 3) = Cells(idxCopy, 1).Offset(3, 0) Cells(idxPaste, 1).Offset(0, 4) = Cells(idxCopy, 1).Offset(4, 0) idxPaste = idxPaste + 1 Next idxCopy Application.ScreenUpdating = True End Sub もし値をコピーするのではなく   a1 に =a1001   b1 に =a1002 という式を入れたいのであれば補足にその旨を書いてください

その他の回答 (6)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.7

訂正です FOR EACHは#02さんでした。失礼しました

dogs59
質問者

お礼

 色々とありがとうございます。何度勉強してもマクロがよくわからず、結局、皆さんのお知恵を拝借することになってしまいます。これに懲りずにまたよろしくお願いします。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.6

#01です。面白いので処理時間(ms)を出してみました。数字はmsで1回目、2回目を掲載します #01   230ms、211ms #02さん 631ms、591ms #03さん 170ms、170ms #04さん 180ms、200ms #05さん 181ms、180ms #05さんのFOR~NEXTの入れ子でも遅くならないのが面白いですね。また#03さんのFOR EACHが一番速かったのも実は意外でした (参考 処理時間をmsでだすプログラム) Private Declare Function GetTickCount Lib "kernel32" () As Long Sub xxxx() Dim ST As Long   前処理 Application.ScreenUpdating = False ST = GetTickCount For   繰り返し処理 Next Application.ScreenUpdating = True MsgBox (GetTickCount - ST & " ms") End Sub

  • ipsum11
  • ベストアンサー率21% (55/251)
回答No.5

色々な回答が出揃ってきましたけど、こんなのはいかがでしょう。 r = 0 For i = 1001 To 2000 r = r + 1 For l = 1 To 5 Cells(r, l) = Cells(i, 1) i = i + 1 Next l i = i - 1 Next i

dogs59
質問者

お礼

 ありがとうございます。  難しくて文法などがよくわかりませんが、色々な方法があるということはわかりましたので、試してみます。

  • ao777
  • ベストアンサー率34% (43/123)
回答No.4

なんとなく他の方法も考えてみました。 テストしておりません。 Dim ro1 As Integer Dim ro2 As Integer Dim co1 As Integer ro1 = 1001 ro2 = 2 co1 = 1 Do Until ro1 >= 2000 Cells(ro2, co1).Value = Cells(ro1, 1).Value Cells(ro2, co1 + 1).Value = Cells(ro1 + 1, 1).Value Cells(ro2, co1 + 2).Value = Cells(ro1 + 2, 1).Value Cells(ro2, co1 + 3).Value = Cells(ro1 + 3, 1).Value Cells(ro2, co1 + 4).Value = Cells(ro1 + 4, 1).Value ro1 = ro1 + 5 ro2 = ro2 + 1 Loop End Sub

dogs59
質問者

お礼

 ありがとうございます。  難しくて文法などがよくわかりませんが、色々な方法があるということはわかりましたので、試してみます。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

Sub test1() n = 1 For i = 1001 To 2000 Step 5 Range(Cells(i, 1), Cells(i + 4, 1)).Copy Cells(n, 1).PasteSpecial Paste:=xlValues, Transpose:=True Application.CutCopyMode = False n = n + 1 Next End Sub ではどうでしょう?

dogs59
質問者

お礼

 ありがとうございます。  難しくて文法などがよくわかりませんが、色々な方法があるということはわかりましたので、試してみます。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

こんな感じでしょうか。 Dim C As Range Dim ct As Integer Dim r As Integer r = 1 For Each C In Range("A1001:A2000") ct = ct + 1 Cells(r, ct) = C.Value If ct = 5 Then r = r + 1 ct = 0 End If Next >数値をコピー(参照) 参照というと「=A1001」という参照式の事ですか?

dogs59
質問者

お礼

 ありがとうございます。  難しくて文法などがよくわかりませんが、色々な方法があるということはわかりましたので、試してみます。  参照の意味は、本来は、式を入れたかったのですが、難しいので、数値でかまいません。私がやろうとしたことでは、結果は同じですし。