OVH Cloud OVH Cloud

recherche de fichier et ajout dans une table

4 réponses
Avatar
fth
Bonjour,

Voici ce que je cherche à faire:

je liste tous les fichiers .mdb du réseau;
pour chaque fichier trouvé, il devrait mettre le path dans le champ "Apath"
et le nom du fichier dans "Aname".
Ci dessous, le code que j'utilise et qui fonctionne pour la recherche mais
calle pour l'ajout dans la table.

merci pour toute aide qui me permettra de résoudre ce petit tracas!

Frédéric


Private Sub Command6_Click()

Set rs = Me.RecordsetClone


Set fs = Application.FileSearch
With fs
.LookIn = "C:\Documents and Settings\fre-thi\My Documents"
.SearchSubFolders = True
.filename = "*.mdb"
If .Execute() > 0 Then
MsgBox "There were " & .FoundFiles.Count & _
" file(s) found."
For i = 1 To .FoundFiles.Count
'MsgBox .FoundFiles(i)
rs.AddNew
Me.AppliName = Application.FileSearch.FoundFiles(i)
.Update
.Bookmark = .LastModified

Next i


Else
MsgBox "There were no files found."
End If
End With
End Sub

4 réponses

Avatar
fth
Bonsoir,

je pose des questions...mais je continue à chercher!

j'ai trouvé ce code qui semble donner de bons résultats:

Function FileExistDir(strDir As String, strTable As String, strField As
String)

Dim intFile As Integer
Dim strFile As String


intFile = 0: strFile = ""


