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:
Je précise que l'arbre charge un dossier avec sous dossier sur plusieurs niveau de mon ordinateur, voici le code:
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
Trouver sur ce forum: https://www.developpez.net/forums/d1...hiers-listbox/
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:
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
PS: nécessite: ListBox1 & Treeview1& TextBox1
Mais cela ne répond pas exactement à ce que je cherche.
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
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:
J'ai essayer de "fusionner" les deux codes, mais sans succès.
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
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:
Pouvez vous m'aider à résoudre le problème? ou à me donner des pistes?
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
En vous remerciant.
Partager