| 
    
     |  | ▼kawata さん: >kawataです、お世話になっております、よろしくお願いします。
 >(Windows2000/Excel2000)
 >
 >ただいま配列勉強中です、多少でも使えるようになると
 >これまでのコードもガラッと変わってしまいます、
 >データ量が多いときの処理速度は圧倒的で、もう元に
 >戻れませんね(少ないデータの時は、使いやすいほうを
 >選択していますけども)。
 >
 >で、質問なんですが、
 >
 >  With Sheets("sheet1")
 >    myArray = .Range("a1:a10")
 >    .Range("b1").Resize(, UBound(myArray)) = Application.Transpose(myArray)
 >  End With
 >
 >セルA1〜A10の値を、B1から横に書き出すものなんですが、
 >このA1〜A10のデータをループさせて、条件の合うものだけ
 >Array配列に追加していきたいと考えているのですが、
 >このArray配列への継ぎ足しの記述がわかりません。
 >
 >  myArray() = myArray() + a ← やりたいことのイメージです(^^;。
 >
 >ぜひ、よろしくお願いします。
 例にあげられたような仕様なら(セルA1〜A10の範囲で条件に合った値をセルB1から右方向に移すのに配列変数を問屋さんにする)、
 仮にA1:A10には、1〜10が入っていたとしましょう。
 例は、値が5から7のデータをB1から横に並べるものです。
 ‘======================================================
 Sub test()
 Dim myarray()
 jdx = 1
 For idx = 1 To 10
 With Cells(idx, 1)
 If .Value >= 5 And .Value <= 7 Then
 ReDim Preserve myarray(1 To jdx)
 myarray(jdx) = .Value
 jdx = jdx + 1
 End If
 End With
 Next idx
 If UBound(myarray()) > 0 Then
 Range("b1").Resize(, UBound(myarray())).Value = myarray()
 End If
 End Sub
 
 なんて方法で可能ですが、
 見ればおわかりかと思いますが、
 上記のコードの配列は、1次元配列です。
 
 >    myArray = .Range("a1:a10")
 
 の配列とは次元が違ってしまいます。
 
 RedimステートメントのHELPの引用
 「Preserve   省略可能です。既存の配列に格納されている値を失うことなく、配列の最後の次元の要素数を変更する場合に使用する、キーワードです。」
 のとおり、Preserve使用のmyarray(x,y)のxの要素数の変更は、無理なようです。
 
 最初に条件に合ったセルの数がわかっていれば
 ‘=======================================================
 Sub samp()
 'これは、条件にあったセルをB列に移す
 Dim myarray()
 jdx = 1
 With Range("a1:a10")
 cnt = Application.Evaluate( _
 "=SumProduct((a1:a10 >= 5) * (a1:a10 <= 7))")
 End With
 If cnt > 1 Then
 ReDim myarray(1 To cnt, 1 To 1)
 jdx = 1
 For idx = 1 To 10
 With Cells(idx, 1)
 If .Value >= 5 And .Value <= 7 Then
 myarray(jdx, 1) = .Value
 jdx = jdx + 1
 End If
 End With
 Next idx
 Range("b1").Resize(UBound(myarray())).Value = myarray()
 End If
 
 End Sub
 
 というコードを書くことができますが・・・・。
 こんな情報でよろしいでしょうか?
 
 |  |