|
こんばんわ。
解決してるんかな?(^^;;
>データ量が多いときの処理速度は圧倒的
これは Value プロパティでセルの値を読み書きするのが遅いってこと。
せやから速度重視にするんやったら、セルの読み書きは
最初と最後だけにするってのがコツです。
途中のコードの中(ループの中は特に)には Value プロパティを書かんほうが
ええってことです。
ループは変数の世界だけでやったほうが速いです。
例えばA1:A10に数値が入ってて、そのうちの5以上の値だけを
B1から横にならべるんやったら、こんな感じでっしゃろか?
Sub test()
Dim MyArray As Variant
Dim MyArray2() As Variant
Dim i As Long
Dim j As Long
With Sheets("Sheet1")
MyArray = .Range("A1:A10").Value
j = 1
For i = LBound(MyArray, 1) To UBound(MyArray, 1)
If MyArray(i, 1) >= 5 Then
ReDim Preserve MyArray2(1 To 1, 1 To j)
MyArray2(1, j) = MyArray(i, 1)
j = j + 1
End If
Next
.Range("B1").Resize(, UBound(MyArray2, 2)).Value = MyArray2
End With
End Sub
セルから取得した配列から条件にあったデータを別の配列に取り込んで
最終的にそれをセルに書き込んでます。
セル範囲に対応する配列はたとえ1行または1列であっても2次元配列であるってことに
気ぃつけて、Ubound の第2引数を適切に使えばええんとちゃいまっか?
第2引数の使い方はヘルプで調べてみてな。
ichinose はんもおっしゃってるように ReDim で Preserve が使えるのは最後の次元だけです。
上記例ではたまたま横への展開やったから ReDim Preserve がそのまま使えたけど
縦に展開するんやったら中間処理用の1次元配列を用意して一旦そこに取り込んでから
さらに書き込み用配列にデータを移すといったような処理が必要になります。
(最初から抽出する件数がわかってたらもうちょっと楽でっけど)
あ、それと Value プロパティは Range オブジェクトのデフォルトのプロパティやから
kawata はんのコードみたいに省略しても構わんのやけど、やっぱし明記したほうが
コードがわかりやすくなると思うよ。わては必ず書くようにしてます。
ほな。
|
|