tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 ではなく?

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。