VBA recherche texte dans fichiers

bonjour a tous,

désolé pour mon niveau...je débute

je vous explique donc :

j'ai des dizaines de dossiers contenant des dizaines de sous dossiers contenants eux mêmes des dizaines de fichiers. (ça fait plusieurs milliers)

chacun des ces fichiers est un programme (lisible en TXT)pour une machine qui utilise des outils. chaque prg utilise environ une quarantaine d'outils

mon but, est de savoir pour chaque pgm, quels outils il utilise e; t inversement pour chaque outil, savoir dans quel pgm il est utilisé.

dans les pgm chaque numéro d'outil est précédé par le même suffixe : M106T

un ancien collègue avait réussi a faire quelque chose (VBA) mais c'est fastidieux ... pratique pour un pgm ou deux mais pas pour des milliers.

je ne peut malheureusement transmettre aucun fichier.

voila... si quelqu'un a une idée ; une solution; ou des suggestions je suis preneur

n’hésitez pas non plus si vous avez des questions, je n'ai peut être pas été très claires dans mes explications.

pour rappel j'ai pas un gros niveau.

merci d'avance.

Bonjour,

Par excel c'est possible même s'il doit y avoir d'autres solutions/logiciels.

Il est possible de balayer tous les dossiers t sous-dossiers, de lire tous les fichiers en mode texte, toutes les lignes et repérer les couples. L temps dépend aussi de la quantité de données, mais le programme peut être simple. Pour cela il faudrait quand même avoir un extrait d'un fichier texte au moins.

voici le code que j'utilise aujourd'hui.

dans l'absolu ça fonctionne mais je ne peux faire de recherche que sur 10 fichiers à la fois et les manipulations sont très fastidieuses , l’idéal serait de pouvoir sélectionner simplement le dossier hôte de tous ces fichiers

Private Sub CommandButton1_Click()

Application.ScreenUpdating = False

Dim IndexFichier As Integer
Dim MonFichier As String
Dim ContenuLigne As String
Dim I As Long
Dim Deb As Long
Dim M As Long
Dim J As Long
Dim Outil As String
Dim P As Integer
Dim Out As Integer
Dim txt As String
Dim Col As Integer

Col = Cells(2, 2).Value + 2 'Attribution de la colonne à modifier

'Purge la colonne avant de remplir
Cells(3, Col).Clear
For I = 5 To 503
Cells(I, Col).Clear
Next I

MonFichier = Cells(2, 1)
Cells(3, Col).Value = MonFichier
Cells(3, Col).WrapText = True
txt = Dir(MonFichier)
If txt = "" Then 'verifier que le fichier existe
MsgBox "Fichier introuvable"
Else

IndexFichier = FreeFile()
Open MonFichier For Input As #IndexFichier 'ouvre le fichier

While Not EOF(IndexFichier) '
Line Input #IndexFichier, ContenuLigne ' lecture du fichier ligne par ligne: la variable "ContenuLigne" contient le contenu de la ligne active
P = InStr(1, ContenuLigne, ")")
If P = 0 Then 'Vertifie que l'on est pas dans un commentaire
Deb = InStr(1, ContenuLigne, "T") 'Trouve la présence d'un T et retourne sa position
M = InStr(1, ContenuLigne, "M") 'Trouve la présence d'un M et retourne sa position
J = InStr(1, ContenuLigne, "M201") 'elimine le cas d'une operation de detction bris d'outil
If Deb <> 0 And M <> 0 And J = 0 Then
If M < Deb Then
Outil = Mid(ContenuLigne, Deb + 1)
'MsgBox Outil
Out = CInt(Outil)
Cells(Out + 4, Col).Value = "X"
Else
Outil = Mid(ContenuLigne, Deb + 1, M - Deb - 1)
Out = CInt(Outil)
Cells(Out + 4, Col).Value = "X"
End If
End If
End If
Wend

Close #IndexFichier ' ferme le fichier
End If

Application.ScreenUpdating = True
End Sub

Private Sub Parcourir_Click()
With Application.FileDialog(msoFileDialogOpen)
.AllowMultiSelect = False
.Show
Cells(2, 1).Value = .SelectedItems(1)
End With

End Sub

Private Sub Purger_Click()
Dim I As Integer
Dim Col As Integer

Col = Cells(2, 2).Value + 2 'Attribution de la colonne à modifier
Cells(3, Col).Clear
For I = 5 To 503
Cells(I, Col).Clear
Next I
End Sub

