前提・実現したいこと
ExcelVBAで疑似コントロール配列を使って異なるクラスから異なるクラスのメンバ変数?を参照したい。
すっきりしたコードにしたい。
(ここに質問の内容を詳しく書いてください。)
ExcelVBAでWin32APIを用いてRS232C接続の外部機器の操作を行おうとしています。
機器が3つあり、
sheet1に機器接続ボタン3、ポート設定コンボボックス5*3set、機器操作用ボタンを複数配置しています。(activeX)
当初sheet1にコードとボタンごとのプロージャを作成して処理を記述していましたが、あまりに煩雑になったため、
http://web.archive.org/web/20021012230146/http://www.moug.net/skillup/opm/opm08-06.htm を参考にボタンクリックイベントをまとめる疑似コントロール配列というものを実装しました。
sheet1の接続ボタンを押すと、関係するポート設定コンボボックスの値を参照して、ポートオープン/クローズを行えるようになりました。
しかし条件判断を追加して、機器操作用ボタンが押された場合は通信コマンドを送ろうとしましたが、ポートハンドラの取得方法がわからず、通信コマンドのWritefileができません。
解決法がわからず困っています。
また、ボタンを押す処理がまとまるのはいいのですが、シート側でイベントが起きたことを検知できないので使いにくい気もしています・・・。
発生している問題・エラーメッセージ
ファイルハンドラ(ポート)の参照方法がわからない。
該当のソースコード
VBA
1'sheet1 2Private Port(3) As New port_event 3Private btn(20) As New btn_event 4Sub Initialize() 5 Dim myCmdBtns As New Collection 6 Dim myCom As New Collection 7 Dim myBaudrate As New Collection 8 Dim myByteSize As New Collection 9 Dim myParity As New Collection 10 Dim myStopBit As New Collection 11 Dim myControl As New Collection 12 'サブプロージャでボタン等紐づけ 13 Call set_port_collection(myCmdBtns, myCom, myBaudrate, myByteSize, myParity, myStopBit) 14 Call set_Control_collectin(myControl) 15 For i = S_Array To E_Array 16 Set Port(i) = New port_event 17 With Port(i) 18 .Index = i 19 .Cmd = myCmdBtns(i) 20 .Com = myCom(i) 21 .baud = myBaudrate(i) 22 .ByteSize = myByteSize(i) 23 .Parity = myParity(i) 24 .StopBit = myStopBit(i) 25 End With 26 Next 27 For i =S_btn_no To E_btn_no 28 Set btn(i) = New btn_event 29 with btn(i) 30 .Index =i 31 .cmd = myControl(i) 32 End With 33 Next 34End sub 35 36'''port_eventクラス 37Public WithEvents myCmd As CommandButton 38Private my_Handler As Long 39Private my_IntIndex As Integer 40Private my_com As combobox 41Private my_baud As combobox 42Private my_ByteSize As combobox 43Private my_Parity As combobox 44Private my_StopBit As combobox 45 46'get/set 47Public Property Get Cmd() As CommandButton 48 Set Cmd = myCmd 49End Property 50 51Public Property Get handler() As Long 52 handler = my_Handler 53End Property 54~省略~ 55 56'クリックイベント 57Public Sub myCmd_Click() 58 Dim port_list(5) As String 59 Dim device_name As Variant 60 Select Case index 61 Case 1,2,3 'ポート接続ボタン 62 device_name = Split(myCmd.Caption, "接続") 63'開いていたら閉じる 64 If my_Handler = -1 Or my_Handler = 0 Then 65 Else 66 my_Handler = WINAPI.port_close(my_Handler) 67 myCmd.Caption = device_name(0) + "接続" 68 Exit Sub 69 Endif 70 port_list(0) = my_com.Text 71 port_list(1) = my_baud.Text 72 port_list(2) = my_ByteSize.Text 73 port_list(3) = my_Parity.ListIndex 74 port_list(4) = my_StopBit.Text 75 'command1(モジュール)にWin32API関係があるので、そこからポートオープン 76 my_Handler = command1.port_open(port_list)'対応ポートハンドル名取得 77 If my_Handler = -1 Or my_Handler = 0 Then 78 myCmd.Caption = device_name(0) + "接続" 79 Else 80 myCmd.Caption = device_name(0) + "接続中" 81 End If 82 83 Case 4 '機器操作ボタン 84 command1.send_comannd(ハンドラ名,ID,Command,Addr,Registor) 'ポート1のハンドル名取得方法がわからない 85 Case 5 '機器操作ボタン2 86 command1.send_comannd(ハンドラ名,ID,Command,Addr,Registor) 'ポート2のハンドル名取得方法がわからない 87~以下略~ 88End Sub 89
試したこと
sheet1からならmulti(i).handlerでハンドル名が取れるのですが・・。
補足情報(FW/ツールのバージョンなど)
office2003 VBA6.5
あなたの回答
tips
プレビュー