Bonjour à tous,
Je travaille sur un fichier dont l'objectif est de synthétiser des infos contenues dans un dossier contenant une très longue liste de fichiers word, pour la majorité similaires. Les informations que je cherche peuvent être à plusieurs endroits dans la page et n'ont pas un format fixe, elle peuvent sous les formes suivantes (où les "x" sont des chiffres de 0 à 9 :
- Exxxx-xxx
- F#xxxx-xxx
- F#Exxxx-xxx
J'aimerais donc pouvoir récupérer toutes les instances de ces éléments, associées à chaque fois au nom du fichier qui la contient.
Après qqs recherches, je suis tombé sur ce très bon tuto : http://www.gcexcel.com/vba-importer-des-donnees-de-word-vers-excel/ sur lequel je me suis basé. Je fais cependant face à problème principal : Les wildcards * et ? que j'utilise pour remplacer mes chiffres ne semblent pas marcher, pas plus si je tente avec [0-9]. j'ai surtout l'impression que ces caractères sont considérés comme des caractères comme les autres, puisque la macro me renvoie tout simplement le premier caractère de la page quand je cherche une chaine du type "E*-*".
Sub Importation_Donnees_Word()
' -- Déclaration des variables
Dim wb As Workbook 'classeur Excel dans lequel on importe les données
Dim ws As Worksheet 'onglet Excel dans lequel on importe les données
Dim sChemin As String 'répertoire contenant les fichiers Word
Dim sNomFichier As String 'nom du fichier Word
Dim WApp As Object, WDoc As Object, WSel As Object
Dim i As Integer
' -- Initialisation des variables
Set wb = ThisWorkbook
Set ws = wb.Sheets(1) 'on sauvegarde dans la 1re feuille
'sChemin = ChoisirRepertoire & "\" 'fonction pour choisir le répertoire contenant les fichier Word
sChemin = ThisWorkbook.Path & "\" 'si les fichiers Word se trouvent dans le même répertoire que le fichier Excel
sNomFichier = Dir(sChemin & "*.doc*") 'pour ouvrir tous les fichiers .doc*. 1er fichier.
Set WApp = CreateObject("Word.Application") 'pour créer un objet Word
WApp.Visible = False 'ne pas afficher Word pendant l'exécution
i = ws.Range("A" & Rows.Count).End(xlUp).Row + 1 '1re ligne où on va écrire les données dans le fichier Excel
Application.ScreenUpdating = False
' -- Boucle sur les fichiers
Do While Len(sNomFichier) > 0
Set WDoc = WApp.Documents.Open(sChemin & sNomFichier) 'ouvre le document Word
Application.StatusBar = "Écriture ligne " & i 'message dans Excel pour voir la progression
' Nom du fichier
ws.Cells(i, 1) = Right(Left(sNomFichier, 18), 6)
' No de facture (par la fonction FIND)
WApp.Selection.HomeKey unit:=6 'Retourne au début du fichier Word
WApp.Selection.Find.ClearFormatting 'on "vide la mémoire" de la fonction Recherche
WApp.Selection.Find.Execute "a" 'On trouve le texte cherché
Set WSel = WApp.Selection 'sélection du texte trouvé
ws.Cells(i, 2) = WSel 'colle la valeur dans la cellule
i = i + 1 'prochaine ligne
WDoc.Close False 'fermer le document Word sans enregistrer
sNomFichier = Dir 'prochain document
Loop
SortieNormale:
Application.ScreenUpdating = True
WApp.Quit 'Fermer l'instance de Word
Application.StatusBar = False 'Remise à zéro de la barre d'état
End Sub
Je vous joins un document word vierge avec les 3 types d'éléments à chercher, ainsi que le fichier Excel actuellement utilisé. Je précise que j'ai découvert le VBA avec ce fichier, mes bases en programmation me permettent de le comprendre, mais pas de l'améliorer suffisamment.
Merci beaucoup pour votre aide précieuse.