- ベストアンサー
配列の値を保持しながら要素を追加する方法は?
- 配列の値を保持しながら要素を追加する方法についてご質問です。
- 通信データを処理するプログラムを作成している際に、配列に値を追加する方法についてお悩みです。
- また、配列の最後の2つの要素を保持しながら、次に来たデータを配列に追加する方法についてもお教えいただきたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
すみません、#3 の >(1) r = 0 の処理 >(2) r = 1 の処理 >(3) For r = 2 To UBound(strData1) - 2 は間違いです。 (1) 保存した strData1(n-2) の計算 (2) 保存した strData1(n-1) の計算 (3) For r = 0 To UBound(strData1) - 2 ということです。 つまり、 Private Sub Pool(ByVal strData As String) Dim strData1() As String Dim i As Integer Dim n As Integer Static vPrev1 As Variant Static vPrev2 As Variant strData1 = Split(strData, vbCr) If Not IsNull(vPrev1) Then vPrev1 = vPrev1 + vPrev2 + strData1(0) vPrev2 = vPrev2 + strData1(0) + strData1(1) End If For i = 0 To UBound(strData1) - 2 strData1(i) = strData1(i) + strData1(i + 1) + strData1(i + 2) Next i n = UBound(strData1) vPrev1 = strData1(n - 1) vPrev2 = strData1(n) End Sub のような感じです。 初期化されていない Variant は IsNull(v) = True になるのかどうかは、ちょっと自信なしです。
その他の回答 (3)
- tsukasa-12r
- ベストアンサー率65% (358/549)
1回目のstrData → strData1(0),strData1(1),strData1(2) 2回目のstrData → strData1(3),strData1(4),strData1(5),strData1(6) ... N回目のstrData → strData1(r),strData1(r+1),strData1(r+2),...,strData1(n) これら、strData1(0) ~ strData1(n) に対して For i = 0 To UBound(strData1) - 2 strData1(i) = strData1(i) + strData1(i+1) + strData1(i+2) Next i を計算したい、ということですね? やり方としては、strData が全て送られてくるまでためておいて、最後にまとめて処理するのが簡単だとは思いますけど。 ↓こんな感じで・・・。 Private strData1() As String Private Sub Form_Load() ReDim strData1(0) End Sub 'strData を CR で分割して strData1 に蓄積する。 '注意:strData1(1) から埋められていきます。 Private Sub Pool(ByVal strData As String) Dim strTemp() As String Dim iStart As Integer Dim i As Integer iStart = UBound(strData1) + 1 strTemp = Split(strData, vbCr) ReDim Preserve strData1(iStart + UBound(strTemp)) For i = 0 To UBound(strTemp) strData1(iStart + i) = strTemp(i) Next i End Sub 送られてくるデータの数が非常に多いとか、通信処理のタイミングの関係で、全て溜めてから処理することができないのであれば、 strData1(UBound(strData1)-2)、strData1(UBound(strData1)-1) をモジュール変数か Static 変数に保存しておいて、 For r = 0 To UBound(strData1) - 2 を (1) r = 0 の処理 (2) r = 1 の処理 (3) For r = 2 To UBound(strData1) - 2 に三つに分割するくらいしかないと思います。
- tsukasa-12r
- ベストアンサー率65% (358/549)
すみません、やりたいことがもう一つはっきりわからないので質問させてください。 >変数strDataにCR区切りのデータがいくつか(個数はそのつど変わります)文字列として入って送られてきて、 >それを配列strData1()に入れて ここまではわかるのですが、 >strData1(r)=strData1(r+1)+strData1(r+2)+strData1(r+3) のところがよくわかりません。 要は、strData1(0)+strData1(1)+...+strData1(n) を計算したいということなのでしょうか? それでしたら Dim v As Variable v = 0 For i = 0 To UBound(strData1) v = v + strData1(i) Next i のような感じで計算できると思うのですが、やっぱりそういうことではないのでしょうね・・・。
補足
すいません、確かに判りづらいですね。 要はフィルタとしてn個(質問では3個にしましたが)の加算平均をやりたいのですが、 送られてくるデータが一度に1~30個位のバラバラなデータなので、 送られてきたデータのみでn個の加算平均をすると、データの後ろからn個部分の配列は捨てなくてはなりませんよね。 そのためうまくいっていないようで、 それを防ぐために捨てる部分が無視できるくらいためてから計算するのがよいのかなと思ってますが、 こんな方法のほうがもっといいんじゃないか、というのがあれば、宜しければ教えてください
- todo36
- ベストアンサー率58% (728/1234)
ReDim Preserve
補足
これを使えという意味ですか? 値が100こになるまでデータを配列にいれるつもりで Do strData1 = split(strData , Vbcr) ReDim preserve strData1(UBound(strData1)) Loop Until UBound(strData1)>100 としたんですが、当たり前ですがフリーズしました。 もうひとつ配列を作ってそこに足しこんでいくほうがいいんですかね
お礼
モジュール変数にして試したところ、うまくいきました。 ありがとうございました!