pour ceux qui du type de fichier analyser, en voici un exemple :

G01G40X-9.192Y-71.879
G00Z2
X-8.207Y40.093 
G1Z-4
G01G41X-10.554Y30.956D190
G03X0.64Y25.992R16 
G02X0.64Y25.992I-0.64J-25.992
G03X12.066Y30.398R16 
G01G40X10.172Y39.64
G00Z2

( CONT EBA 233*300.3 FR020 ) 
(HT-17.5 ET RETRAIT) 
N10M106T10 
M98P2019 
G00G54X-201.5Y110.5M03B0S5400
G43Z10H10M8T188
#100=-8.5
M98P2192L3 
G00Z10.

( DECROT RESTE MATIERE A 17.5 080 )
N188M106T188 
M98P2019 
G0G90G54X-234.5Y-215.5M03B0S24

pour rappel, mon besoin est de récupérer tous les T... après le M106

Si je comprends bien ton code, il ne prend qu'un seul fichier, c'est bien cela ?

Dans ce cas, pourquoi écris-tu ?

mais je ne peux faire de recherche que sur 10 fichiers à la fois

D'autre part, qu'est-ce qui est fastidieux ?

les manipulations sont très fastidieuses

quelles manipulations ?

Voici une fonction qui ouvre tous les fichiers xlsx d'un dossier les uns après les autres.

Option Explicit

Sub balayagedossier()
Dim wbk1 As Workbook, wbk2 As Workbook
Dim MonRepertoire, Repertoire As FileDialog, monFichier$

    Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
    Application.FileDialog(msoFileDialogFolderPicker).Title = "Choix du répertoire de stockage des fichiers générés"
    Repertoire.Show
    If Repertoire.SelectedItems.Count = 0 Then Exit Sub
    MonRepertoire = Repertoire.SelectedItems(1) & "\"

    Set wbk1 = ThisWorkbook
    monFichier = Dir(MonRepertoire & "*.xlsx")

    Do While monFichier <> ""
        Debug.Print monFichier
        Set wbk2 = Workbooks.Open(MonRepertoire & monFichier)
        ' ici le traitement du fichier ouvert
        Application.DisplayAlerts = False
            wbk2.Close False
        Application.DisplayAlerts = True
        monFichier = Dir
    Loop

End Sub

Par 10, car chaque recherche retranscrit le résultat dans une colonne du tableau et que celui ci a10 colonnes. Oui ce nombre pourrait être modifié.

Fastidieux car la manipulation pour rechercher le fichier qu'on veux analyser, copier la cible dans la colonne,puis la purger et ce pour chaque fichier...je t'assure c'est long et les manipulations nombreuses. Je t'envoie une capture d'écran cette après-midi.

pour ton code, au delà du fait que je ne sait absolument pas comment l'intégrer dans ma macro, mes fichiers ne sont que des .doc pas des .xlsx ...

