推しミネラルウォーターはありますか?

通信データを処理するプログラムを作っています

変数strDataにCR区切りのデータがいくつか(個数はそのつど変わります)文字列として入って送られてきて、
それを配列strData1()に入れて、たとえば
strData1(r)=strData1(r+1)+strData1(r+2)+strData1(r+3)
のような計算をしようと思っています。

strData1 = Split(strData, vbCr)
For r = 0 To Ubound(strData)-2
strData1(r) = (CDbl(strData1(r)) + CDbl(strData1(r + 1)) + CDbl(strData1(r + 2))
Next r

とすると、配列の最後の2つの要素は何も出てきませんよね。

なので、最後の2つのデータを保持しながら、次に来たstrDataを配列にいれて、For文の計算に戻すことをしたい、
また、strDataが3個以下の場合も考えると、ある一定個数をためてから一気に計算させたほうがいいのかとも思いますが、
For文が終わるとまたすぐに一行目を実行して上書きされてしまうようで、うまい方法がわかりません。

なにかヒントになりそうな考え方だけでもいいので、ご助言お願いします。

A 回答 (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 になるのかどうかは、ちょっと自信なしです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/01/08 14:05

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

すみません、やりたいことがもう一つはっきりわからないので質問させてください。



>変数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個部分の配列は捨てなくてはなりませんよね。
そのためうまくいっていないようで、
それを防ぐために捨てる部分が無視できるくらいためてから計算するのがよいのかなと思ってますが、
こんな方法のほうがもっといいんじゃないか、というのがあれば、宜しければ教えてください

補足日時:2004/01/07 12:32
    • good
    • 0

ReDim Preserve

この回答への補足

これを使えという意味ですか?

値が100こになるまでデータを配列にいれるつもりで
Do
strData1 = split(strData , Vbcr)
ReDim preserve strData1(UBound(strData1))

Loop Until UBound(strData1)>100

としたんですが、当たり前ですがフリーズしました。

もうひとつ配列を作ってそこに足しこんでいくほうがいいんですかね

補足日時:2004/01/06 17:02
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!