Bonjour à tous,
Je suis nouveau ici, et en plein projet de base de données pour mon stage.
Petit topo rapide:
En gros le chef de projet veut pouvoir lier des fichiers (word, excel, etc...) aux propositions stoquées dans la base de données.
Les liens consistent uniquement en un Nom de fichier, un lien, et la reference de la proposition. Dans l'idée il voulait faire du drag and drop de fichiers sur une zone du formulaire avec recuperation des infos...Apres pas mal de recherche a droit a gauche, ca avait pas l'air simple, surtout quand on est pas un expert en API ou autre...
Du coup je poste ici ma version qui consiste en une controle TreeView qui liste tout les sous repertoire (et sous repertoire des sous repertoires) et fichiers d'un dossier donné, puis a partir de la, avec un control sur les checkboxes, on ajout les infos a une table:
/!\ Ne pas oublié d'activer les CheckBoxes du TreeView si vous voulez ajouter les données a une table/!\
La procédure sur le formulaire (Control TreeView nommée xTree):
La procédure sur un module
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 Form_Load() Dim nodCurrent As Node, objTree As TreeView Dim nodParent As Node, bk As String, Path MsgBox "Choosing a complexe folder / Drive may require a lot of time to be analyzed by Access", vbInformation + vbOKOnly, "Warning" Path = OpenedDirectory() If Path <> "" Then Set objTree = Forms!Explorer.xTree.Object Select Case Len(Path) Case 3 Set nodParent = objTree.Nodes.Add(, , , Replace(Path, "\", "")) Case Else Set nodParent = objTree.Nodes.Add(, , , Path) End Select nodParent.Bold = True AddBranch Path, objTree, nodParent End If End Sub
La procédure pour ouvrir le dossier racine (toujours dans le module)
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 Public Sub AddBranch(ByVal way As String, Tree As TreeView, ByVal nodSup As Node) Dim fso, MainFolder, ListFolder, Folder, File, ListFile Set fso = CreateObject("Scripting.FileSystemObject") Set MainFolder = fso.GetFolder(way) Set ListFolder = MainFolder.SubFolders For Each Folder In ListFolder On Error Resume Next Set nodCurrent = Tree.Nodes.Add(nodSup, tvwChild, , Folder.Name) nodCurrent.Bold = True AddBranch Folder, Tree, nodCurrent Next Set ListFile = MainFolder.Files For Each File In ListFile On Error Resume Next Tree.Nodes.Add nodSup, tvwChild, , File.Name Next End Sub
La procédure inspiré du FAQ avec la requete SQL pour ajouter a la table:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Public Function OpenedDirectory() As String Dim objShell As Object, objFolder As Object, oFolderItem As Object Set objShell = CreateObject("Shell.Application") Set objFolder = objShell.BrowseForFolder(&H0&, "Select the location of your files", &H1&) On Error Resume Next Set oFolderItem = objFolder.Items.Item If Err <> 0 Then Exit Function On Error GoTo 0 OpenedDirectory = oFolderItem.Path End Function
A mettre dans le formulaire, avec un bouton nommé NomBouton
Voila, il y a surement des optimisations possibles...et j'espère que ca pourra aider (jor j'aurai bien aimé faire en sorte que le treeview ne liste les repertoires inférieurs que lorsqu'on expand un noeud...) pour éviter d'avoir a tout charger la premiere fois...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Private Sub NomBouton_Click() Dim currentNode As MSComctlLib.Node 'parcours du node courrant 'Pour chaque node contenu dans la collection nodes de ton objet treeview For Each currentNode In xTree.Nodes 'Traitement du node courrant If currentNode.Checked Then DoCmd.RunSQL "INSERT INTO [T_Linked_docs] ([Name], [Link], [Proposal Reference]) VALUES ('" & currentNode.text & "','" & currentNode.FullPath & "','" & ref.Value & "')" End If Next End Sub
Voila bonne lecture, et toujours dans l'attente de commentaire
--------Edit--------
J'ai répondu a mon idée ^^
suffit de mettre le code suivant:
et de faire les retouches dans le reste (enlever la recursivité dans la fonction AddBranch, et adapter les paramètres chargés lors de l'ouverture du Formulaire)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Private Sub xTree_NodeClick(ByVal sNode As Object) Dim objTree As TreeView Set objTree = Forms!Explorer.xTree.Object If sNode.Bold Then If sNode.Child Is Nothing Then AddBranch sNode.FullPath & "\", objTree, sNode End If End If End Sub
Partager