@curry_pan (yy kk)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

vbaで自動で打ち込まれるものに続いて計算を行いたい【初心者】

解決したいこと

データロガーを用いて計測を行い、計測データが自動でExcel上に打ち込まれます。
打ち込まれたデータから一定以上の値になったものを判別し、並べるというものを作製しています。
しかし、自動で打ち込まれるものの計算をvbaでどのように行えばよいかわからず質問をさせていただきます。

具体的な説明

図のようにABC列に一行ずつデータロガーで読み込んだものが記入されていきます。
下記のプログラムではすでに書き終わったものでしか、動作することができず読み込みながら計算を行えません。
行っている計算自体はとてもシンプルですので計算時間はそこまで必要しないと考えられます。
サンプリング周期によって空白と判断されているのだと考察していますが、どう解決すればよいか見当もつきません。
vba触りたての初心者ですのでご教授いただければと思います。
image.png

現状作製したソースコード

Option Explicit

Sub test()

    Dim i, j
    Dim samp_time, time_now, time_border  '//時間関連
    Dim over, over_bef, interval  '// 基準よりも上関連
    Dim volt, volt_bef  '//電圧関連
    Dim avr, std, avst  '//平均値+標準偏差
    
    volt_bef = over_bef = 0
    i = 1
    j = 5
    samp_time = Cells(1, 6)
    time_border = 5000
    
    Dim ws As Worksheet
    Set ws = ActiveSheet
    
    
    Cells(1, 5) = "サンプリング周期(ms)"
    Cells(2, 5) = "平均値+標準偏差"
    Cells(4, 5) = "time(ms)"
    Cells(4, 6) = "interval(ms)"
    Cells(4, 7) = "volt(V)"
    
    '//サンプリング周期の計算
    Cells(1, 6) = (Cells(2, 2) - Cells(1, 2)) / 1000
    
    Do
        '// 値の取得
        time_now = (i - 1) * Cells(1, 6) '//計測時間
        volt = Cells(i, 3)  '//電圧
        
        '//取得する値の基準(平均値+標準偏差)
        If time_now = time_border Then
            avr = Application.WorksheetFunction.Average(Range(Cells(1, 3), Cells(i, 3)))
            std = Application.WorksheetFunction.StDev(Range(Cells(1, 3), Cells(i, 3)))
            avst = avr + std
            Cells(2, 6) = avst
        End If
        
        '//基準より上の値を取得
        If time_now > time_border And volt > avst And volt_bef < avst Then
            over = time_now
            interval = over - over_bef
            over_bef = over
            
            '//短すぎるものを除去
            If interval > 400 / samp_time Then
                Cells(j, 5) = time_now
                Cells(j, 7) = volt
                Cells(j, 6) = interval
                
                j = j + 1
            End If
        End If
        
        '//もし空白であればマクロ終了
        If volt = "" Then
            Exit Do
        End If
        
        DoEvents: DoEvents: DoEvents
        i = i + 1
        volt_bef = volt
    
    Loop

End Sub
0 likes

2Answer

ぱっと思いつくのは、タイマーを使うか、ワークシート変更イベントを使うかですね。

追記:
test()プロシージャをどう呼ぶかの問題だと思っているので、その中身は見ていません。

0Like

Comments

  1. @curry_pan

    Questioner

    タイマーを使うというものをもう一度調べてみたいと思います。貴重なご意見ありがとうございます。
  2. Application.OnTime VBA
    Worksheet_Change VBA

    で検索すればよいかと。頑張ってください。

下記のプログラムではすでに書き終わったものでしか、動作することができず読み込みながら計算を行えません。
の意図は?
プログラムはデータロガーの書き込み終了まで待てば計算できる。でしょうか?

A~Cの末行にデータが自動的に追加される その際、自動的にE~G列を計算したい

先ずは、A~C列を5行目から配置しましょう。そして、セルB3あたりにボタンを配置しましょう。

MaxRow = Range("A1").SpecialCells(xlLastCell).Row
for i=5 to MaxRow
  If Cells(i, 7) = "" And Cells(i, 3) <> "" Then
    
       計算

  End If
Next i

このシートを開いた際、ボタンを押して計算した方が良いですよ!読むときは開きますから!

p.s.
Option Explicit を付けるなら
Dim i, j As Long と型も宣言をしましょう。Dim i, j のみではVariant型でDim i, j なしで i,jを用いてもVariant型です。
DoEventsは1個で十分では?loopは初心者は用いないほうが無難です。

'//短すぎるものを除去 せず空欄にして、別シートに転記するさい除外することを推奨します。

0Like

Comments

  1. @curry_pan

    Questioner

    ご返信いただきありがとうございます。

    一つ目の質問に関して
    このプログラムは確かにすべて測定し終わったあとですと十分機能いたします。
    しかし、私が作製したいものは「測定中に計算を同時に行いたい」といったものになっております。拙い日本語で失礼いたしました。

    頂いたプログラムをまだ実行しておりませんが、いくつか質問させていただきます。
    forを使われているのですが、例えばA1、A2、A3と0.1秒間隔で記入されるときも動作しますでしょうか?
    処理速度が記入速度を超えているとき、A1のみでプログラムが終了してしまうのではないかと危惧しているのですがいかがでしょうか。
    また、仮に処理速度が記入速度を超えておらず計算ができたとして、maxrowが時々刻々と増加していくのも対応してるのでしょうか。

    これらの問題からDo Loopを利用していました。

    追記に関して
    宣言はちゃんと行う必要があるのですね。調べたところ省略も可と書いてあったので勝手に行っていました。
    DoEventsに関しては、ネットのページからコピペさせていただいてそのままでした。1つにしても動作することが確認できました。ありがとうございます。


    質問含めて長くなってしまいましたが、ご返信いただけると幸いです。
  2. 例えばA1、A2、A3と0.1秒間隔で記入されるとき

    記入が完了すれば、0.001sでも行として計算されます。

  3. リアルタイム処理はクライアントアプリであるエクセルでは難しいとおもいます。

    データロガーにsyslog(udp)出力が可能なら、linuxサーバー(udp)でサーバーアプリからのリアルタイム処理をお勧めします。

    または、raspberryPI で連携する方法も現実的と思います。

  4. @curry_pan

    Questioner

    やはりExcelでの計算ではなくデータロガーから値を出力して計算するほうが現実的なのですね。
    私自身も難しそうかなとは薄々感じていたので改めて考えてみます。

    ちなみにデータロガーの値をpythonを用いて出力する方法が分からず、頓挫していたので頑張ってみます。

    大変勉強になりました。ありがとうございました。

Your answer might help someone💌