2016-10-25 1 views
2

J'ai une liste déroulante qui contient plusieurs événements liés (par exemple, ComboBox1_Change, Click, GotFocus, LostFocus). Pour mes besoins, j'ai besoin d'utiliser un contrôle ActiveX.Recréation d'un contrôle ActiveX avec des événements VBA, à l'aide de VBA

Pour des renseignements généraux:

je suis tombé sur un problème où les glitches de contrôle ActiveX lorsque la machine est attaché à un projecteur. D'autres ont eu le même problème, mais pas de solution. Le meilleur moyen que j'ai trouvé pour résoudre ce problème est de créer un bouton supplémentaire sur lequel l'utilisateur peut cliquer pour supprimer le contrôle ActiveX et le recréer.

Le problème est (et ma question) ... Lorsque je fais cela, les événements VBA ne s'exécutent plus. Le contrôle est nommé exactement le même. Y at-il un correctif simple (comme la propriété dans le contrôle ActiveX que je peux définir), de sorte que je n'ai pas besoin d'écrire du code VBA pour supprimer et réécrire le code VBA existant (que je ne suis pas sûr à 100%?) ?

+0

Pour mieux vous aider, pourriez-vous publier le morceau de code que vous modifiez? –

+0

Les contrôles sur une feuille de calcul ou un objet UserForm? – ThunderFrame

Répondre

1

Cela semble fonctionner pour moi, dans une feuille de calcul:

Démarrer avec 2 boutons de commande sur une feuille de calcul: CommandButton1 et CommandButton2.

Vous ne pouvez pas parcourir le code, mais il va s'exécuter.

Option Explicit 

Private Sub CommandButton1_Click() 
    Dim oldObj As OLEObject 
    Dim left As Double, top As Double, width As Double, height As Double 
    Set oldObj = Me.OLEObjects("CommandButton2") 

    With oldObj 
    'Rename the control to detach events 
    .Name = "CommandTEMP" 
    left = .left 
    top = .top 
    width = .width 
    height = .height 
    .Delete 
    End With 

    Dim newObj As Object 

    Set newObj = Me.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _ 
     , DisplayAsIcon:=False, left:=left, top:=top, width:=width, height:=height) 

    newObj.Name = "CommandButton2" 

End Sub 

Private Sub CommandButton2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
    Me.CommandButton2.Object.Caption = Timer 
End Sub 
+0

Cela semble fonctionner, avec un problème supplémentaire ... maintenant, chaque fois que je clique sur la liste déroulante, l'écran "twitches", et les travaux du curseur ailleurs. Aucun événement VBA n'est déclenché, car je place des points d'arrêt sur chaque module. Après cela, je ne peux pas cliquer n'importe où sur l'écran. Je dois alt-tab pour une autre fenêtre, puis alt tab dans Excel. – ConfusedNoob

+0

@ConfusedNoob ne pas être convaincu que les points d'arrêt ne sont pas touchés. Notez que j'ai dit que vous ne pouvez pas parcourir le code après un certain point, et que certains points d'arrêt seront ignorés à partir de ce point. Utilisez les instructions 'debug.print' pour confirmer que le code est en cours d'utilisation. – ThunderFrame

+0

@ConfusedNoob Le contrôle sur une feuille ou un formulaire? – ThunderFrame