- ベストアンサー
複数の配列変数を1つの配列変数に合成する方法
個別のファイル、シートから DATA***=Range("A1:A50000").Value (***は001~100) で読込んだ100個の50000×1の配列データを、1個の50000×100の配列変数へ簡単に合成する方法は無いでしょうか? 今後のデータ量増加も考慮して、出来るだけfor-nextで処理したくありません。 宜しくお願いします。
- みんなの回答 (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個入るかわかりません
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
難しいことを考えておられるようですが 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の配列変数へ」ロジックを組んで、プログラムでやるよりほか無いと思いました。メモリ上での処理なので早いのではないかと思いますが。
お礼
ご回答、ありがとうございます。 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)
ArrayのVariantで合成するのはちょっとできなさそうです。 ただ、全要素をループで処理せずに、隠しシート等で50000x100のRangeオブジェクトを作って、Rangeオブジェクトとして合成するとかはできるでしょう。 あとは50000x100の配列にするのをあきらめて、コレクション等にして処理を変えるか。
お礼
早々のご回答、ありがとうございます。 こんなに早く、いくつも回答を頂けるとは思ってもいませんでした。 1つの配列にまとめた後、TRANSPOSE処理も考えているので、 配列を諦めるのは難しいです。 全要素の(メモリ内の)ループ処理と、100個の列データの書込み処理 での時間を計ってみて、早い方で進めようと思います。 ありがとうございました。
- nda23
- ベストアンサー率54% (777/1415)
>(***は001~100) 100列ということですか? 最初から100列分のデータを取れば良いのでは? DATA = Range("A1:CV50000").Value 既にある配列を「簡単に合成する方法」はありません。 何らかの手続きが必要です。どの程度を「簡単」と言う かは分かりませんが・・・
お礼
早々のご回答、ありがとうございます。 そうですか・・・方法は無いですか。 元のデータが複数のファイルやシートに列毎に分散しているので、 「ご回答の様に一旦一箇所に集めてから、まとめて読込み」も 考えてみたのですが、書込み処理が入ると途端に処理が遅くなるので、 躊躇していました。 一括での値の受渡しは出来るので、特定の列にだけ値を受け渡す様な 簡単な方法が無いかと思っていたのですが、無理なら先の方法で 進めてみます。 ありがとうございました。
お礼
ご回答、ありがとうございます。 また、お礼が遅くなり、申し訳ありません。 こういう機能が知りたかったです。 ReDim Preserve MergeData(UBound(MergeData) + 1) の部分がエラーで引っかかっていますが、何とか自分で調べて みたいと思います。 聞かなければ分からない機能でしたので、助かりました。