4

Excel ブックで ActiveX イベントがトリガーされないようにするより良い方法を探しています (ただし、これは ActiveX オブジェクトを使用するすべての Office アプリに適用されます)。

Application.EnableEvents = falseこれは ActiveX では機能しませんが、うまくいけば に似たものになります。

以下の例では、グローバル ブール値を使用するのは簡単ですが、ActiveX オブジェクト用のイベント ハンドラーがたくさんあるので、ActiveX イベントを一時的に無効にするために普遍的に適用できるものの方がはるかに簡単です。これらのメソッドのすべてに if/exit サブステートメントを追加したくはありません。

この問題を実証するには、ワークシートに ActiveX コンボボックスを作成し、そのシート モジュールに以下を追加します。

Public initializingContent As Boolean 
Private Sub intializeAllActiveXContent()

    'this doesn't apply to activeX events :'(
    Application.EnableEvents = False

    'this could work but is not really elegant
    'change this to false to show my problem in 
    'the intermediate window (called not once but twice)
    initializingContent = True

    ComboBoxTest.Clear

    ComboBoxTest.AddItem ("item1")
    ComboBoxTest.AddItem ("item2")
    ComboBoxTest.AddItem ("item3")

    'select the top value in the box
    ComboBoxTest.value = "item1"

    initializingContent = False

    Application.EnableEvents = True

     End Sub

Private Sub ComboBoxTest_Change()
    'I really don't want to have to wrap EVERY single ActiveX method
    'with something like this for a whole variety of reasons...
    If initializingContent Then Exit Sub

    Debug.Print "do stuff I don't want to happen when intializeAllActiveXContent() runs " & _
        "but I do when user changes box"
         End Sub
4

4 に答える 4

4

それらを無効にしないのはなぜですか?そうすれば、個々のコードについても心配する必要はありません。

これを試して

Sub DisableActiveXControls()
    Dim ws As Worksheet
    Dim OLEobj As OLEObject

    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        For Each OLEobj In ws.OLEObjects

        If TypeOf OLEobj.Object Is MSForms.ComboBox Then
            OLEobj.Enabled = False
        End If
        Next OLEobj
    End With
End Sub

前/後のスクリーンショット:

ここに画像の説明を入力

コメントからのフォローアップ:

また、これにより、グループ化されたオブジェクトのハードコアが壊れることが判明しましたが、オブジェクトのグループ化を解除できます (それらはもはや "Sheet1.OLEobjects" にはないと思います)。この事実に依存しており、オブジェクトをグループ化したい場合があるため、私はまだこれがあまり好きではありません.. – enderland 17分前

グループ内の ActiveX コントロールを無効にするために、グループ化を解除する必要はありません。このコードを使用します。以下のコードは、グループ内のコンボボックスを無効にします。

Sub Disable_ActiveX_Controls_In_A_Group()
    Dim shp As Shape, indvShp As Shape
    Dim OLEobj As OLEObject
    Dim ws As Worksheet

    Set ws = ThisWorkbook.Sheets("Sheet1")

    For Each shp In ws.Shapes
        If shp.Type = msoGroup Then
            For Each indvShp In shp.GroupItems
                Set objOLE = indvShp.OLEFormat.Object

                If objOLE.progID = "Forms.ComboBox.1" Then _
                objOLE.Enabled = False
            Next
        End If
    Next
End Sub
于 2013-10-09T17:24:12.883 に答える