通信データを処理するプログラムを作っています
変数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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
あああ..ああい..ああう とい...
-
select caseの入れ子
-
マクロの「SaveAs」でエラーが...
-
B列の最終行までA列をオート...
-
ワイルドカード「*」を使うとう...
-
エクセルで離れた列を選択して...
-
VBAマクロ実行時エラーの修正に...
-
「段」と「行」の違いがよくわ...
-
vbaで指定したセルより下の行を...
-
Excelで数字を入れたら対応する...
-
Worksheets メソッドは失敗しま...
-
エクセルで特定の文字列が入っ...
-
Excelで、あるセルの値に応じて...
-
VLOOKUPの列番号の最大は?
-
VBA シートをコピーする際に Co...
-
エクセルVBAが途中で止まります
-
Excel VBAでのWorksheet_Change...
-
マクロ実行後に別シートの残像...
-
エクセルのソートで、数字より...
-
vba 2つの条件が一致したら...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
あああ..ああい..ああう とい...
-
VBAにて『元に戻すボタン』を作...
-
VBAバーコード照合 バーコード...
-
select caseの入れ子
-
vbs 文字位置を中央に
-
エクセルで選択したセルがディ...
-
VBAマクロにての絶対値
-
指数関数近似を行うプログラム...
-
vb 配列の再検索について
-
アセンブラでの記述について教...
-
エクセル インデックスを用い...
-
スペース区切りのAND検索
-
VBAにて文字列の長さを取得...
-
半透明ブラシ重ね塗りのアルゴ...
-
Application.FileDialogを利用...
-
xlookup関数の引数を利用して検...
-
エクセルVBAのプログラム
-
B列の最終行までA列をオート...
-
VBAマクロ実行時エラーの修正に...
-
VBA シートをコピーする際に Co...
おすすめ情報