- 締切済み
VBAの一次元配列から二次元配列へ
A列にa1~a100まで数字が入ってます。 それを、b1~b5,c1~c5,…省略 u1~u5までに、データを 5行ずつ移したいのです。 b1にはa1、b2にはa2の値を、u5にはa100の値を入れたいのです。 マクロの自動記録?を使うとできることはできるのですが…。 一次配列→二次配列で、出来ると聞いたことがあるのですが。 ※VBAは全くの初心者です。 コードに説明もつけてくださるとすごく助かります。 どうかよろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
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 とした場合の違いを確認してみてください
- redfox63
- ベストアンサー率71% (1325/1856)
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の二次元配列作って、配列に 数字を入れていく方法もあると聞いたことあるのですが、 さっぱりわかりません。 もし、良ければで結構です。 知っていましたら教えて頂けないでしょうか。 初心者なので、知る必要ないのかも知れませんが、 勉強中の身としては、どうしても気になって仕方ないのです。 本当にお答え下さってありがとうございます。 すごく助かりました。
- bin-chan
- ベストアンサー率33% (1403/4213)
なんだか、課題っぽいけど。 セル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が得られる。 試験してないので間違った箇所があるかも。 コードはご自身で研究しながら記述してくださいね。
- n-jun
- ベストアンサー率33% (959/2873)
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 こうゆう事ですか?
お礼
すばやい回答ありがとうございます。 私には少し難し過ぎました。 何となくわかりそうな気はするのですが…。 時間を見て解析して見たいと思います。 色々な方法があるのですね。 本当にありがとうございました。 すごく参考になりました。