【パワーメーター2019】データ解析Pgm_グラフはCPLTをVBAで制御<SendKeysコマンド使う>

ロードバイク走行データは、RASPIロガーでまとめて取得できるめどがたったので、データ解析方法を再検討してます。今までは、VBAで自動処理アルゴリズムを作ってきましたが、データがノイズが多かったり予想外の波形をしていた場合結局ケースバイケースでプログラムにパッチをあてないと使えない状況で、不便極まりない解析プログラムばかり作ってました。
=>これでは、来年にかけて、膨大な実走行データを解析処理するためには、役にたたないだろうということで
考え直しました。
●半手動型の解析プログラム
RASPIロガーからのデータをCSVで読み込んで、エラー処理したらCPLTに表示して、目視で確認しながら位相合わせ、ゲイン調整などをおこなって、処理しやすい波形セットを作ったら、手動で区間を決めて積分値を 計算させて、相関比較するというプログラムをつくったほうが、汎用性と異常なデータ波形に対する対応性があって、解析の生産性があがるというアイデアで作ってみることにしました。

●半手動にするための重要アイテム
⓪CPLTをCSVで関連付けアプリにする
   CPLTは、インストーラーがないアプリなので、WINDOWSではアプリとして認識されてません。
そこで、強制的にCSVファイルに関連づけする方法を調べました。こちらの解説が良かったです。感謝
https://novlog.me/win/win10-default-app-non-install/

①CPLTをVBAで自動制御して、データを処理毎に目視確認できるようにする
今までEXCELのグラフで数万行のデータを表示してきましたが遅いし使いにくいし、どうにも
解析作業に使えない状態でした。そこで、高速でシンプルがCPLTを活用できないかとアイデア
をだしました。VBAのSHELLコマンド等で、アプリの起動、設定変更、ファイル読み書きなど
手動で可能な操作はできるのは知ってましたが、簡単な命令で可能になるので驚いてます。
参考にさせていただいたサイト(感謝です)

こちらは詳しいのですが、長かったので、シンプルな解説記事を探しました。

VBAで他アプリを起動する=>https://www.moug.net/tech/exvba/0100034.html

 

起動したアプリケーションの表示位置、サイズを指定する=>https://www.moug.net/tech/acvba/0010014.html
SendKeyの使い方=>https://e-vba.com/sendkeys/

CPLTへの自動制御 VBA命令文
CPLTを起動する rc = Shell(“D:\dowloads\cplt0104\cplt0104\CPLT.exe”, vbNormalFocus)
If rc = 0 Then MsgBox “起動に失敗しました”
‘【アプリのパスを指定するだけshellコマンドが起動してくれます】
CPLTからCSVファイルを読み込ませる csvfile = UserForm1.TextBox1.Text
Application.SendKeys “^(o)”, True
Application.SendKeys csvfile, True
Application.SendKeys “{ENTER}”, True’【開くでダイアログが開いて、ファイル名をタブ位置に書き込む動作】
CPLTのグラフサイズを変更 ’【サイズ変更が以外と大変なプログラムでした】

Private Function size()
Dim myHwnd As Long
Dim myWindowPlacement As WINDOWPLACEMENT
‘メモ帳を起動してアクティブにする
‘ AppActivate Shell(“notepad”, vbNormalFocus)
‘ウィンドウハンドルの取得
myHwnd = GetForegroundWindow()
‘ウィンドウ情報の取得
GetWindowPlacement myHwnd, myWindowPlacement
‘ウィンドウ情報を変更して設定
With myWindowPlacement.rcNormalPosition
.Left = 10
.Top = 10
.Right = 1200
.Bottom = 420
End With
SetWindowPlacement myHwnd, myWindowPlacement
End Function

CPLTの横軸データ数を変更 ‘【alt-s で設定を開いて同時にalt-hで横軸を開くのでshと入力します】
Application.SendKeys “%(sh)”, True ‘設定
Application.SendKeys “{TAB}”, True ‘下↓
Application.SendKeys “{TAB}”, True ‘下↓
Application.SendKeys “1000”, True ‘下↓
Application.SendKeys “{ENTER}”, True ‘下で水平設定↓
まだ、いろいろ可能です。 縦軸とかCH数を変えたりカーソル位置を示したりいろいろできそう

●プログラムと実行
まだ、やりかけてですが、短いうちにアップしておきます。EXCEL2007です。
アプリ自動実行PGM例

VBA標準モジュール1

