
通信データを処理するプログラムを作っています
変数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文が終わるとまたすぐに一行目を実行して上書きされてしまうようで、うまい方法がわかりません。
なにかヒントになりそうな考え方だけでもいいので、ご助言お願いします。
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 になるのかどうかは、ちょっと自信なしです。
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
のような感じで計算できると思うのですが、やっぱりそういうことではないのでしょうね・・・。
この回答への補足
すいません、確かに判りづらいですね。
要はフィルタとしてn個(質問では3個にしましたが)の加算平均をやりたいのですが、
送られてくるデータが一度に1~30個位のバラバラなデータなので、
送られてきたデータのみでn個の加算平均をすると、データの後ろからn個部分の配列は捨てなくてはなりませんよね。
そのためうまくいっていないようで、
それを防ぐために捨てる部分が無視できるくらいためてから計算するのがよいのかなと思ってますが、
こんな方法のほうがもっといいんじゃないか、というのがあれば、宜しければ教えてください
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
あああ..ああい..ああう とい...
-
エクセルで選択したセルがディ...
-
【マクロ】実行時エラー '424':...
-
Worksheets メソッドは失敗しま...
-
エクセルで離れた列を選択して...
-
B列の最終行までA列をオート...
-
VBA 空白行に転記する
-
「段」と「行」の違いがよくわ...
-
エクセルで複数のシートのクリ...
-
Excel UserForm の表示位置
-
マクロの「SaveAs」でエラーが...
-
列方向、行方向の定義
-
別ブックをダイアログボックス...
-
特定の色のついたセルを削除
-
Cellsのかっこの中はどっちが行...
-
Excelで、あるセルの値に応じて...
-
Excelのフィルター後の一番上の...
-
vba 2つの条件が一致したら...
-
エクセルで特定の文字列が入っ...
-
エクセル 上下で列幅を変えるには
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
あああ..ああい..ああう とい...
-
VBAにて『元に戻すボタン』を作...
-
select caseの入れ子
-
エクセルで選択したセルがディ...
-
配列の値を保持しながら要素を...
-
プログラムの記述方法について
-
VBAバーコード照合 バーコード...
-
VBAにて文字列の長さを取得...
-
1つのテーブルに重複している列...
-
VBAについて
-
vbs 文字位置を中央に
-
エクセルVBAのプログラム
-
VBA コード エラー対処
-
最大値が0b100である3bit同士の...
-
xlookup関数の引数を利用して検...
-
すべての組合せをシートに出力...
-
targetでクリックしたら○
-
アセンブラでの記述について教...
-
エクセルで簡単なオートシェイ...
-
指数関数近似を行うプログラム...
おすすめ情報