【EXCEL】計測機器なしでSequence Makerを楽しむ

# やること
　Excel通信コマンド送受信アドイン「Sequence Maker」を計測機器なしで楽しむ。
　[【EXCEL】Sequence Makerの計測結果のテキスト書出し #Excel - Qiita](https://qiita.com/a_kata/items/5944ee6dcd90ab684110) でちょっとトリッキーな使い方をしていたので、もう少し一般的な使い方を行う。


# 事前準備：仮想インターフェイス
　計測機器がなくても動作確認の出来る仮想インターフェイスを利用する。仮想インターフェイスについては毎度おなじみの[Sequence Maker](https://qiita.com/sequencemaker)さんの以下の記事をご参照ください。
 [Sequence Makerの仮想インターフェイスを使う #Excel - Qiita](https://qiita.com/sequencemaker/items/c202cd2fe124fe5f1072)

 ~~~vb:
 Sub virtualcommand_set()
    Dim automationObject As Object
    Set automationObject = Application.COMAddIns("Sequence Maker").Object
    Dim virtualCommand As Variant
    Set virtualCommand = automationObject.CreateVirtualCommand()
    Dim result As Long
    Dim CommandNo As Long
    Dim InterfaceNo As Long
    InterfaceNo = 1
    
    For CommandNo = 1 To 100
        virtualCommand.Command = ":" & CommandNo & "_TestCMD?"
        virtualCommand.Response = CommandNo
        result = automationObject.SetVirtualCommand(virtualCommand, InterfaceNo, CommandNo)
        If result <> 0 Then
            Exit Sub
        End If
    Next
    
    For CommandNo = 1 To 100
        result = automationObject.GetVirtualCommand(virtualCommand, InterfaceNo, CommandNo)
        If result <> 0 Then
            Exit Sub
        End If
        Cells(CommandNo, InterfaceNo) = virtualCommand.Command
        Cells(CommandNo, InterfaceNo + 1) = virtualCommand.Response
    Next
End Sub
~~~
実行するとインターフェイス#1にコマンドを設定し、設定した内容をA列にコマンド、B列に応答を表示する。
![20250311_233410.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838258/271a9612-a85c-4fd4-9757-3025038c3315.jpeg)


# 簡易調整もどきで楽しむ
![20250311_234228.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838258/38b213e4-83ea-4d79-adfa-70a6b92472cd.jpeg)
* 目標値　セルF3
* 初期値　セルG3
　セルE4に「=":"&G3&"_TestCMD?"」としているので、セルG3は1から100までの整数を設定する。
　使用するマクロはとりあえず以下のようなものを用意。
~~~vb:
Sub 値比較してG3変更()
    Dim valueF3 As Variant
    Dim valueF4 As Variant
    Dim valueG3 As Variant

    ' セルF3, F4, G3の値を取得
    valueF3 = Range("F3").Value
    valueF4 = Range("F4").Value
    valueG3 = Range("G3").Value

    ' 値を比較してG3を変更
    If valueF4 > valueF3 Then
        Range("G3").Value = valueG3 - 1 ' F4 > F3 の場合、G3を-1する
    ElseIf valueF4 < valueF3 Then
        Range("G3").Value = valueG3 + 1 ' F4 < F3 の場合、G3を+1する
    End If
End Sub
~~~
defaultだと、上書きの確認のPopUpが1度出るかと思います。また、終了は停止ボタンを押してください。

# おまけ：計測機器なしで使えるもの
マニュアルのサンプルプログラムをもとにご紹介。1行～5行に結果を表示します。
~~~vb:
Sub command_test()
    Dim i As Single
    Dim j As Single
' Sequence Maker COMアドインオブジェクトの取得方法
    Dim addIn As COMAddIn
    Dim automationObject As Object
    Set addIn = Application.COMAddIns("Sequence Maker")
    Set automationObject = addIn.Object
'=> Set automationObject = Application.COMAddIns("Sequence Maker").Object

' 0.Application.COMAddIns("Sequence Maker").説明
    MsgBox addIn.Description

' 1.Sequence Makerのバージョン番号の取得
    i = 1
    j = 0
    Cells(i, j + 1) = "バージョン"
    j = j + 1
    Cells(i, j + 1).NumberFormat = "@"                  ' 文字列に設定
    Cells(i, j + 1) = automationObject.GetVersion()

' 2.カメラデバイス名の取得
    i = 2
    j = 0
    Cells(i, j + 1) = "カメラ"
    Dim cameraDeviceName() As String
    cameraDeviceName = automationObject.GetCameraDeviceName()
    If UBound(cameraDeviceName) < 0 Then
        Cells(i, j + 2) = "カメラデバイスなし"
    Else
        For j = LBound(cameraDeviceName) To UBound(cameraDeviceName)
            Cells(i, j + 2) = cameraDeviceName(j)
        Next j
    End If

' 3.CONTECデジタル入出力デバイス名の取得
    i = 3
    j = 0
    Cells(i, j + 1) = "CONTECデバイス"
    Dim contecDigitalIoDeviceName() As String
    contecDigitalIoDeviceName = automationObject.GetContecDigitalIoDeviceName()
    If UBound(contecDigitalIoDeviceName) < 0 Then
        Cells(i, j + 2) = "CONTECデジタル入出力デバイスなし"
    Else
        For j = LBound(contecDigitalIoDeviceName) To UBound(contecDigitalIoDeviceName)
            Cells(i, j + 2) = contecDigitalIoDeviceName(j)
        Next j
    End If

' 4.VISAアドレスの取得
    i = 4
    j = 0
    Cells(i, j + 1) = "VISA"
    Dim visaAddress() As String
    visaAddress = automationObject.GetVisaAddress()
    If UBound(visaAddress) < 0 Then
        Cells(i, j + 2) = "VISAアドレス取得できず"
    Else
        For j = LBound(visaAddress) To UBound(visaAddress)
            Cells(i, j + 2) = visaAddress(j)
        Next j
    End If


' 5.COMポート名の取得
    i = 5
    j = 0
    Cells(i, j + 1) = "COMポート"
    Dim comPortName() As String
    comPortName = automationObject.GetComPortName()
    If UBound(comPortName) < 0 Then
        Cells(i, j + 2) = "COMポート名の取得できず"
    Else
        For j = LBound(comPortName) To UBound(comPortName)
            Cells(i, j + 2) = comPortName(j)
        Next j
    End If
End Sub
~~~