• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列の値を保持しながら要素を追加するには)

配列の値を保持しながら要素を追加する方法は?

このQ&Aのポイント
  • 配列の値を保持しながら要素を追加する方法についてご質問です。
  • 通信データを処理するプログラムを作成している際に、配列に値を追加する方法についてお悩みです。
  • また、配列の最後の2つの要素を保持しながら、次に来たデータを配列に追加する方法についてもお教えいただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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 になるのかどうかは、ちょっと自信なしです。

chr02
質問者

お礼

モジュール変数にして試したところ、うまくいきました。 ありがとうございました!

その他の回答 (3)

回答No.3

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 に三つに分割するくらいしかないと思います。

回答No.2

すみません、やりたいことがもう一つはっきりわからないので質問させてください。 >変数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 のような感じで計算できると思うのですが、やっぱりそういうことではないのでしょうね・・・。

chr02
質問者

補足

すいません、確かに判りづらいですね。 要はフィルタとしてn個(質問では3個にしましたが)の加算平均をやりたいのですが、 送られてくるデータが一度に1~30個位のバラバラなデータなので、 送られてきたデータのみでn個の加算平均をすると、データの後ろからn個部分の配列は捨てなくてはなりませんよね。 そのためうまくいっていないようで、 それを防ぐために捨てる部分が無視できるくらいためてから計算するのがよいのかなと思ってますが、 こんな方法のほうがもっといいんじゃないか、というのがあれば、宜しければ教えてください

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

ReDim Preserve

chr02
質問者

補足

これを使えという意味ですか? 値が100こになるまでデータを配列にいれるつもりで Do strData1 = split(strData , Vbcr) ReDim preserve strData1(UBound(strData1)) Loop Until UBound(strData1)>100 としたんですが、当たり前ですがフリーズしました。 もうひとつ配列を作ってそこに足しこんでいくほうがいいんですかね

関連するQ&A