• 締切済み

VBAの一次元配列から二次元配列へ

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

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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 とした場合の違いを確認してみてください

siorichan_
質問者

お礼

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

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

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 といった具合です

siorichan_
質問者

お礼

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

siorichan_
質問者

補足

分かり易い回答ありがとうございます。 試した所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)
回答No.2

なんだか、課題っぽいけど。 セル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)
回答No.1

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 こうゆう事ですか?

関連するQ&A

  • 配列の並び替え

    下のように5つの配列がA~E列まであって、2、3行目にデータが入っています。このときに、2行目の値が3行目の値より小さい配列で、かつ、2行目の値が小さい順に並べる。その後に、3行目より、2行目の値の方が大きい配列を3行目の値が大きい順に並べるマクロコードを教えてください。   A B C D E←列      1  1 2 3 4 5←配列番号 2  4 9 8 6 2 3  1 5 7 10 3      ↑ 行    ↓     A B C D E 1  5 4 3 2 1 2  2 6 8 9 4 3  3 10 7 5 1

  • VBAで2次元配列を使ってセル検索がしたいです。

    VBAを使って開発をしています。 セル検索なのですが、検索範囲のセルに対し、 C言語のような配列を作って格納してまず1列検索し、 対象が見つかったらアクションを起こして、 次の行へ移ってまた検索…を繰り返すということが したいです。 しかし範囲指定でRangeを使う場合、 "A1:A12"と指定しなければならないようで、 これでは固定入力になってしまい、"A1:A12"の次に "B1:B12"、"C1:C12"…と検索を続けられなさそうです。 なにかいい方法はないものでしょうか?

  • VBAのプログラムに関してです

    VBAに関する質問です。 いま、A列に0~4の数字が順番に繰り返し記入されていて(数字の数はランダム)、B列に適当な値が記入されています。A列の中から1を探しだして(1つ上の行の数字が0)、 その行から1つ戻ったB列の値をC列に記入、A列の次の0~4の繰り返しで同じ条件の1を探してその行から2つ戻ったB列の値をD列に記入する。といったことをA列が空白の行になるまで繰り返し行うというプログラムを教えてほしいです。お願いします。 例) A:00011112233400001123334400011111122233400000- B:12345678912345678912345678912345678912345678- となってるA列のそれぞれの0~4の塊の最初の1をさがしてそれに対応するBをそぜぞれ求めていくというものです。 この場合だと実行結果C・D列には C:379 D:688 となってほしいです。

  • VBA特定セルの条件で同じ個数ずつ文字入力

    Excel VBAの初心者です。    A   B   C 1  011       0.5 2  012 3  013 4 行の総数は下に向かって700行くらいありますが、64行ごとにひとかたまりであることが分かって いるデータがあります。隙間はありません。またB列は空白です。 このB列にC1の数値を元に64行ごとに一定のステップで数値入力できるコードを作りたく思って います。例として、B列はB1から0,0~と同じ数字が縦に64個つながり、B65からは0.5,0.5~と縦に 同じ数字が64個つながり、A列がなくなるまで繰り返し自動で入力したいのです。 何分初めてなものでよく分かりません。どなたかサンプルコードを教えて頂けないでしょうか。 よろしくお願いします。

  • EXCEL マクロ・VBA 自動で連番を振る

    EXCELのマクロ・VBAについて質問です。 例えば、B列にデータを入力すると、入力した行まで自動的にA列に連番が入力されるようにしたいのですが、どういった方法があるでしょうか。 マクロやVBAについてはこれから勉強をしようと思っている素人ですので、コードとその解説をいただけると助かります。

  • VBA(マクロ)について

    エクセルのマクロを使って下記のように実行を考えています。 A列のコード番号が一定ではないため、処理に困っています。 どなたかアドバイス頂けないでしょうか。 詳細についてです。A列にコード番号があり、B列に数値があります。 例えば、A列の1~3行目まで100とあり、4~5行目まで400と1~3行目と4~5行目の数値はおなじです。3行分だったり2行分だったりと不規則に下に続いていきます。 そのA列の同じコード番号全てに対して、B列の値を合計してC列に合計値を入力したいのです。 C列の合計値入力箇所は、A列の1~3行目までだとするとC列1行目に合計値がくるようにしたいのです。 ちなみに行数は10万桁ほどあります。

  • 多次元配列のソート

    過去に同様の質問があったのですが、未回答でしたので質問させていただきます。 多次元配列のうちの一つの列の値でソートし、その他の列にも結果を連動させたいのですが方法が分かりません。 たとえば、a[n][m]という配列で a[0][0]=C a[0][1]=う         a[0][0]=A a[0][1]=あ a[1][0]=A a[1][1]=あ   →    a[1][0]=B a[1][1]=い a[2][0]=B a[2][1]=い         a[2][0]=C a[2][1]=う というように、n列でソートしm列でもその結果で並べ替えたいです。 恐らくComparatorインタフェースを使用すると可能かと思うのですが、方法を教えて頂けないでしょうか。

    • ベストアンサー
    • Java
  • 多次元配列の扱い方

    PHPバージョン5.2.4を使っています。 次のような文字列が入っている多次元配列を foreachなどのループを使ってその値を取り出して扱いたいのですが、 取り出した値には配列(二次元以降の値)も含まれてるので 簡単には取り扱いできません・・・ print_rやvar_dumpを使えば値は全て表示されるのですが、 あくまで表示ではなくて値を取り扱いたいのです。 そのようなことができる関数などはあるのでしょうか? $arr[0][0] = 'a'; $arr[0][1] = 'b'; $arr[1] = 'c'; $arr[2][0][0][0] = 'd'; $arr[2][0][0][1] = 'e'; foreach ($arr as $value) { $value//←ここで値を扱いたいけど、配列も含まれてるので・・・ }

    • 締切済み
    • PHP
  • VBAの配列について

    VBAの配列について質問があります。 以下のような配列Aと配列Bがあったとします。 やりたいことは、配列Cを作成して、配列Aと配列Bを結合したいです。 ----------------------------------------- Dim 配列A(3) 配列A(0) = 10 配列A(1) = 11 配列A(2) = 12 Dim 配列B(3) 配列B(0) = 100 配列B(1) = 110 配列B(2) = 120 ---------------------------------------- Dim 配列C(6) 配列A(0) = 10 配列A(1) = 11 配列A(2) = 12 配列A(3) = 100 配列A(4) = 110 配列A(5) = 120 ---------------------------------------- 配列Cを作るために、配列Aを拡張して、配列Bを挿入すれば可能 でありますが、関数のようなもので簡単に表現できないもので しょうか? 何かご存知でしたが、ご教授願います。

  • 二次元配列が、勝手に一次元配列になってしまう

    Excelのマクロで、二次元配列を格納したバリアント型を戻り値とする関数を作ったのですが、… 二次元型配列のひとつの要素数が1の時、受け取ったバリアント型変数は、一次元配列になっています。 列ベクトルなら、それもありかな~と思うのですが、なんで、行ベクトルまで、一次元配列にするんだよ~って、困っています。 シートから関数を呼んだ場合は、列ベクトルは列ベクトル、行ベクトルは行ベクトルとして、表示されるので、マクロの中で関数を呼び出した場合も、行列の情報を保持できる方法があるんじゃないかと思ったのですが。 どなたか、ご教示頂けるとありがたいです。 よろしくお願いします。

専門家に質問してみよう