プロが教えるわが家の防犯対策術!

A列にa1~a100まで数字が入ってます。
それを、b1~b5,c1~c5,…省略 u1~u5までに、データを
5行ずつ移したいのです。
b1にはa1、b2にはa2の値を、u5にはa100の値を入れたいのです。
マクロの自動記録?を使うとできることはできるのですが…。
一次配列→二次配列で、出来ると聞いたことがあるのですが。
※VBAは全くの初心者です。
コードに説明もつけてくださるとすごく助かります。
どうかよろしくお願いいたします。

教えて!goo グレード

A 回答 (4件)

5x20の配列でやるなら


Dim arSrc as Variant, arDes as Variant
dim x as integer, y as integer
arSrc = Range("A1:A100")
' 配列を用意する
arDes = Range("B1:U5")
for y = 1 to 5
  for x = 1 to 5
    arDes(x,y) = arSrc( x + ( y - 1 ) * 5 )
  Next
Next
Range("B1:U5").Value = arDes
といった具合でしょう

Dim BU( 1 to 5, 1 to 20 ) as Byte
などとしてしまうと Range(範囲).Value = BU といった記述ができません
VBEで Dim BU( 1 to 5, 1 to 20 ) as Byte とした場合と
Dim BUV as Variant
BUV = Range("B1:U5").Value
とした場合の違いを確認してみてください
    • good
    • 2
この回答へのお礼

すばやい回答ありがとうございます。
私には少し難し過ぎました。
何となくわかりそうな気はするのですが…。
時間を見て解析して見たいと思います。
色々な方法があるのですね。
本当にありがとうございました。
すごく参考になりました。

お礼日時:2008/08/07 21:14

Rangeオブジェクト2つ使ってループを回せばいいでしょう



Sub Macro1()
  dim oSrc as Range, oDes as Range
  dim n as integer
  Set oSrc = Range("A1:A5")
  Set oDes = Range("B1:B5")
  for n = 1 to 20
    oDes.Value = oSrc.Value
    ' コピー元は5行下へ移動
    Set oSec = oSrc.Offset( 5, 0 )
    ' コピー先は1列右に移動
    Set oDes = oDes.Offset( 0, 1 )
  next
End Sub
といった具合です

この回答への補足

分かり易い回答ありがとうございます。
試した所B列~U列まで同じ数字になってしまいましたので
少し、色々試させていただきました。
――――――――――――――――――――――――――――
Sub Macro1()
Dim i As Range, j As Range
Dim n As Integer
Set i = Range("A1:A5")
Set j = Range("B1:B5")
For n = 1 To 20
j.Value = i.Value
' コピー元は5行下へ移動
Set i = i.Offset(5, 0)
' コピー先は1列右に移動
Set j = j.Offset(0, 1)
Next
End Sub
――――――――――――――――――――――――――――
何とかクリア出来ました。本当にありがとうございます。
こんなに短いコード?で出来るなんて思っていませんでした。
それと大変恐縮なのですが、もし知っていましたら
もう一つ教えていただきたいことがあるのですが、

bytearray で宣言して5×20の二次元配列作って、配列に
数字を入れていく方法もあると聞いたことあるのですが、
さっぱりわかりません。
もし、良ければで結構です。
知っていましたら教えて頂けないでしょうか。
初心者なので、知る必要ないのかも知れませんが、
勉強中の身としては、どうしても気になって仕方ないのです。

本当にお答え下さってありがとうございます。
すごく助かりました。

補足日時:2008/08/07 07:11
    • good
    • 0
この回答へのお礼

本当にありがとうございました。
専門家なのですね。
コードも分かりやすくて、いろいろ応用できそうです。
初心者にとってはすごく助かりました。
補足付け足していますので、宜しければまた
補足部分見て下さると嬉しいです。

お礼日時:2008/08/07 14:27

なんだか、課題っぽいけど。



セルB1はセルA1のひとつ右高さ同じ
セルB2はセルA1のひとつ右高さひとつ下
セルB3はセルA1のひとつ右高さふたつ下
セルB4はセルA1のひとつ右高さみっつ下
セルB5はセルA1のひとつ右高さよっつ下
これは、Range("A1").Offset(0,1) ~ Range("A1").Offset(4,1)です。

セルC1はセルA1のふたつ右高さ同じ
セルC2はセルA1のふたつ右高さひとつ下
セルC3はセルA1のふたつ右高さふたつ下
セルC4はセルA1のふたつ右高さみっつ下
セルC5はセルA1のふたつ右高さよっつ下
これは、Range("A1").Offset(0,2) ~ Range("A1").Offset(4,2)です。

1~100を基に「いくつ右側か」「いくつ下か(ゼロ含む)」を求めれば出来ますね?
(二次元だから添え字がふたつですよ)


Range("A1").Offset(列オフセット,行オフセット) = Range("A" & セル位置)
をループさせる。(セル位置を1~100と変化させる)

列オフセットと行オフセットは計算で求める。
列オフセット = (セル位置 - 1) mod 5 で 0~4が得られる。
行オフセット = ((セル位置 - 1) \ 5) + 1 で 1~20が得られる。

試験してないので間違った箇所があるかも。
コードはご自身で研究しながら記述してくださいね。
    • good
    • 0

Sub test()


  Dim i As Long, j As Long
  Dim v, vv

  With Worksheets("Sheet1") 'データのあるシート
       v = .Range(.Range("A1"), .Cells(Rows.Count, 1).End(xlUp)).Value
       ReDim vv(1 To 5, 1 To UBound(v, 1) / 5)
       For i = 1 To UBound(v, 1) / 5
           For j = 1 To 5
               vv(j, i) = v((i - 1) * 5 + j, 1)
           Next
       Next
       .Range("B1").Resize(UBound(vv, 1), UBound(vv, 2)).Value = vv
  End With
End Sub
こうゆう事ですか?
    • good
    • 0

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

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

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング