Liste de recherche

bomaletoi Messages postés 11 Date d'inscription mardi 18 août 2009 Statut Membre Dernière intervention 19 août 2009 - 18 août 2009 à 14:56
bomaletoi Messages postés 11 Date d'inscription mardi 18 août 2009 Statut Membre Dernière intervention 19 août 2009 - 19 août 2009 à 10:33
Bonjour à tous,

J'ai un petit probleme sous VBA...
Je souhaite faire des recherches de fichiers contenant des expressions...

Plus clairement je souhaite repeter des recherches de fichiers que je ferai normalement sous windows...

Mais j'ai plusieurs centaines de recherches à effectuer... c'est donc tres long.

En glanant des infos à droite et a gauche j'ai un code qui semble fonctionner. mais malheureusement pas exhaustivement.

Voici le code :
-----------------------------------------
Option Explicit
Dim i As Long
Sub essai()
Dim chemin As String
Dim t
i = 2
t = Timer
Application.ScreenUpdating = False
Do While Cells(i, 1) <> ""
chemin = ThisWorkbook.Path
RechercheFichiers chemin, Cells(i, 1)
i = i + 1
Loop
MsgBox "Le traitement a duré " & Timer - t & " secondes"
End Sub

Sub RechercheFichiers(chemin, monfichier)
Dim fs
Dim f As Long
Set fs = Application.FileSearch
fs.LookIn = chemin
fs.SearchSubFolders = True
fs.Filename = monfichier
If fs.Execute() > 0 Then
'MsgBox "Il y a: " & fs.FoundFiles.Count & " Fichier(s)"
For f = 1 To fs.FoundFiles.Count
'MsgBox fs.FoundFiles(f)
ActiveSheet.Hyperlinks.Add Cells(i, 2), fs.FoundFiles(f), , , fs.FoundFiles(f)
Next f
Else
MsgBox "Pas de fichiers!"
End If
End Sub
-------------------------------

dans un fichier excel :
en colonne A ma liste de mots à chercher dans les fichiers d'un repertoire et sous repertoires...

En colonne B le lien vers le fichier dans lequel apparait le mot.

PB :
- je souhaite supprimer la msgBox "pas de fichiers !" et avoir un travail en arriere plan et une information de travail terminé...
- j'ai essayé... mais il semble qu'il yai un probleme. il arrive (assez souvent) que le code ne trouve pas certains "mots" qui existent bel et bien..

Je suis un peu dans la panade...

Help please !


Merci à tous pour votre aide !

21 réponses

cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
18 août 2009 à 15:18
Bonjour
Il y a une erreur quelque part, nulle part je ne vois de recheche de mot ce qui est recherché c'est nomfichier sur l'arborescence chemin
Je veux bien essayer de comprendre
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
18 août 2009 à 15:25
on peut remplacer
MsgBox "Pas de fichiers!"
par
cells(i,2).Value= "pas de fichiers!"
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
18 août 2009 à 15:29
pour rechercher des mots dans des fichiers c'est un peu compliqué surtout pour les documents Word, pour les images,...
Il faut commencer par ouvrir les fichiers binaires savoir comment ils sont codés ... et pas sur qu'une extension de fichier corresponde à un seul format, des milliers de format de fichiers, ...pas si simple
Si c'est ce que tu veux, tu es effectivement dans une grosse panade
0
bomaletoi Messages postés 11 Date d'inscription mardi 18 août 2009 Statut Membre Dernière intervention 19 août 2009
18 août 2009 à 15:31
Bonjour,
Merci de ta remarque
Humm humm

ha... ben effectivement je n'avais pas fait attention...

le hasard de mes recherches a fait que je pensais que ca marchait.. enfin

bon ok

et ca parait compliqué de faire la modification ?

VBA je sais le lire mais pas le parler

j'etais sur que ca fonctionnait...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bomaletoi Messages postés 11 Date d'inscription mardi 18 août 2009 Statut Membre Dernière intervention 19 août 2009
18 août 2009 à 15:36
j'avais pas vu toutes tes reponses.
En fait ce que je comprends pas c'est que l'on peut faire "facilement" une recherche de "noms de fichiers" mais pas pas de "fichiers contenant"...
Dans la mesure ou c'est si simple sous windows...
0
bomaletoi Messages postés 11 Date d'inscription mardi 18 août 2009 Statut Membre Dernière intervention 19 août 2009
18 août 2009 à 15:52
je suis un peu "depanadé" si on dit que l'on ne cherche que dans du .doc ?
0
bomaletoi Messages postés 11 Date d'inscription mardi 18 août 2009 Statut Membre Dernière intervention 19 août 2009
18 août 2009 à 16:12
Ce code recherche le contenu...
tu ou quelqu'un(e) saurai comment l'adapter ?

------------------------------------
Sub essai2()
contenu = InputBox("contenu cherché?")
masque = InputBox("Masque *.xls")
If masque "" Then masque "*.*"
repertoire = InputBox("Répertoire?")
If repertoire "" Then repertoire "c:"
If contenu <> "" Then
RechercheContenu repertoire, contenu, masque
End If
End Sub

Sub RechercheContenu(chemin, contenu, masque)
Dim FS, I As Integer
Set FS = Application.FileSearch
FS.NewSearch
FS.LookIn = chemin
FS.SearchSubFolders = True
FS.TextOrProperty = contenu
FS.Filename = masque
FS.MatchTextExactly = False
If FS.Execute > 0 Then
For I = 1 To FS.FoundFiles.Count
MsgBox Application.FileSearch.FoundFiles(I)
Next I
End If
End Sub

--------------------------------------------
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
18 août 2009 à 16:36
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
18 août 2009 à 16:57
donc je confirme la solution de fenton fonctionne pour des recherches dans des documents Word (microsoft office seulement)
création d'une classe et d'un module d'appel

Sinon il faut avoir un serveur qui indexe des documents, il y a google desktop,...
http://www.codeproject.com/KB/IP/seekafile.aspx
mais on ne peut pas automatiser en VBA la production d'un fichier excel qui donne la liste des fichier Word, Excel, Texte, CSV qui contienne un ou plusieurs mots, je demande toujours à voir....
0
bomaletoi Messages postés 11 Date d'inscription mardi 18 août 2009 Statut Membre Dernière intervention 19 août 2009
18 août 2009 à 17:28
Ok je crois avoir lu certaines infos.
...
Il semble que l'on ne puisse pas avoir de liste de resultats.
A savoir pour un terme, tous les fichiers trouvés.
Penses tu que le fait de n'avoir qu'un seul resultat est faisable ?
Dans le principe de la rechercheV...
Le calcul "s'arrete" des la premiere occurence trouvée... ?
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
18 août 2009 à 17:37
as tu essayé le solution fenton avec succès?
Si on peut avoir tous les fichiers *.doc qi contiennent un mot clé dans un répertoire fixée, à étendre à toute l'arborescence
Je confirme : rechercheV.: le calcul "s'arrete" des la premiere occurence trouvée. mais rien n'epeche de définir récursivement des tableaux de recherche pour la fonction RechercheV mais là aussi un peu d'huile de coude est nécessaire.
0
bomaletoi Messages postés 11 Date d'inscription mardi 18 août 2009 Statut Membre Dernière intervention 19 août 2009
18 août 2009 à 17:52
Je viens d'essayer...


ca bug à :
.LookIn = Me!txtSearchFolder
il veut pas du "me"

et je ne sais pas ce que cela mean "me"
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
19 août 2009 à 09:02
Il y a 2 me!
Me c'est la fenetre courante : cela evite de mettre son nom pour accéder aux champs
évidemment dans lon test je les ai remplacer par la chaine à rechercher et le dossier de recherche ici "Me!txtSearchFolder"
0
bomaletoi Messages postés 11 Date d'inscription mardi 18 août 2009 Statut Membre Dernière intervention 19 août 2009
19 août 2009 à 09:30
Bonjour !
ok
et ca a marché ?

moi rien a faire il me dit utilisation incorect du mot "Me"

... le boulet...


en clair j'y arrive pas..
tu as un code toi defini a m'envoyer pour l'essai ?
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
19 août 2009 à 09:35
le fichier clFileSearch.cls
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "clFileSearch"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False



' May 24, 2009
' Created by David W. Fenton
' David Fenton Associates
' http://dfenton.com/DFA/

'Option Compare Database
Option Explicit

Dim strLookIn As String
Dim strFileName As String
Dim strTextOrProperty As String
Dim mcolFoundFiles As Collection

Public Sub NewSearch()
strLookIn = vbNullString
strFileName = vbNullString
strTextOrProperty = vbNullString
Set mcolFoundFiles = New Collection
End Sub

Public Property Let LookIn(pstrLookin As String)
strLookIn = pstrLookin
End Property

Public Property Get LookIn() As String
LookIn = strLookIn
End Property

