2017-09-30 14 views
0

Je deviens fou en essayant de trouver un moyen d'exécuter le code lorsque je clique sur l'une des cases sur ma feuille. J'ai vu plusieurs articles parler de faire un module de classe, mais je n'arrive pas à le faire fonctionner.Événement déclenché par N'IMPORTE QUELLE case à cocher cliquez sur

J'ai un code qui remplira la colonne B pour correspondre à la colonne C. Tout ce que je tape manuellement dans C10 va peupler dans B10, même si C10 est une formule: = D9. Donc, je peux taper TRUE dans D10 et la formule dans C10 se traduira par: TRUE et ensuite le code remplit B10 pour dire: TRUE. Génial ... l'astuce consiste à avoir une case à cocher liée à D10. Lorsque je clique sur la case à cocher, D10 dit VRAI et la formule en C10 dit VRAI, mais c'est aussi loin que cela se passe. Le code VBA ne reconnaît pas la case à cocher cliquer. Si je clique ensuite sur la feuille (changement de sélection), alors le code sera exécuté, donc je sais que j'ai besoin d'un événement différent.

Il est assez facile de changer l'événement en "Checkbox1_Click()", mais je veux que cela fonctionne pour N'IMPORTE QUELLE case je clique. Je n'ai pas de chance après des jours de recherche et d'essai de différentes choses.

ici est le code que je suis en cours d'exécution jusqu'à présent

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
Dim i As Long 


For i = 3 To 11 
    Range("B" & i).Value = Range("c" & i) 
Next i 
    End Sub 

Toute aide serait appréciée.

+0

ici est un code que j'ai posté pour gérer plusieurs boutons .... voir si vous pouvez l'adapter à vos besoins ... https://stackoverflow.com/questions/46381935/change-activex- Command-button-color-back-to-previous-color-after-clicked/46396731 # 46396731 – jsotola

+0

btw: vous avez dit que vous ne pouviez pas exécuter le code du module de classe, mais vous n'avez pas envoyé de code qui fait référence à la classe modules. – jsotola

+0

pourquoi utilisez-vous une boucle pour assigner des valeurs? .... juste utiliser 'Range (" B3: B11 ") = Range (" c3: c11 "). Value' – jsotola

Répondre

0

cela fonctionne

' this goes into sheet code 

Private Sub Worksheet_Activate() 
    activateCheckBoxes 
End Sub 

.

' put all this code in class a module and name the class module "ChkClass" 

Option Explicit 

Public WithEvents ChkBoxGroup As MSForms.CheckBox 

Private Sub ChkBoxGroup_Change() 
    Debug.Print "ChkBoxGroup_Change" 
End Sub 

Private Sub ChkBoxGroup_Click() 
    Debug.Print "ChkBoxGroup_Click"; vbTab; 
    Debug.Print ChkBoxGroup.Caption; vbTab; ChkBoxGroup.Value 
    ChkBoxGroup.TopLeftCell.Offset(0, 2) = ChkBoxGroup.Value 

End Sub 

.

' this code goes into a module 

Option Explicit 

Dim CheckBoxes() As New ChkClass 
Const numChkBoxes = 20 
' 

Sub doCheckBoxes() 
    makeCheckBoxes 
    activateCheckBoxes 
End Sub 

Sub makeCheckBoxes()  ' creates a column of checkBoxes 

    Dim sht As Worksheet 
    Set sht = ActiveSheet 

    Dim i As Integer 
    For i = 1 To sht.Shapes.Count 
    ' Debug.Print sht.Shapes(1).Properties 
     sht.Shapes(1).Delete 
     DoEvents 
    Next i 

    Dim xSize As Integer: xSize = 2  ' horizontal size (number of cells) 
    Dim ySize As Integer: ySize = 1  ' vertical size 

    Dim t As Range 
    Set t = sht.Range("b2").Resize(ySize, xSize) 

    For i = 1 To numChkBoxes 
     sht.Shapes.AddOLEObject ClassType:="Forms.CheckBox.1", Left:=t.Left, Top:=t.Top, Width:=t.Width - 2, Height:=t.Height 
     DoEvents 
     Set t = t.Offset(ySize) 
    Next i 

End Sub 

Sub activateCheckBoxes()  ' assigns all checkBoxes on worksheet to ChkClass.ChkBoxGroup 

    Dim sht As Worksheet 
    Set sht = ActiveSheet 

    ReDim CheckBoxes(1 To 1) 

    Dim i As Integer 
    For i = 1 To sht.Shapes.Count 

     ReDim Preserve CheckBoxes(1 To i) 
     Set CheckBoxes(i).ChkBoxGroup = sht.Shapes(i).OLEFormat.Object.Object 

    Next i 

End Sub 
+0

Eureka! Ça marche!!!! Merci beaucoup! J'ai ajouté ce petit code au bas du module de classe pour que la colonne B corresponde à la colonne C chaque fois que l'on cliquait sur l'une des cases à cocher. Que Dieu vous bénisse, monsieur! – csmith222

+0

J'ai une autre question sur la prochaine étape avec ce code pour le faire fonctionner dans mon but principal. Je devine la façon dont je devrais aller à ce sujet est de l'afficher comme une question distincte et de référence à cette page? – csmith222

0

Tout ce dont vous avez besoin est de laisser l'événement _Click() de chaque case à cocher savoir que vous voulez exécuter l'événement Worksheet_SelectionChange. Pour ce faire, vous devez ajouter la ligne suivante dans tous les _Click() sous:

Call Worksheet_SelectionChange(Range("a1")) 

S'il vous plaît noter qu'il est hors de propos quelle gamme est passé à la sous SelectionChange puisque vous n'utilisez pas le Target dans votre code.

+0

Merci de votre effort pour répondre, mais une partie de l'idée était de ne pas avoir à écrire du code pour chaque case, car il y aura plus de 100 sur cette feuille. Mes doigts tremblent à la pensée! C'est une bonne idée cependant. Je reproche à votre réponse, mais apparemment, je n'ai pas assez de réputation pour que ce site permette aux autres d'être soumis à mes votes. : -/ – csmith222