Private Declare Function GetForegroundWindow _
Lib “user32” () As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type WINDOWPLACEMENT
Length As Long
flags As Long
showCmd As Long
ptMinPosition As POINTAPI
ptMaxPosition As POINTAPI
rcNormalPosition As RECT
End Type
Private Declare Function GetWindowPlacement _
Lib “user32” _
(ByVal hwnd As Long _
, lpwndpl As WINDOWPLACEMENT) As Long
Private Declare Function SetWindowPlacement _
Lib “user32” _
(ByVal hwnd As Long _
, lpwndpl As WINDOWPLACEMENT) As Long
Dim csvfile As String

Sub CPLT()
Dim myHwnd As Long
Dim myWindowPlacement As WINDOWPLACEMENT
Dim rc As Long
‘Dim csvfile As String ‘Program Filesのパス
‘csvfile = “C:\Users\dj1711572002\Desktop\csv_sample.csv”
csvfile = UserForm1.TextBox1.Text
rc = Shell(“D:\dowloads\cplt0104\cplt0104\CPLT.exe”, vbNormalFocus)
If rc = 0 Then MsgBox “起動に失敗しました”
If rc <> 0 Then
Application.SendKeys “^(o)”, True
Application.SendKeys csvfile, True
Application.SendKeys “{ENTER}”, True
a = size()
Application.SendKeys “%(sh)”, True ‘設定
Application.SendKeys “{TAB}”, True ‘下↓
Application.SendKeys “{TAB}”, True ‘下↓
Application.SendKeys “1000”, True ‘下↓
Application.SendKeys “{ENTER}”, True ‘下で水平設定↓

MsgBox “起動に失敗しました”
End If
End Sub

Private Function size()
Dim myHwnd As Long
Dim myWindowPlacement As WINDOWPLACEMENT
‘メモ帳を起動してアクティブにする
‘ AppActivate Shell(“notepad”, vbNormalFocus)
‘ウィンドウハンドルの取得
myHwnd = GetForegroundWindow()
‘ウィンドウ情報の取得
GetWindowPlacement myHwnd, myWindowPlacement
‘ウィンドウ情報を変更して設定
With myWindowPlacement.rcNormalPosition
.Left = 10
.Top = 10
.Right = 1200
.Bottom = 420
End With
SetWindowPlacement myHwnd, myWindowPlacement
End Function

Private Function Horizontal()
Application.SendKeys “^(s)”, True ‘設定
Application.SendKeys “^(o)”, True ‘下↓
Application.SendKeys “^(o)”, True ‘下↓
Application.SendKeys “^(o)”, True ‘下で水平設定↓

End Function

End Function

USERFORM1

Dim wb1 As Workbook
Dim wb2 As Workbook
Dim wb3 As Workbook
Dim dotsu As Integer
Dim timespan As Double
Dim startTime0 As Variant
Dim wbName As String
Dim MaxRow, MaxCol As Long
Dim MaxRow0, MaxRow1, MaxRow2, MaxRow3 As Integer
Dim sIndex, lIndex, rIndex As Variant
Dim MaxCol0, MaxCol1, MaxCol2, MaxCol3 As Long
Dim i, j, k, l, m, n As Long
Dim Ma As Long
Dim InnRise, InnFall As Long

Dim QMCNo As Long
Dim Prange As Range
Dim srange, lrange, rrange As Range
Dim chcol As Long ‘ピークサーチで使うデータ列
Dim FNM(10) As String
Dim ok1, ok2, ok3 As Long
Dim startk, endk As Long
Dim Peak_Min As Long
Dim wb As Workbook
Dim mabikiN, mabikid As Integer
Dim seatrange As Range
Dim leftrange As Range
Dim rightrange As Range
Dim ChartObj As Object
Dim Srs As Series
‘===========================Zero Cross ====================================
Dim SeatB(60000) As Integer
Dim SeatT(60000) As Integer

Private Sub CommandButton1_Click()
CPLT
End Sub

Private Sub CommandButton2_Click()
‘wbName = ActiveWorkbook.Name
OpenFileName = Application.GetOpenFilename(“*,*.csv?”)
Workbooks.Open OpenFileName
TextBox1.Value = OpenFileName
Set wb = ActiveWorkbook
Debug.Print (wb.Name)
‘==========================Seat data Reading=============================
TextBox1.Text = OpenFileName
csvfile = TextBox1.Text

End Sub

Private Sub TextBox1_Change()

End Sub

Private Sub UserForm_Click()

End Sub


●以後

これで今日明日までに作って、さっそくデータ解析作業をしてみます。何とか10月末までに一段落させたいです

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です