Public Property Let FileName(pstrFileName As String)
strFileName = pstrFileName
End Property

Public Property Get FileName() As String
FileName = strFileName
End Property

Public Property Let TextOrProperty(pstrTextOrProperty As String)
strTextOrProperty = pstrTextOrProperty
End Property

Public Property Get TextOrProperty() As String
TextOrProperty = strTextOrProperty
End Property

Public Property Get FoundFiles() As Collection
Set FoundFiles = mcolFoundFiles
End Property

Private Function SearchFileForText(strFileName As String, _
strSearchText As String) As Boolean On Error GoTo errHandler
Dim intFile As Integer
Dim strFileContent As String

intFile = FreeFile
Open strFileName For Binary As #intFile
strFileContent = String(LOF(intFile), " ")
Get #intFile, , strFileContent
SearchFileForText = InStr(strFileContent, strSearchText)

exitRoutine:
Close #intFile
Exit Function

errHandler:
MsgBox Err.Number & ": " & Err.Description, vbExclamation, _
"Error in clFileSearch.SearchFileForText()"
Resume exitRoutine
End Function

Public Function Execute() As Integer
On Error GoTo errHandler
Dim strFileMatch As String
Dim strRowSource As String

strFileMatch = Dir(strLookIn & "" & strFileName)
If Len(strFileMatch) = 0 Then
Exit Function
End If
Do Until Len(strFileName) = 0
If Len(strFileMatch) = 0 Then Exit Do
If SearchFileForText(strLookIn & "" & strFileMatch,
strTextOrProperty) Then
mcolFoundFiles.Add strLookIn & "" & strFileMatch, _
strLookIn & "" & strFileMatch
End If
strFileMatch = Dir
Loop
Execute = mcolFoundFiles.Count

exitRoutine:
Exit Function

errHandler:
MsgBox Err.Number & ": " & Err.Description, vbExclamation, _
"Error in clFileSearch.Execute()"
Resume exitRoutine
End Function

Private Sub Class_Initialize()
Set mcolFoundFiles = New Collection
End Sub
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
19 août 2009 à 09:38
mon module NewMacros.bas quit cherche le mot arvin dans les fichiers *.doc sous c:\temp

Attribute VB_Name = "NewMacros"

Sub search()

Dim clsFileSearch As New clFileSearch

With clsFileSearch
.NewSearch
.LookIn = "C:\TEMP" 'Me!txtSearchFolder
.FileName = "*.doc"
.TextOrProperty = "arvin" 'Me!txtSearchString
If .Execute() > 0 Then
For i = 1 To .FoundFiles.Count
strFileName = Dir(.FoundFiles(i), vbDirectory)
If Right(strFileName, 3) = "doc" Then
intRowCount = intRowCount + 1
strRowSource = strRowSource & "; " & strFileName
'Debug.Print "FileSearch: " & strFileName
End If
Next i
'Me!lstFilesFound.RowSource = Mid(strRowSource, 3)
'Me!lstFilesFound.Visible = True
Else
MsgBox "There were no matches."
End If
End With

End Sub
0
bomaletoi Messages postés 11 Date d'inscription mardi 18 août 2009 Statut Membre Dernière intervention 19 août 2009
19 août 2009 à 09:48
je suis tellement limite que j'arrive a rien...
0
bomaletoi Messages postés 11 Date d'inscription mardi 18 août 2009 Statut Membre Dernière intervention 19 août 2009
19 août 2009 à 09:52
comment t'envoyer mon fichier ?
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
19 août 2009 à 09:58
où est la difficulté?

je viens de trouver aussi un projet de grep en basic ici
http://www.freevbcode.com/ShowCode.ASP?SearchString=grep&ID=6290
0
cs_loulou69 Messages postés 672 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 2 juin 2016 1
19 août 2009 à 10:10
le projet de freevbcode recherche un texte mais uniquement dans des fichiers texte
dans le module wGrep.bas
fonction GrepAFile
remplacer la ligne
GrepMe = GrepMe+ GrepAFile(buffer, pBehviour, pTextbox)
par:
GrepMe = GrepMe+ GrepAFile(pBehavior.FleGet(pIndex+1), pBehavior, pTextBox)

et dans la fonction InitGraphics() de la form frmwGrep supprimer la sortie sur l'étiquette ErrorHandler pour nos lecture des images associées aux boutons de commande


Avec les deux projets on a une rechrche dans les documents office et une recherche dans les documents texte en les fusionnant on devrait avoir un joli petit projet
0
Rejoignez-nous