Bonjour à tous,

Je suis débutant en VBA, et je cherche désespérément comment faire cette fonctionnalité.
Ce que je désire, c'est effectuer une recherche via TextBox1 dans Treeview1 mais uniquement sur les 1er enfant du dossier (root) choisi, et copier le résultat (Nœuds parents et noeuds enfants) dans TreeView2 ou le top de régénérer TV1 .
Le but étant d'avoir une recherche dynamique sur les nœuds enfants et d'afficher sur le TV2 le ou les résultats les plus proches.
Début du code de la Form:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
Option Compare Text ' Option comparaison de chaine texte + A=a; B=b, si manquant minuscule et majuscule sont considéré comme différent
Dim tw As MSComctlLib.TreeView, fs 'Declaration ajout de la bibliothéque
Je précise que l'arbre charge un dossier avec sous dossier sur plusieurs niveau de mon ordinateur, voici le code:
Trouver sur ce forum: https://www.developpez.net/forums/d1...hiers-listbox/

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Private Sub UserForm_Initialize()
  pere = "C:\xxxxxx" ' Dossier choisi
  If pere = "C:\" Then Stop
  Set tw = Me.TreeView1
  p = InStrRev(pere, "\"): tmp = Mid(pere, p + 1)
  tw.Nodes.Add(, , "NoeudMat" & pere, tmp).Expanded = True  ' Racine arbre
  Set fs = CreateObject("Scripting.FileSystemObject")
  Set dossier_racine = fs.GetFolder(pere)
  Lit_dossier dossier_racine, 1
End Sub
 
Sub Lit_dossier(ByRef dossier, ByVal niv)
    pere = dossier.Path
    For Each d In dossier.SubFolders
      fils = d.Path
      p = InStrRev(fils, "\"):   tmp = Mid(fils, p + 1)
      tw.Nodes.Add("NoeudMat" & pere, tvwChild, "NoeudMat" & d.Path, tmp).Expanded = False
      Lit_dossier d, niv + 1
    Next
End Sub
Lors de mes recherches sur internet, j'ai trouvé un code permettant une recherche des nœuds (parent, enfants petits enfants, etc) et d'afficher le résultat dans une ListBox, voici le code:
PS: nécessite: ListBox1 & Treeview1& TextBox1

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 
   Dim N As Node
 
   ListBox1.Clear
 
   If TextBox1.Text = vbNullString Then Exit Sub
 
   TextBox1.Locked = True
 
   For Each N In TreeView1.Nodes
 
      If N.Text Like "*" & TextBox1.Text & "*" Then
         ListBox1.AddItem N.Text
      End If
   Next
 
   TextBox1.Locked = False
 
End Sub
Mais cela ne répond pas exactement à ce que je cherche.
Lors d'un autre recherche, j'ai trouvé un code permettant de copier l'ensemble des nœuds de TV1 vers TV2 via Btn de Commande, voici le code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
Private Sub CommandButton1_Click()
Dim Nodx As Node
         With TreeView2
         .Nodes.Clear
         Set .ImageList = TreeView1.ImageList
         For Each Nodx In TreeView1.Nodes
 
         If Nodx.Parent Is Nothing Then
         .Nodes.Add(, , Nodx.Key, Nodx.Text, Nodx.Image, Nodx.SelectedImage).Expanded = True
         'MsgBox Nodx.key
         Else
         'MsgBox Nodx.Parent.key & Nodx.Text
 
         .Nodes.Add Nodx.Parent.Key, tvwChild, Nodx.Key, Nodx.Text, Nodx.Image, Nodx.SelectedImage
         End If
 
         Next
        End With
End Sub
J'ai essayer de "fusionner" les deux codes, mais sans succès.
En effet, j'ai beau tourner le code dans tout les sens, j'ai soit une erreur car il ne trouve pas le nœud parent lors de la création de l'enfant, soit j'ai tout les résultats de recherche qui apparaissent au même niveau.
Je pense les conditions sont mal faites ou organisés.

Voila un aperçu de ce que j'ai fait:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 Dim Nodx As Node
            With TreeView2
            .Nodes.Clear
If TextBox1.Text = vbNullString Then Exit Sub
 Set .ImageList = TreeView1.ImageList
            For Each Nodx In TreeView1.Nodes 'Boucle
 
 
              If Nodx.Text Like "*" & TextBox1.Text & "*" Then 'Si similitude alors
                    If Nodx.Parent Is Nothing Then 
                        .Nodes.Add , , Nodx.Key, Nodx.Text, Nodx.Image, Nodx.SelectedImage 'Crée le noeud parent
                    Else
                        .Nodes.Add Nodx.Parent.Key, tvwChild, Nodx.Key, Nodx.Text, Nodx.Image, Nodx.SelectedImage 'crée le noeud enfant
 
                    End If
 
                End If
            Next
         End With
End Sub
Pouvez vous m'aider à résoudre le problème? ou à me donner des pistes?
En vous remerciant.