VBA: utiliser WithEvents sur UserForms

j'ai un userform Word avec plus de 60 commandes de différents types. J'aimerais évaluer le formulaire chaque fois qu'un événement control_change est déclenché et changer l'état Activé du bouton Soumettre du formulaire. Cependant, je ne veux vraiment pas écrire et maintenir 60 sur change event handlers.

19
demandé sur Deduplicator 2009-07-05 11:05:38

2 réponses

vous pouvez créer une classe event-sink qui contiendra le code de gestion des événements pour tous vos contrôles d'un type particulier.

par exemple, créez la classe a appelée TextBoxEventHandler comme suit:

Private WithEvents m_oTextBox as TextBox

Public Property Set TextBox(ByVal oTextBox as TextBox)
    Set m_oTextBox = oTextBox
End Property

Private Sub m_oTextBox_Change()
    ' Do something
End Sub

Maintenant vous devez créer et connecter une instance de cette classe pour chaque contrôle du type approprié sur votre formulaire:

Private m_oCollectionOfEventHandlers As Collection

Private Sub UserForm_Initialise()

    Set m_oCollectionOfEventHandlers = New Collection

    Dim oControl As Control
    For Each oControl In Me.Controls

        If TypeName(oControl) = "TextBox" Then

            Dim oEventHandler As TextBoxEventHandler
            Set oEventHandler = New TextBoxEventHandler

            Set oEventHandler.TextBox = oControl

            m_oCollectionOfEventHandlers.Add oEventHandler

        End If

    Next oControl

End Sub

notez que la raison pour laquelle vous devez ajouter les instances du gestionnaire d'événements à une collection est simplement de s'assurer qu'elles restent référencé et donc ne pas être jeté par le collecteur d'ordures avant d'en avoir fini avec eux.

il est clair que cette technique peut être étendue à d'autres types de contrôle. Vous pouvez soit avoir des classes de handler d'événements distinctes pour chaque type, ou vous pouvez utiliser une seule classe qui a une variable de membre (et la propriété associée et le handler d'événement) pour chacun des types de contrôle que vous avez besoin de gérer.

23
répondu Gary McGill 2011-04-02 14:06:02

dans ce cas vous avez peu d'options, parce que les gestionnaires d'événements ne peuvent pas être partagés dans VBA/VB6

Option 1: utilisez une fonction de manipulation centrale qui est appelée à partir de chaque gestionnaire d'événements.

Sub Control1_ChangeEvent()
  CommonChangeEvent // Just call the common handler, parameters as needed
End Sub

Sub Control2_ChangeEvent()
  CommonChangeEvent
End Sub
...
Sub CommonChangeEvent(/* Add necessary parameters */)
  //Do the heavy lifting here
End Sub

Option 2: organisez vos commandes dans des tableaux de contrôle.

Sub TextBox_ChangeEvent(Index As Integer)
  CommonChangeEvent
End Sub

Sub OtherControlType_ChangeEvent(Index As Integer)
  CommonChangeEvent
End Sub
2
répondu Daniel Rikowski 2009-07-05 07:15:22