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.
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.
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