• ベストアンサー

複数の配列変数を1つの配列変数に合成する方法

個別のファイル、シートから DATA***=Range("A1:A50000").Value (***は001~100) で読込んだ100個の50000×1の配列データを、1個の50000×100の配列変数へ簡単に合成する方法は無いでしょうか? 今後のデータ量増加も考慮して、出来るだけfor-nextで処理したくありません。 宜しくお願いします。

  • cokun
  • お礼率75% (22/29)

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

  • ベストアンサー
  • pulsa
  • ベストアンサー率57% (34/59)
回答No.4

ジャグ配列と言う物があります 簡単に言うと配列を配列に入れることです Varant型がなんでも入るを事利用します   Dim Data   Dim MergeData      Data = Range("A1:A50000").Value   Call Myjag(MergeData, Data)   MsgBox MergeData(0)(1, 1) Sub Myjag(MergeData, Data)   If IsArray(MergeData) = False Then'MergeDataが配列かどうか     ReDim MergeData(0)   Else     ReDim Preserve MergeData(UBound(MergeData) + 1)   End If   MergeData(UBound(MergeData)) = Data End Sub ただ、メモリを相当食うと思うので、100個入るかわかりません

cokun
質問者

お礼

ご回答、ありがとうございます。 また、お礼が遅くなり、申し訳ありません。 こういう機能が知りたかったです。     ReDim Preserve MergeData(UBound(MergeData) + 1) の部分がエラーで引っかかっていますが、何とか自分で調べて みたいと思います。 聞かなければ分からない機能でしたので、助かりました。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

難しいことを考えておられるようですが Sub test03() Dim d(10) For i = 1 To 3 d(i) = Sheets(i).Range("a1:A5") Next i Sheets(4).Select For i = 1 To 3 Sheets(4).Range(Cells(1, i), Cells(5, i)) = d(i) Next i s = Sheets(4).Range(Cells(1, 1), Cells(5, 5)) Sheets(1).Range("h1:l5") = s End Sub のようなことでしょうか。見当違いならすみません。 他言語ではarray_mergeなどのことが載っていたが、VBではダメだし >配列を100個の50000×1の配列データを、1個の50000×100の配列変数へ」ロジックを組んで、プログラムでやるよりほか無いと思いました。メモリ上での処理なので早いのではないかと思いますが。

cokun
質問者

お礼

ご回答、ありがとうございます。 For i = 1 To 3 Sheets(4).Range(Cells(1, i), Cells(5, i)) = d(i) Next i 最初にこの処理を思いついたのですが、シートへの書込み時間と 今は100列だけですが、256列以上になったらどうしよう? と思って、別の方法探し始めたのが、この質問を出した理由です。 s(Range(Cells(1, i), Cells(5, i)))= d(i) *d(i)は1列×n行の配列変数 みたいな事が出来ないかなぁ。 と思ってたのですが、無理みたいですね。 説明不足でスミマセン。 どうもありがとうございます。

  • r_pasocom
  • ベストアンサー率40% (12/30)
回答No.2

ArrayのVariantで合成するのはちょっとできなさそうです。 ただ、全要素をループで処理せずに、隠しシート等で50000x100のRangeオブジェクトを作って、Rangeオブジェクトとして合成するとかはできるでしょう。 あとは50000x100の配列にするのをあきらめて、コレクション等にして処理を変えるか。

cokun
質問者

お礼

早々のご回答、ありがとうございます。 こんなに早く、いくつも回答を頂けるとは思ってもいませんでした。 1つの配列にまとめた後、TRANSPOSE処理も考えているので、 配列を諦めるのは難しいです。 全要素の(メモリ内の)ループ処理と、100個の列データの書込み処理 での時間を計ってみて、早い方で進めようと思います。 ありがとうございました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

>(***は001~100) 100列ということですか? 最初から100列分のデータを取れば良いのでは? DATA = Range("A1:CV50000").Value 既にある配列を「簡単に合成する方法」はありません。 何らかの手続きが必要です。どの程度を「簡単」と言う かは分かりませんが・・・

cokun
質問者

お礼

