Wie um zu verhindern, dass ActiveX-Ereignisse auslösen in VBA?
Ich bin auf der Suche nach einem besseren Weg zum deaktivieren von ActiveX-Ereignisse auslösen, die in einer Excel-Arbeitsmappe (obwohl dies gilt für alle Office-Anwendungen mit ActiveX-Objekte).
Hoffentlich etwas ähnliches wie Application.EnableEvents = false
, aber das funktioniert nicht mit ActiveX.
In dem Beispiel weiter unten ist es trivial, um eine Globale boolean-aber ich habe eine Menge von event-Handlern für meine ActiveX-Objekte, und es wäre immens einfacher, für etwas, das ich universell anwenden, um vorübergehend deaktivieren Sie die ActiveX-Ereignisse. Ich nicht wirklich wollen, fügen Sie eine if - /exit-sub-Anweisung für jede einzelne dieser Methoden.
Um dieses problem zu demonstrieren, erstellen Sie ein ActiveX-combobox in einem Arbeitsblatt und fügen Sie den folgenden, um das Blatt-Modul
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
- + 1 Gute Frage! Sie hatte mir überlegt eine Weile 🙂
- Mein code ist ein Beispiel für Excel. Die Logik bleibt die gleiche für MS Word/PowerPoint. Nicht sicher über MS Access/Projekt/Ausblick obwohl.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum nicht deaktivieren? Dass die Möglichkeiten, die Sie nicht haben, um sorgen über Ihre individuellen codes als auch.
Versuchen, diese
Vorher - /Nachher-ScreenShots:
- FOLLOW AUS DEN KOMMENTAREN:
Auf deaktiviert ActiveX-Steuerelemente in einer Gruppe, die Sie nicht brauchen, um die Gruppierung aufheben. Verwenden Sie diesen code. Der folgende code deaktiviert die Comboboxes in einer Gruppe.
If TypeOf OLEobj.Object Is MSForms.ComboBox
. Auch stellt sich heraus, das bricht harte Kern auf Objekte, die gruppiert werden, aber ich kann die Gruppierung aufheben Objekte (Sie sind nicht mehr in "Sheet1" festgelegt.OLEobjects" Schätze ich mal). Ich weiß noch nicht wirklich wie dieses, da es stützt sich auf diese Tatsache und es wird Zeiten geben, wenn ich tun wollen, group-Objekte.._change()
Methoden, welche updates die anderen Textboxen in eine Art Schutz, um nicht eine Kettenreaktion starten. Denn selbst wenn ich das aktivieren/deaktivieren in der anfänglichen Bevölkerung von der combo-Boxen, jedes mal bekommt man verändert die auf anderen werde ich kick den Prozess wieder ab... so wird jeder haben, um einif isUpdating then exit sub
- Methode, gefolgt vonisUpdating = true
(oder aktivieren/deaktivieren Sie alle ComboBoxes auf dem Blatt, wie Sie es vorschlagen)Ich weiß, das ist wirklich alt. Aber wer sieht dies (Erster Treffer bei google) vielleicht möchten Sie eine einfache Antwort:
Können sagen, Sie haben ein Eigenes Sub ActiveXControl_Change() wird immer aufgerufen, während eine Anwendung.EnableEvents = False und Sie es wollen, überspringen Sie diese einfach gehen:
bin auf diesen Beitrag bei der Suche für ein ähnliches Problem. Entschied ich mich die Antwort hier gepostet würde nicht passen, meine situation, und kam mit etwas anderes. Mein Ansatz kann sinnvoll sein, hier auch.
In meiner Arbeitsmappe habe ich ein set von 20 (Activex) - Kontrollkästchen. Diese im wesentlichen filter on/off 20 Produktkategorien werden in einem Bericht. Es ist eine routine, die ausgeführt wird, jedes mal, wenn eine dieser Checkboxen geändert wird, einfach durch den Aufruf der routing von der CheckBox_Click routine.
Dann habe ich auch ein Kombinationsfeld wählt verschiedene Gruppen dieser Checkboxen. Das Problem ist, dass wenn JEDER von den 20 Checkboxen (un), ausgewählt von der combobox-code, die Berechnung routine ausgelöst wird.
Was ich wollte, war zum ausführen der Berechnung routine nur EINMAL am Ende der combobox, aber habe es immer noch funktioniert wenn ich eine einzelne checkbox manuell.
Meine Lösung - setzen Sie sich in einen TRUE/FALSE-code in irgendeiner Zelle auf einer versteckten Arbeitsblatt, irgendwo ist es aus dem Weg und nicht stören.
Dann die CheckBox_Click code wird (für jeden der 20 Checkboxen):
Den combobox-code ändert diese gleiche Zelle, entsprechend:
Cheers,
Michael
Hier ist eine option: