J'avais évoqué ce problème sur un sujet plus général mais je préfère en ouvrir un autre qui ne porte que là-dessus (avec un titre plus précis).
Actuellement j'ai une Form où je veux créer des boutons par code VBA.
Pour cela j'utilise le module de la Form et un module de classe.
Les évènements MouseEnter et MouseLeave sur mes boutons fonctionnent très bien (je change la BackgroundImage du bouton). Cependant l'évènement _Click (ou _MouseClick, _MouseUp, _MouseDown) ne fonctionne pas. Enfin si il fonctionne, mais même avec un simple MsgBox celui-ci apparait en boucle (que je le valide par OK ou que je le ferme). Ce problème doit sûrement venir d'une mauvaise définition des contrôles de ma part (ou de la collection que j'utilise ?).
Voici les bouts de code que je pense important :
Dans mon module de Form :
Public Class Outils
Public Collect As Collection
[...]
Private Sub Outils_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
Dim test3000 As Classe1
Collect = New Collection
For Each Ctrl As System.Windows.Forms.Button In Me.Controls.OfType(Of Button).Where(Function(button) button.Name Like "Bouton100*")
test3000 = New Classe1
test3000.noraj = Ctrl
Collect.Add(test3000)
Next Ctrl
End Sub
[...]
End Class
Dans mon module de classe :
Public Class Classe1
Public WithEvents noraj As System.Windows.Forms.Button
Private Sub noraj_MouseEnter(sender As Object, e As EventArgs) Handles noraj.MouseEnter
Call Outils.test_couleur_bouton2(noraj)
End Sub
Private Sub noraj_MouseLeave(sender As Object, e As EventArgs) Handles noraj.MouseLeave
Call Outils.test_couleur_bouton1(noraj)
End Sub
Private Sub noraj_Click(sender As Object, e As EventArgs) Handles noraj.Click
'Call Outils.analyse_tag(noraj.Tag.ToString)
MessageBox.Show("test", "ici titre MsgBox")
End Sub
End Class
Lors de la répétition en boucle, la valeur de noraj ne bouge pas, il s'agit à chaque fois du bouton sur lequel j'ai appuyé. C'est comme si à chaque validation ou annulation de la MsgBox il détecte un Click sur le bouton.
Si je change une image par exemple, le changement se fait mais je garde la main sur la souris, du coup je peux appeler un autre évènement (comme MouseLeave) et arrêter le _Click.
Si j'appelle une macro qui elle appelle aussi une messagebox, j'ai de nouveau le problème.
Si je mets un j = j+1 (j=1 au tout début de la classe) et que je fais du pas à pas (et que je n'appelle pas d'autre évènement), la procédure _Click se fait en boucle et j retombe à 1 à chaque début de procédure.