comme je le demandais as-tu fichier .doc (tu es sûr de l'extension ?), et as-tu ton tableau dans lequel tu veux mettre tes données ?

Un programme plus simple qui va à l'infini ...

Option Explicit
Sub importer()
Dim chemin$, Rep As FileDialog

    ' choix du répertoire
    Set Rep = Application.FileDialog(msoFileDialogFolderPicker)
    Application.FileDialog(msoFileDialogFolderPicker).Title = "Choix du répertoire des fichiers ..."
    Rep.Show
    If Rep.SelectedItems.Count = 0 Then Exit Sub
    chemin = Rep.SelectedItems(1) & "\"

    ' effacement données
    If Not ActiveSheet.ListObjects(1).DataBodyRange Is Nothing Then ActiveSheet.ListObjects(1).DataBodyRange.Delete

    ' lecture
    lire chemin

End Sub

Sub lire(chemin As String)
Dim fichier$, ContenuLigne$, ligne As Long, outil$, p%, m%, j%, deb%
ligne = 2
fichier = Dir(chemin & "*.txt")
Do While fichier <> ""
    Open chemin & fichier For Input As #1
        Do While Not EOF(1)
            Line Input #1, ContenuLigne
            outil = ""

            ' ton code ====================
            p = InStr(1, ContenuLigne, ")")
            If p = 0 Then                          'Vertifie que l'on est pas dans un commentaire
                deb = InStr(1, ContenuLigne, "T")  'Trouve la présence d'un T et retourne sa position
                m = InStr(1, ContenuLigne, "M")    'Trouve la présence d'un M et retourne sa position
                j = InStr(1, ContenuLigne, "M201") 'elimine le cas d'une operation de detction bris d'outil
                If deb <> 0 And m <> 0 And j = 0 Then
                    If m < deb Then
                        outil = Mid(ContenuLigne, deb + 1)
                    End If
                End If
            End If
            ' fin de ton code =============

            If outil <> "" Then
                Cells(ligne, 1) = fichier
                Cells(ligne, 2) = outil
                ligne = Range("A" & Rows.Count).End(xlUp).Row + 1
            End If
        Loop
    Close #1
    fichier = Dir
Loop

End Sub
19prog-outils.xlsm (22.03 Ko)

cette proposition te convient-elle ?

salut,

capture rech outil

désolé j'ai du mettre le sujet en attente quelques jours.

déjà merci de ton retour.

j'ai essayé ton pgm (sans rien modifier à la macro) et soucis !

le type de fichier n'est pas pris en compte . le chemin ouvre bien les dossiers et sous dossiers mais n'affiche pas le fichier pour ensuite pouvoir l'analyser.

dois je modifier quelque chose a ton code ?

j'ai vérifié une chose... le type de fichier est ...: fichier ! il n'y a pas d'extension .doc ou .txt .

possible de les lires en utilisant le bloc notes

je te joint une capture d’écran du fonctionnement actuel.

merci de ton aide

comme je le demandais as-tu fichier .doc (tu es sûr de l'extension ?)

C'était une question de base ! donc ni .doc, ni .txt, rien !

Je vais reconstruire un ensemble de fichiers.

Option Explicit
Sub importer()
Dim chemin$, Rep As FileDialog

    ' choix du répertoire
    Set Rep = Application.FileDialog(msoFileDialogFolderPicker)
    Application.FileDialog(msoFileDialogFolderPicker).Title = "Choix du répertoire des fichiers ..."
    Rep.Show
    If Rep.SelectedItems.Count = 0 Then Exit Sub
    chemin = Rep.SelectedItems(1) & "\"

    ' effacement données
    If Not ActiveSheet.ListObjects(1).DataBodyRange Is Nothing Then ActiveSheet.ListObjects(1).DataBodyRange.Delete

    ' lecture
    lire chemin

End Sub

Sub lire(chemin As String)
Dim fichier$, ContenuLigne$, ligne As Long, outil$, p%, m%, j%, deb%
ligne = 2
fichier = Dir(chemin)
Do While fichier <> ""
    Open chemin & fichier For Input As #1
        Do While Not EOF(1)
            Line Input #1, ContenuLigne
            outil = ""

            ' ton code ====================
            p = InStr(1, ContenuLigne, ")")
            If p = 0 Then                          'Vertifie que l'on est pas dans un commentaire
                deb = InStr(1, ContenuLigne, "T")  'Trouve la présence d'un T et retourne sa position
                m = InStr(1, ContenuLigne, "M")    'Trouve la présence d'un M et retourne sa position
                j = InStr(1, ContenuLigne, "M201") 'elimine le cas d'une operation de detction bris d'outil
                If deb <> 0 And m <> 0 And j = 0 Then
                    If m < deb Then
                        outil = Mid(ContenuLigne, deb + 1)
                    End If
                End If
            End If
            ' fin de ton code =============

            If outil <> "" Then
                Cells(ligne, 1) = fichier
                Cells(ligne, 2) = outil
                ligne = Range("A" & Rows.Count).End(xlUp).Row + 1
            End If
        Loop
    Close #1
    fichier = Dir
Loop

End Sub
27prog-outils.xlsm (22.46 Ko)
10outillllls.zip (1.94 Ko)

Une fois le tableau obtenu, tu peux faire des tris, des recherches, des filtres et des TCD pour t'aider dans l'analyse.

SUPER CA MARCHE SUPER BIEN !!!!

GENIAL MILLE MERCI

le zip ....il sert a quoi ? stp

et je viens de me rendre compte de quelque chose...

dans certain pgm la syntaxe est differentes, parfois au lieu de M106 T... , c'est indiqué T...M106 ou T...M06 ou encore M06 T...

sans abuser de ta bonté peux tu encore m'aider ?

et également ,

l'analyse se fait actuellemnt a partir du sous dossier qui contient le pgm

mais est il possible de faire l'analyse en ne sélectionnant que le dossier hôte qui contient les sous dossiers eux mêmes contenant d'autres sous dossiers puis enfin les pgm ?

l'analyse se fait actuellemnt a partir du sous dossier qui contient le pgm

mais est il possible de faire l'analyse en ne sélectionnant que le dossier hôte qui contient les sous dossiers eux mêmes contenant d'autres sous dossiers puis enfin les pgm ?

je vais faire une lecture récursive dans toute la nomenclature de dossiers à partir d'un dossier sélectionné, ok

dans certain pgm la syntaxe est differentes, parfois au lieu de M106 T... , c'est indiqué T...M106 ou T...M06 ou encore M06 T...

peux-tu me donner un exemple d'une ligne complète ? ou des exemples ...

le zip était une collection de fichiers que je me suis faite

voici quelques exemples des pgm :

(DEBUT PROGRAMME)
(FRAISE 025 ISC R4 )
M106T11

M98P2086
M63
G90G00G54X-70.011Y-74.782M03S6000B0
M61
G43H11Z10.M08T66
G01Z-8.F2000
G01G41D11X-45.667Y-64.269F1000

(TOURTEAU 080 ALU)
M106T66

M98P2086
M63
G90G00G54X-41.636Y-161.480M03S4000B0
M61
G43H66Z10.M08T6

(DEBUT PROGRAMME)
(PROGRAMME OK LE 30/01/2019)


(TOURTEAU 050 DIAMANT)
(SURFACAGE PATTE)
N6T6M106

T10
M98P1500
M63
G0G90G54X0Y-235B0.M3S10000
M61

(FRAISE 020 COURTE)
(PATTE B-160.211)
N10T10M106

T29
M98P1500
M63
G0G90G54.1P6X21.515Y-212.395B-160.211M3S6500
M61
G43H10Z263.929M8

(FORET A POINTER O16 B180)
(POINTAGE 4M6 B180)
N63T63M106

T65
M98P1500
M63

(FRAISE O16 EB OREILLES)
M106T18

T11
M98P5100
M63

Comme j'avais repris ton programme, cela veut dire qu'il n prenait déjà pas tout en compte.

Si je comprends bien, il faut prendre la ligne où on trouve M106 ?

oui "M106" mais aussi "M06" et on viens de m'apprendre que cela peut aussi etre "M6"

Tu as avec ceci toutes les lignes qui contiennent M106 de tous les dossiers contenus dans le dossier choisi, à l'état brut (toute la ligne) > tu peux ensuite avec des formules classiques en tirer ce que tu souhaites.

Option Explicit
Dim ligne As Long
Sub importer()
Dim chemin$, Rep As FileDialog

    ' choix du répertoire
    Set Rep = Application.FileDialog(msoFileDialogFolderPicker)
    Application.FileDialog(msoFileDialogFolderPicker).Title = "Choix du répertoire des fichiers ..."
    Rep.Show
    If Rep.SelectedItems.Count = 0 Then Exit Sub
    chemin = Rep.SelectedItems(1) & "\"

    ' effacement données
    If Not ActiveSheet.ListObjects(1).DataBodyRange Is Nothing Then ActiveSheet.ListObjects(1).DataBodyRange.Delete

    ' lecture
    ligne = 2
    lire chemin

End Sub

Sub lire(chemin As String)
Dim fso, SourceFolder, SubFolder
Dim fichier$, ContenuLigne$
Set fso = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = fso.GetFolder(chemin)

fichier = Dir(chemin)
Do While fichier <> ""
    Open chemin & fichier For Input As #1
        Do While Not EOF(1)
            Line Input #1, ContenuLigne
            If InStr(1, ContenuLigne, ")") = 0 Then  'Vertifie que l'on est pas dans un commentaire
                If InStr(1, ContenuLigne, "M106") <> 0 Then
                    Cells(ligne, 1) = fichier
                    Cells(ligne, 2) = ContenuLigne
                    ligne = Range("A" & Rows.Count).End(xlUp).Row + 1
                End If
            End If
        Loop
    Close #1
    fichier = Dir
Loop

For Each SubFolder In SourceFolder.subfolders
    lire SubFolder.Path & "\"
Next SubFolder

End Sub
25prog-outils.xlsm (22.55 Ko)
Rechercher des sujets similaires à "vba recherche texte fichiers"