Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


73174 / 76738 ←次へ | 前へ→

【8047】Re:Arrayへのデータ追加について
回答  bykin  - 03/9/27(土) 20:36 -

引用なし
パスワード
   こんばんわ。

解決してるんかな?(^^;;

>データ量が多いときの処理速度は圧倒的

これは 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 はんのコードみたいに省略しても構わんのやけど、やっぱし明記したほうが
コードがわかりやすくなると思うよ。わては必ず書くようにしてます。

ほな。
0 hits

【8037】Arrayへのデータ追加について kawata 03/9/27(土) 9:43 質問
【8042】Re:Arrayへのデータ追加について ichinose 03/9/27(土) 17:08 発言
【8044】Re:Arrayへのデータ追加について kawata 03/9/27(土) 17:23 お礼
【8047】Re:Arrayへのデータ追加について bykin 03/9/27(土) 20:36 回答
【8060】Re:Arrayへのデータ追加について kawata 03/9/29(月) 8:31 お礼
【8069】Re:Arrayへのデータ追加について kawata 03/9/29(月) 11:35 お礼

73174 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free