|
▼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
というコードを書くことができますが・・・・。
こんな情報でよろしいでしょうか?
|
|