With Application.FileSearch
.SearchSubFolders = True
.LookIn = strDir: .FileName = "*.mdb"
If .Execute > 0 Then
For intFile = 1 To .FoundFiles.Count
strFile = .FoundFiles(intFile)
strFile = Right(strFile, Len(strFile) - (Len(strDir)) + 1)
CurrentDb.Execute "INSERT INTO [" & strTable & "] " _
& "([" & strField & "])" _
& "SELECT """ & strFile & """ ;"
Next
End If
End With

End Function

Toutefois, il y a certaines petites choses qui me tracasse:

pas moyens d'isoler la partie nom de fichier de celle du path.
et c'est précisement ce dont j'ai besoins.
De plus, le résultats n'est pas toujorus le meme quand je lance l'appli.

Donc, comment puis-je mettre dans le champ "Apath" le path et dans "Aname"
juste le nom du fichier?

Vous me retireriez une sacrée épine du pied!

d'avance merci et bonne soirée,

Frédéric
Avatar
Eric
Bonjour Frédéric,

Pour obtenir le nom du fichier et son extension, remplaces :
strFile = Right(strFile, Len(strFile) - (Len(strDir)) + 1)
qui contenait une erreur d'ailleurs, c'était plutot :
strFile = Right(strFile, Len(strFile) - (Len(strDir) + 1)), prob de
fermeture de parenthese sur le Len()
par :

strFile = Right(strFile, Len(strFile) - InStrRev(strFile, ""))
qui te donnera le résultat escompté lorsque tu passes en revue les sous
répertoires.
(Access2k et + pour la fonction InStrRev. Si tu as Access97, je crois
que sur le site de Jessy tu trouveras une fonction équivalente)

Pour avoir le chemin complet seul :
strPath = Left(strFile, InStrRev(strFile, ""))

Si tu veux stocker le chemin et le nom du fichier dans ta table, il faut
modifier le sql et aussi la fonction. Dans celle-ci tu passes en
argument le nom du champ, ce n'est pas necessaire. De plus ton sql n'est
pas bon.
Fais un truc du genre :
"INSERT INTO [" & strTable & "] " _
& "(Apath,AFile)(APath,Aname)Values('" & strPath _
& "','" & Replace(strFile, "'", "") & "')"
(La fonction Replace est utilisée dans le cas ou un nom de fichier
contiendrait une ' - Access2k et +)

Ca donnerait un truc du genre :

Function FileExistDir(strDir As String, strTable As String)

Dim intFile As Integer, cpt As Long
Dim strFile As String, strPath As String
intFile = 0: strFile = ""

With Application.FileSearch
.SearchSubFolders = True
.LookIn = strDir: .FileName = "*.mdb"
If .Execute > 0 Then
For intFile = 1 To .FoundFiles.Count
strFile = .FoundFiles(intFile)
strPath = Left(strFile, InStrRev(strFile, ""))
strFile = Right(strFile, Len(strFile) - InStrRev(strFile, ""))
CurrentDb.Execute "INSERT INTO [" & strTable & "] " _
& "(Apath,Aname) Values('" & strPath _
& "','" & Replace(strFile, "'", "") & "')"
cpt = cpt + 1
Next
End If
End With
MsgBox cpt & " enregistrements écrits dans la table " & strTable
End Function

Attention au retour à la ligne intempestif sur le strFile !

J'espère que ca te fera un peu avancé.

PS1: j'ai lancé la fonction plusieurs fois sur les HDs et j'ai toujours
eu le même nombre de fichiers à chaque fois pour chacun des HDs.

PS2: L'exécution de l'instruction Currentdb.Execute ... peut se traduire
par des écritures "aléatoires", regardes a réponse de Pierre(3stone) au
post de Tonio : VBA : ma boucle For...Next s'exécute trop vite ?!! du
03/06 à 16:01

--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Bonsoir,

je pose des questions...mais je continue à chercher!

j'ai trouvé ce code qui semble donner de bons résultats:

Function FileExistDir(strDir As String, strTable As String, strField As
String)

Dim intFile As Integer
Dim strFile As String


intFile = 0: strFile = ""


With Application.FileSearch
.SearchSubFolders = True
.LookIn = strDir: .FileName = "*.mdb"
If .Execute > 0 Then
For intFile = 1 To .FoundFiles.Count
strFile = .FoundFiles(intFile)
strFile = Right(strFile, Len(strFile) - (Len(strDir)) + 1)
CurrentDb.Execute "INSERT INTO [" & strTable & "] " _
& "([" & strField & "])" _
& "SELECT """ & strFile & """ ;"
Next
End If
End With

End Function

Toutefois, il y a certaines petites choses qui me tracasse:

pas moyens d'isoler la partie nom de fichier de celle du path.
et c'est précisement ce dont j'ai besoins.
De plus, le résultats n'est pas toujorus le meme quand je lance l'appli.

Donc, comment puis-je mettre dans le champ "Apath" le path et dans "Aname"
juste le nom du fichier?

Vous me retireriez une sacrée épine du pied!

d'avance merci et bonne soirée,

Frédéric




Avatar
Eric
re Frédéric,

Bonsoir,

je pose des questions...mais je continue à chercher!



Ca, c'est un très bon signe ;-)

J'avais shunté ton 1er post :(

Donc si tu veux faire ca avec AddNew et Update, voila le code.
Un formulaire indépendant avec seulement un Bouton de commande et la
procédure sur l'évènement click. J'ai sorti la fonction FileExistDir2()
pour la rendre plus générale.

Private Sub Commande0_Click()
Dim strDir As String, strTable As String
strDir = InputBox("Chemin", "Demande d'informations")
strTable = InputBox("Nom de la table", "Demande d'informations")
If Len(strDir) = 0 Or Len(strTable) = 0 Then
MsgBox " Abandon de la procédure"
Exit Sub
End If
FileExistDir2 strDir, strTable ' appel de la fonction
End Sub

Function FileExistDir2(strDir As String, strTable As String)
Dim rst As DAO.Recordset
Dim intFile As Integer, cpt As Long
'Dim strFile As String, strPath As String
intFile = 0: strFile = ""
Set rst = CurrentDb.OpenRecordset(strTable)
With Application.FileSearch
.SearchSubFolders = True
.LookIn = strDir: .FileName = "*.mdb"
If .Execute > 0 Then
For intFile = 1 To .FoundFiles.Count
strFile = .FoundFiles(intFile)
strPath = Left(strFile, InStrRev(strFile, ""))
strFile = Right(strFile, Len(strFile) -
InStrRev(strFile, ""))
rst.AddNew
rst!Apath = strPath
rst!Aname = strFile
rst.Update
cpt = cpt + 1
Next
End If
End With
MsgBox cpt & " enregistrements écrits dans la table " & strTable
rst.Close
Set rst = Nothing
End Function

--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Bonjour,

Voici ce que je cherche à faire:

je liste tous les fichiers .mdb du réseau;
pour chaque fichier trouvé, il devrait mettre le path dans le champ "Apath"
et le nom du fichier dans "Aname".
Ci dessous, le code que j'utilise et qui fonctionne pour la recherche mais
calle pour l'ajout dans la table.

merci pour toute aide qui me permettra de résoudre ce petit tracas!

Frédéric


Private Sub Command6_Click()

Set rs = Me.RecordsetClone


Set fs = Application.FileSearch
With fs
.LookIn = "C:Documents and Settingsfre-thiMy Documents"
.SearchSubFolders = True
.filename = "*.mdb"
If .Execute() > 0 Then
MsgBox "There were " & .FoundFiles.Count & _
" file(s) found."
For i = 1 To .FoundFiles.Count
'MsgBox .FoundFiles(i)
rs.AddNew
Me.AppliName = Application.FileSearch.FoundFiles(i)
.Update
.Bookmark = .LastModified

Next i


Else
MsgBox "There were no files found."
End If
End With
End Sub


Avatar
Eric
arg,
Le compteur cpt sert à rien. Suffit de stocker le .FoundFiles.Count :(
Vrai dans les 2 fonctions évidemment.

De plus, je viens de lire sur le forum Word(MPFW) que le service
d'indexation des fichiers de XP (Options de recherche) ralentit le
traitement, donc à désactiver le cas échéant.
--
A+
Eric
http://users.skynet.be/mpfa/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr