通信データを処理するプログラムを作っています
変数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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAバーコード照合 バーコード...
-
あああ..ああい..ああう とい...
-
エクセルで選択したセルがディ...
-
select caseの入れ子
-
再帰構造のアルゴリズムで困っ...
-
vbs 文字位置を中央に
-
VBAにて『元に戻すボタン』を作...
-
Worksheets メソッドは失敗しま...
-
VBAマクロ実行時エラーの修正に...
-
「段」と「行」の違いがよくわ...
-
エクセルで特定の文字列が入っ...
-
Excel グラフのプロットからデ...
-
B列の最終行までA列をオート...
-
列方向、行方向の定義
-
Excelで、あるセルの値に応じて...
-
エクセル マクロ オートフィ...
-
Excel VBAでのWorksheet_Change...
-
VBA 空白行に転記する
-
エクセル マクロで数値が変っ...
-
マクロの「SaveAs」でエラーが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
あああ..ああい..ああう とい...
-
VBAにて『元に戻すボタン』を作...
-
select caseの入れ子
-
vbs 文字位置を中央に
-
VBAバーコード照合 バーコード...
-
エクセルで選択したセルがディ...
-
スペース区切りのAND検索
-
マクロにてセルに文字表示
-
日付の年の確認方法について A1...
-
最大値が0b100である3bit同士の...
-
半透明ブラシ重ね塗りのアルゴ...
-
エクセルVBAのプログラム
-
セルに入ってる数式を他のセル...
-
再帰構造のアルゴリズムで困っ...
-
指数関数近似を行うプログラム...
-
C++で、b[bit]の非負整数(例え...
-
ある一定時間の最高値と最小値...
-
VBAの変数をエクセルで表示
-
VBAマクロ実行時エラーの修正に...
-
B列の最終行までA列をオート...
おすすめ情報