Parser une multitude de fichiers Word dans un tableau Excel
Bonjour,
Tout d'abord merci à ceux et celles qui me viendront en aide.
Je précise que je n'ai de compétences VBA qu'à la compréhension et la lecture du code 8O.
Je vous expose donc mon problème :
J'ai un répertoire avec un gros millier de documents .doc et il m'est demandé de les mettre dans un Excel.
Tous ces documents sont formatés de manière que :
- La première page est une page de garde
- Les suivantes sont des annexes séparées par des sauts de pages.
A l'aide de différents posts sur le forum, j'ai repéré quelques morceaux de codes qui m'ont inspiré dans mes recherches, notamment les suivants issus de ce post:
[S]
Citation:
Envoyé par
SilkyRoad
bonjour
Boucler sur les paragraphes d'un document Word et les supprimer s'ils débutent par le mot "Test"
*************************************************************
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Option Compare Text
Sub supprimerParagraphe()
Dim WordApp As Word.Application
Dim WordDoc As Word.document
Dim cible As Paragraph
Set WordApp = New Word.Application
WordApp.Visible = True
Set WordDoc = WordApp.Documents.Open(ThisWorkbook.Path & "\Doc1.doc")
WordDoc.bookmarks("\StartOfDoc").Select
For Each cible In WordDoc.Paragraphs
cible.Range.Select
If Trim(cible.Range.Words(1)) = "Test" Then cible.Range.Delete
Next cible
End Sub |
Un autre exemple qui supprime les paragraphes de façon conditionnelle
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Sub supprimerParagraphes_Conditionnel()
'boucle sur les 3 premiers paragraphes du document Word :
'si la cellule A1<>1 alors suppression du paragraphe 1
'si la cellule A2<>1 alors suppression du paragraphe 2
'si la cellule A3<>1 alors suppression du paragraphe 3
Dim WordApp As Word.Application
Dim WordDoc As Word.Document
Dim i As Integer
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = True
Set WordDoc = WordApp.Documents.Open("C:\monDocument.doc")
For i = 3 To 1 Step -1
If Cells(i, 1) <> 1 Then _
WordDoc.Paragraphs.Item(i).Range.Delete
Next i
End Sub |
Extraire les phrases / lignes de plusieurs documents Word
************************************************
Chaque ligne est importée dans une colonne différente du classeur
la macro Excel boucle sur tous les documents Word (fermés) pour
ouvrir les fichiers
transferer chaque phrase/ligne dans une colonne differente du classeur
puis refermer le document
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| Sub importLignesDocumentWord()
Dim Fichier As String, Direction As String
Dim wordApp As Word.Application
Dim wordDoc As Word.Document
Dim i As Byte
Dim j As Integer
Application.ScreenUpdating = False
Direction = ThisWorkbook.Path
Fichier = Dir(Direction & "\*.doc")
Do While Fichier <> "" 'boucle sur tous les fichiers .doc du repertoire
Set wordApp = CreateObject("Word.Application")
wordApp.Visible = False
Set wordDoc = wordApp.Documents.Open(Direction & "\" & Fichier) 'ouverture documents word
j = j + 1
For i = 1 To wordDoc.Sentences.Count 'boucle sur les phrases/lignes de chaque document
Cells(j, i) = _
Application.WorksheetFunction.Substitute(wordDoc.Sentences(i).Text, Chr(13), "")
Next i
wordDoc.Close False 'fermeture documents word
wordApp.Quit
Set wordDoc = Nothing
Set wordApp = Nothing
Fichier = Dir
Loop
End Sub |
Mon objectif est donc :
- pour chacun des fichiers, de générer une ligne dans un excel.
- Pour la première page (page de garde) remplir les colonnes suivant les phrases comme l'indique SilkyRoad.
- Pour les pages suivantes, remplir les colonnes avec le contenu que se trouve entre deux sauts de pages, suivant l'idée de SilkyRoad.
Je suis donc preneur de toutes pistes afin d'avancer.
Cdlt,
Merci d'avance
Aerial
Lister les .doc d'un répertoire dans une feuille Excel en VBA
Bonjour Aerial,
Citation:
Envoyé par
Aerial
pour chacun des fichiers, de générer une ligne dans un excel.
Vous pouvez immédiatement démarrer le projet en définissant ses constantes nommées.
Répondez en décrivant chaque constante. Où trouvez les documents Word ?
A partir de quelle ligne et dans quelle colonne on va renseigner la feuille Excel ?
Pour y mettre quoi ? Le nom du document ? Son chemin complet ? Son nombre de lignes ? De pages ? L'auteur ? Sa date ?
1. Démarrez avec la maquette DocName() et surtout ses constantes
Ouvrir Excel. Une feuille vide apparaît.
Ouvrir le Visual Basic Editeur par Alt+F11, c-a-d :
Excel menu "Outils" > "Macro" > "Visual Basic Editeur" (VBE)
Cliquez sur le VBE menu "Insérer" > "Module".
Dans la fenêtre propriétés du Module1, renommer "Module1" en "ModDoc"
Dans la fenêtre d'Edition de ModDoc, copier-coller :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| Option Explicit
Public Const pathDoc = "\*.doc" ' Chemin relatif des documents Word dans le répertoire du .xls
Public Const indSheetDoc = 1 ' Feuille "Document"
Public Const rowName = 2 ' Première ligne pour inscrire le nom du document
Public Const colName = 1 ' Colonne des noms de document
Function DocName() As Integer
Dim fileName As String, indRow As Integer, nbrDoc As Integer
fileName = Dir(ThisWorkbook.Path + pathDoc)
indRow = rowName
nbrDoc = 0
While fileName <> ""
Cells(indRow, colName) = fileName
indRow = indRow + 1
nbrDoc = nbrDoc + 1
fileName = Dir
Wend
Debug.Print "Nombre de documents traités : " & nbrDoc
DocName = nbrDoc
End Function |
Sauvegardez le projet dans DocMngt.xls
2. Testez DocName() maintenant
Copier deux documents Word .doc dans le même répertoire que DocMngt.xls
Dans la fenêtre d'Exécution immédiate (Ctlr+G) du VBE, copier-coller et valider par ENTER :
Nombre de documents traités : 2
2
La fonction DocName() a retourné le nombre de documents traités. Soit 2 s'il y a deux documents Word .doc dans le même répertoire que DocMngt.xls
Dans la feuille de calcul "Feuil1" renommée en "Document" dans DocMngt.xls,
DocName() a écrit en A2 le nom du premier document Word et en A3 le nom du second .doc.
Si ce n'est pas ce qui est attendu, mieux décrire les spécifications de votre projet en s'aidant de la définition de constantes en VBA que vous pouvez commenter. Etablir ce qui est attendu avec un niveau de description analogue à cette maquette. Comparez comment une seule ligne de votre spécification a pu générer les quatre chapitres de cet article.
3. Adaptez DocName() selon votre contexte
Si vous choisissez de définir où trouver les .doc par un chemin absolu en remplaçant :
Code:
Public Const pathDoc = "\*.doc" ' Chemin relatif des documents Word dans le répertoire du .xls
par :
Code:
Public Const pathDoc = "C:\MesDocuments\*.doc" ' Chemin absolu des documents Word
Adaptez le chemin à votre répertoire de documents contenant une copie de quelques .doc pour le test de la maquette.
Il faudra changer le code pour récupérer chaque nom de document :
Code:
fileName = Dir(ThisWorkbook.Path + pathDoc)
peut devenir :
Code:
fileName = Dir(pathDoc)
4. Définir le projet avec précision
Après avoir réussi cette étape volontairement la plus simple possible, définir avec le même niveau de précision ce que l'on veut extraire de la page de garde et où dans la feuille Excel on veut traiter ces informations.
Définir dans votre réponse de nouvelles constantes de rangée, de colonne, et éventuellement un nouveau n° de feuille si on doit ranger ces informations dans une nouvelle feuille.
Idem pour la gestion des annexes. Définir avec précision en donnant un exemple minimal ce qu'il y a à extraire sans divulguer un contenu sensible.
Une seule ligne de description n'est pas suffisante, car à partir de :
Citation:
Envoyé par
Aerial
- Pour les pages suivantes, remplir les colonnes avec le contenu qui se trouve entre deux sauts de page
Si on doit recopier le contenu des pages suivantes, hors la page de garde, dans des colonnes (notez l'imprécision à résoudre par des constantes) comme il y a "un gros millier de documents .doc", on risque de faire exploser la ou les feuilles Excel si on ne spécifie pas le possible contenu à extraire, s'il faut extraire certains mots clés, s'il y a des tables, des mises en forme particulière (bold, italic, color), des schémas ou des images, des notes de bas de page, des hyperliens, etc.
Dans chaque cas, précisez ce qu'il convient de faire pour simplifier le problème.
___________
En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert http://www.developpez.net/forums/ima.../vote1left.gif ci-dessous.