0

ここで見つけたすべてのアドバイスに従って、コンボボックスの「変更」機能を自動的に変更しました。Excelシートのコンボボックスの値を変更するまで、コードはエラーを生成しません。マクロは起動されません。

私のコードは次のとおりです。

クラスファイル (class : COptions)

Option Explicit

    Public WithEvents lOptions As MSForms.ComboBox

    Private Sub lOptions_Change()
    MsgBox "hello "
    End Sub

モジュールファイル内

Sub macrotest()

Dim j As String
Dim tObject
Set tObject = Sheets("test").OLEObjects.Add(ClassType:="Forms.ComboBox.1", _
                Link:=False, _
                DisplayAsIcon:=False, _
                Left:=50, Top:=80, _
                Width:=100, _
                Height:=15)
            tObject.Name = "Combobox32"
            tObject.Object.Font.Size = 8
            tObject.Object.BackColor = vbWhite
            tObject.Object.AddItem "blub1"
            tObject.Object.AddItem "blub2"
            'MsgBox "tObject " & tObject.Name

Dim Obj As OLEObject
Dim Cl As COptions
    Set Cl = Nothing
    Set Collect = New Collection '(previously declared as global variable)

    For Each Obj In Sheets("test").OLEObjects
        If TypeOf Obj.Object Is MSForms.ComboBox Then
            MsgBox Obj.Name 'check if we enter in the loop : always successfull
            Set Cl = New COptions
            Set Cl.lOptions = Obj.Object
            Collect.Add Cl
                    End If
    Next Obj
    MsgBox "Collect  " & Collect.Count ' which result is 1

End Sub

したがって、すべて正常に動作しますが、Excel ワークシートに戻ると、コンボボックスの値を変更しても何も起こりません。

ところで、このコードの仕組みがよくわかりません。

定義されたクラス (ここでは Cl) の新しいオブジェクトが作成され、変更されます。しかし、変更の対象であるコンボボックスは、どこが変更されているのでしょうか? なぜ新しいオブジェクト Cl を変更することによって、それが変更されるはずのターゲット オブジェクト ComboBox なのですか?

Web 上でこのエラーを見つけられなかったので、何が起こっているのかわかりません。

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

OLEObjects の作成とイベントへの接続には問題があります。残念ながら、オブジェクトを作成するプロシージャを終了させて​​から、イベントをフックするプロシージャを実行する必要があります。Application.OnTime を使用して、'create' プロシージャの直後に 'hook up' プロシージャを実行できます。このような。

Public Collect As Collection

Sub macrotest()

Dim j As String
Dim tObject
Set tObject = Sheets("test").OLEObjects.Add(ClassType:="Forms.ComboBox.1", _
                Link:=False, _
                DisplayAsIcon:=False, _
                Left:=50, Top:=80, _
                Width:=100, _
                Height:=15)
            tObject.Name = "Combobox32"
            tObject.Object.Font.Size = 8
            tObject.Object.BackColor = vbWhite
            tObject.Object.AddItem "blub1"
            tObject.Object.AddItem "blub2"
            'MsgBox "tObject " & tObject.Name

    Application.OnTime Now, "LinkupCombos"

End Sub

Sub LinkupCombos()

Dim Obj As OLEObject
Dim Cl As COptions
    Set Cl = Nothing
    Set Collect = New Collection '(previously declared as global variable)

    For Each Obj In Sheets("test").OLEObjects
        If TypeOf Obj.Object Is MSForms.ComboBox Then
            MsgBox Obj.Name 'check if we enter in the loop : always successfull
            Set Cl = New COptions
            Set Cl.lOptions = Obj.Object
            Collect.Add Cl
                    End If
    Next Obj
    MsgBox "Collect  " & Collect.Count ' which result is 1

End Sub
于 2013-10-19T14:08:20.980 に答える