早々のご回答、ありがとうございます。 そうですか・・・方法は無いですか。 元のデータが複数のファイルやシートに列毎に分散しているので、 「ご回答の様に一旦一箇所に集めてから、まとめて読込み」も 考えてみたのですが、書込み処理が入ると途端に処理が遅くなるので、 躊躇していました。 一括での値の受渡しは出来るので、特定の列にだけ値を受け渡す様な 簡単な方法が無いかと思っていたのですが、無理なら先の方法で 進めてみます。 ありがとうございました。

関連するQ&A

  • Excelのセルから配列変数への一括読込み

    VB(というかプログラミング)の超初心者です。 Excelシートの任意の領域にある数値を、配列変数に一括して 入力したいと思っています。 これまで、 Dim XXX(10) As Variant For I = 1 To 10 XXX(I - 1) = Cells(1, I).Value Next I Range(Cells(10, 1), Cells(10, 10)).Value = XXX の様な感じで処理していましたが(最近まで、セルへの書込みも For-Nextで処理していました)、データ数が多くなると処理に 時間がかかってしまいます。 配列YYYへの読込みもセルへの書込みの様に一括して行うには どうすれば良いでしょうか? よろしくお願いします。

  • VBAの配列の格納について

    エクセルのVBAで、セルのデータを配列に格納するスピードを向上したいと思います。 例えば、A1~A10000のセルにデータを書き出す場合、 For 行番号 = 1 To 10000 Cells(行番号, 1).Value = 1 Next よりも、一旦、配列に書き込んだ後、一気にセルに書き込んだ方法が早いのですが、 For 行番号 = 1 To 10000 HAIRETU(行番号, 1) = 1 Next Range("A1:A10000").Value = HAIRETU() 今度は、A1~A10000に書き込んだデータを、再度、配列に格納する場合、 For 行番号 = 1 To 10000 HAIRETU(行番号, 1) = Cells(行番号, 1).Value Next とすると時間がかかるので、 HAIRETU() = Range("A1:A10000").Value というような処理をしたいのですが、うまくいきません。 よい方法がありましたら、ご教授ください。 よろしくお願いします。

  • 繰り返しのマクロで変数について

    Sheets("東京").Select Dim i x = Sheets("東京").Range("X1").Value For i = 1 To x 処理内容です Next i Sheets("千葉").Select Dim j x = Sheets("千葉").Range("X1").Value For j = 1 To x 処理内容です Next j このようなマクロを作っています 作業対象シートが複数ありまして (この例で言うと「東京」シートと 「千葉」シート) それらのシートに対してのマクロを まとめて記述したいのですが 同一マクロでは変数が同じものは使えないため わざわざ変数を複数使っています 「i.j」のように。 今後作業対象シートが増えていくたびに どんどんマクロが長くなっていくので うまく記述する方法はありませんでしょうか? 「処理内容です」の部分は まったく同じ内容です (変数以外) 宜しくお願い致します

  • ExcelVBAでの配列処理について

    処理速度向上を目的に配列を利用したいのですが、結果の書きだし処理で悩んでいます。 Dim aa(10000,2) as Double for i = 1 to 10000 for j = 1 to 2 aa(i,j)=Rnd() next j next i 上記の処理で、10000行と2列の乱数表データが配列として出来、そのデータをシートに書き出しするときに、列を2つほど飛ばして書き出したいのですが、どうすればよいのでしょうか? range("A1:B10000") = aa  という連続した列ではなく、A列に1万行、D列に1万行書き出したいと思っています。 処理速度を向上させたいので、またFor分処理するのではなく、一気に書き出したいと思っています。 ご教授のほどよろしくお願い申し上げます。

  • VBAの配列について

    初めまして、VBAの配列の入力方法について質問させてください。 大量のデータの処理を高速化するため、配列を使用して以下のVBAを入力しました。 インターネットで調べ、見よう見まねで入力してみたものです…(T_T) 内容は、シート「資料」のC列とシート「Sheet1」のG列の文字列が同じ かつ、シート「資料」のL列から最終列(そのときによって変化します) とシート「Sheet1」のE列の文字列が同じ場合、 シート「資料」のA列~D列及びL列から最終列で文字列の一致したセルを 着色するというものです。 変数「アイス」と「チョコ」にそれぞれシート「資料」のデータと シート「Sheet1」のデータを格納したつもりなのですが、 実行したところ「配列がありません。」というエラーメッセージが 表示されました。 どうやらデータを配列として格納できていないときに表示される エラーメッセージのようなのですが、変数の型を変更してみたり、 配列をアイス(2)にしてみたりと、色々方法を変えて試してみたものの、 処理は成功しませんでした(T_T) 一体何が原因で処理が成功しないのか、どなたかご教授いただけると とても嬉しいです…!よろしくお願いいたします。 ちなみに、配列を使用しない場合の処理は、時間が15分ほどと かなりかかりますが、成功しています。 Application.ScreenUpdating = True Dim アイス, チョコ As Long Dim i As Integer, j As Integer, k As Integer アイス = Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row チョコ = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row For i = 3 To Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row For j = 12 To Sheets("資料").Cells(i, 12).End(xlToRight).Column For k = 2 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If アイス(i, 3).Value = チョコ(k, 7).Value And アイス(i, j).Value = チョコ(k, 5).Value Then Sheets("資料").Range("A" & i & ":D" & i).Interior.ColorIndex = 22 アイス(i, j).Interior.ColorIndex = 22 End If Next k Next j Next i

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • 配列変数に格納したデータを計算する方法はありますか?

     簡単な例ですが、例えばB列にあるデータの平均値を求めるときに以下のようにしています。 sub 平均計算()   Dim X(1 To 1000, 1 To 1) As Variant, i as Integer   For i = 10 To 1000     X(i, 1) = WorksheetFunction.Average _          (Range(Cells(i - 9, 2), Cells(i, 2)))   Next   Range(Cells(1, 1), Cells(1000, 1)) = X End Sub  ここで処理速度改善のため、B列のデータを別の配列変数Yに格納してから平均値を求めるというようなことをしたいのですが、そんなことは可能でしょうか?イメージとしてはこんな感じです。   Y = Range(Cells(1, 2), Cells(1000, 2))   for i = 1 to 1000     X(i, 1) = WorksheetFunction.Average _          (Range(Y(i - 9, 2), Y(i, 2)))   Next  当然これはエラーになってしまいますが、このようなことを可能にする方法があれば、どなたか教えてください!よろしくお願いします。

  • 配列データのソートについて

    配列データのソートについて 配列データAAA(1000,10)があるとします。 このデータを5番目のデータにて降順にソートしたいと考えています。 現在、次の方法にて実施していますが、効率が悪いようなので、効率の良い方法を教えて下さい。 Sheets("荷捌場").Select Range(Cells(1, 1), Cells(1000, 10))="" For A=1 To 1000 For B=1 To 10 Cells(A,B)=AAA(A,B) Next B Next A Range(Cells(1, 1), Cells(1000, 10)).Select Selection.Sort Key1:=Range("E1"), Order1:=xlDescending For A=1 To 1000 For B=1 To 10 BBB(A,B)=Cells(A,B).Value Next B Next A Sheets("ソート後のデータ貼付場").Select For A=1 To 1000 For B=1 To 10 Cells(A,B)=BBB(A,B) Next B Next A

  • 配列変数 インデックス番号の最小値

     特に指定しない場合、配列変数のインデックス番号の最小値は0から始まるはずですが、下記のプロシージャでは、abの最小インデックス番号は1,2次元とも「0」でなく「1」から始まります(ウォッチ式で見ても「1」から始まっています)。 「0」から始まらない理由が分かりません。 ご教授を よろしくお願いいたします。 Public Sub セル参照() ' "A1:B10"のセル範囲のデータを順番にメッセージボックスに表示する。 Dim ab As Variant Dim i As Integer, j As Integer ab = Worksheets("Sheet1").Range("A1:B10").Value For i = 1 To UBound(ab, 1) For j = 1 To UBound(ab, 2) MsgBox ab(i, j) Next j Next i End Sub

  • エクセルVBAで範囲を変数で設定する方法?

    Dim i As Integer For i = 1 to 50 とした場合、 セルであれば Sheets("Sheet2").Cells(i, 2).Value = Sheets("Sheet1").Cells(i, 2) のように変数を使えますが、範囲に使う場合にはどう書けばいいのでしょうか? 例えば、 Sheets("Sheet2").Range("A1:G1").Value = Sheets("Sheet1").Range("A1:G1") のような式で、行数を変数にする場合です。 よろしくお願いします。

専門家に質問してみよう