タイトル : Re: VBA コントロールに付加したイベントが働かない 投稿日 : 2015/09/15(Tue) 22:09 投稿者 : 魔界の仮面弁士
> それ以降コンボボックスをどのように操作してもイベントが発生しません。 変数が有効期間外になったか、コードの実行が終了したなどの理由で、 生成しておいたクラスのインスタンスが解放されているのではないでしょうか? 試しに、クラスモジュールに Private Sub Class_Initialize() Debug.Print "→生成:"; Hex(ObjPtr(Me)), Format(Now, "yyyy/MM/dd HH:mm:ss") & Format(Timer - Fix(Timer), ".0000000") End Sub Private Sub Class_Terminate() Debug.Print "←解放:"; Hex(ObjPtr(Me)), Format(Now, "yyyy/MM/dd HH:mm:ss") & Format(Timer - Fix(Timer), ".0000000") End Sub という行を追加し、イミディエイトの内容を確認してみて下さい。 オブジェクトが解放されているようであれば、それが「イベントが発生しない(ようにみえる)」原因かと思います。 Excel VBA はあまり使わないので、さほど詳しくは無いのですが、 CmbMake の中で「Stop ステートメント」を記述してみたところ、 OLEObjects.Add の「実行前」には Stop できるものの、 OLEObjects.Add の「実行後」に Stop を書いた場合には、処理が中断するのではなく 『中断モードでは入力できません』というエラーメッセージと共に、 コードの実行が打ち切られてしまう(VBA の実行が停止させられる)現象を確認しました。 ここからは私の想像ですが、OLEObjects.Add が実行されたことによって、 「CmbMake の実行が完了した後」で、Sheet1 上に「Sheet1.ComboBox1」なメンバーが追加されますが、 そのために、VBA 的には再コンパイル相当の処理が必要な事態となり、一連のコードが終了した タイミング(すなわち、Workbook_Open の処理が完了した直後)に、 VBA コードが終了(あるいはリセット)されたのではないか…と予想しています。 実際、「自ブック上に OLEObjects.Add する」という現状のコードに少し手を加えて、 「他のブック上に OLEObjects.Add する」動作に書き換えてみたところ、その場合は クラスが解放されることなく、イベントを受け取り続けられることを確認しています。 ---- 以下、本題とは無関係の突っ込み ---- > Set cmbPos = Range(A3) A3 という変数ですか? "A3" という文字列ではなく? それと、ComboBox の生成コードに合わせるため、上記は「Range」ではなく、 「ActiveSheet.Range」にした方が適切かと思います。 > Set objcmb = ActiveSheet.OLEObjects(m_objOLE_C.Name).Object 「Set objcmb = m_objOLE_C.Object」で良いのでは。 > Set NewObj = New clsObjectIvent 変数 NewObj はどこで宣言されていますか? > ※クラスモジュール「clsObjectIvent」に下記コード clsObjectEvent ではなく? |