2015-11-08 2 views
0

Je souhaite limiter ma sélection Treeview à 8 nœuds enfants maximum. j'ai un code suivant il décoche la case mais immédiatement après sélectionne la boîte encore. une idée?.Limiter la sélection Treeview VBA

Merci.

Private Sub TreeView1_NodeCheck(ByVal node As MSComctlLib.node) 

If Not node.Parent Is Nothing Then 
    If node.Checked = True Then 
     couT = couT + 1 
     If couT <= 8 Then 
      'MsgBox node.Text & "_Checked !" 
     Else 
      node.Checked = False 
     End If 
    Else 
     couT = couT - 1 
    End If 
End If 

End Sub

+0

-t-il se comporte la même si vous démarrez votre sub avec Application.EnableEvents = False et terminez avec Application.EnableEvents = True'? Vous devez le faire de toute façon, car votre code appelle à nouveau la même routine lorsque vous décochez la case, ce qui n'est pas souhaitable. –

+0

@ A.S.H C'est ce que je pensais au début, mais le '_NodeCheck' de TreeView n'est pas déclenché par le code vba (je l'ai traversé). Ne sont déclenchés que via l'interface graphique, et les modifications apportées à la propriété 'Checked' de ce nœud dans le sous-système seront ignorées. – PatricK

Répondre

0

Cet objet TreeView NodeCheck ne gère pas des événements comme d'autres objets, le réglage du .Checked = False n'a pas de sens après la fin du Sous. Cependant, il existe un travail autour de l'utilisation d'une variable publique et Sub dans un module normal, et le plus important Application.OnTime pour faire la décocher (ne déclenche pas le _NodeCheck lorsqu'il est fait dans la macro).

Ainsi, dans votre module UserForm avec l'objet TreeView:

Private couT As Integer 
Private Const MAX_NODES As Integer = 8 

Private Sub TreeView1_NodeCheck(ByVal Node As MSComctlLib.Node) 
    Dim bSchUncheckNode As Boolean 
    bSchUncheckNode = False 
    If Not Node.Parent Is Nothing Then 
     If Node.Checked = True Then 
      couT = couT + 1 
      If couT <= MAX_NODES Then 
       'Debug.Print Node.Text & "_Checked !" 
      Else 
       couT = couT - 1 ' Assuming the scheduled task completes successfully (or move the variable to standard module). 
       bSchUncheckNode = True 
       iNodeToUncheck = Node.Index 
      End If 
     Else 
      couT = couT - 1 
     End If 
    End If 
    ' Schedule Sub call only if it should uncheck a node 
    If bSchUncheckNode Then Application.OnTime Now, "UncheckNode" 
End Sub 

Sub UserForm_Initialize() 
    couT = 0 ' Resets the counter to zero 
    '... Other things you have had 
End Sub 

Dans un module de vba normal (changer le nom de l'objet UserForm et objet TreeView en conséquence):

Public iNodeToUncheck As Integer 

Sub UncheckNode() 
    ' Assuming this is only be called by the UserForm scheduling 
    UserForm1.TreeView1.Nodes(iNodeToUncheck).Checked = False 
End Sub 
+0

merci encore une fois Patrick. – Shan