質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

0回答

1097閲覧

ExcelVBA疑似コントロール配列の使用方法

98mate

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2020/04/28 14:21

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imihito

2020/04/29 00:55

ポート関係には詳しくないので、純粋にコードの面からの確認ですが、 「試したこと」に記載されている`multi(i).handler`とは何ですか? `'sheet1`というコメント以下のコードには含まれていないようですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問