Importation de données de Word vers Excel

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.

Bonjour à tous,

je suis conscient que ma demande est assez complexe, mais je n'arrive vraiment pas à avancer en particulier à cause de mon problème de wildcards qui sont considérés comme des caractères. j'ai pourtant vu qu'il suffisait d'y ajouter "~" pour avoir normalement ce comportement. Pourriez-vous m'éclairer ?

Merci d'avance

Up !

Personne d'autre n'a eu ce souci ? Je suppose qu'il s'agit d'un petit détail mais je suis perdu !

Je me permets de revenir vers vous à nouveau, quelqu'un aurait-il une piste pour m'aider ?

Merci d'avance

Bonjour,

aucun souci avec les wildcards, encore faut-il bien les utiliser !

Exemple pour Exxxx-xxx : E????-???

Ensuite il faut vérifier le fichier retourné par la fonction Dir avec l'opérateur Like

Bonjour Marc, merci de ta réponse.

Les x que j'ai mis dans mon message ici ne sont que des exemples pour illustrer mon problème, j'ai déjà essayé avec des ? ou * dans mon code, sans succès.

Marc L a écrit :

Ensuite il faut vérifier le fichier retourné par la fonction Dir avec l'opérateur Like

Je t'avoue que je ne connais pas bien l'opérateur, mais je l'avais vu lors de mes recherches et en effet cela semblait être la solution. J'avais essayé de l'ajouter mais j'avais des bugs.

J'avais essayé d'intégrer ceci dans mon code, mais le With semblait poser problème. Je ne connais pas assez la syntaxe VBA pour adapter le code.

With Selection.Find
.Text = "\[TB[DR]-[0-9]{3}\]"   'Exemple d'un tuto
        .Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = True
.MatchSoundsLike = False
.MatchAllWordForms = False
End With

Selection.Find.Execute

Je ne vois pas le lien entre la recherche dans une feuille de calculs et la fonction VBA Dir !

Et les wildcards peuvent être différents d'une méthode à une autre …

Marc L a écrit :

Je ne vois pas le lien entre la recherche dans une feuille de calculs et la fonction VBA Dir !

Et les wildcards peuvent être différents d'une méthode à une autre …

Tu fais sans doute référence à cette ligne de code ?

sNomFichier = Dir(sChemin & "*.doc*")  

Je ne recherche pas dans une feuille de calcul, mais dans un ensemble de documents Word, dans lesquels il faut chercher un par un ma chaîne. Ce code n'est pas de moi, je ne saurai pas justifier l’utilisation d'une fonction ou d'une autre.

Ah d'accord, tu viens dans un forum dédié Excel poser une problématique Word ‼

Voir alors l'aide de Word quant à la méthode utilisée …

Non absolument pas Marc, je sais que je suis à la bonne place ! Comme précisé dans le titre et dans mon premier post, je souhaite importer ces informations provenant de centaines de docs Word dans un fichier Excel unique, sans avoir à les ouvrir ; ce qui relève du VBA Excel comme tous les tutos à ce sujet que j'ai pu voir, et les autres sujets similaires sur ce forum.

Malheureusement je n'arrive pas à avancer malgré mes efforts.

Non, c'était en référence au code précédant mon message …

Marc L a écrit :

Non, c'était en référence au code précédant mon message …

Tu fais référence à cette ligne peut-être ?

.Text = "\[TB[DR]-[0-9]{3}\]" 

L'ensemble cité dans mon précédent message est un bloc que j'ai récupéré dans un autre exemple, je n'avais pas modifié en détail la chaîne recherchée puisque j'essayais d'avoir un code non bugué pour commencer. Je ne vois cependant pas la référence à la fonction Dir, s'agit'il du [DR] ?

Oui mais justement ce code n'a pas l'air d'être pour Excel …


Copier / Coller n'est pas coder !

Marc L a écrit :

Oui mais justement ce code n'a pas l'air d'être pour Excel …


Copier / Coller n'est pas coder !

Ah ok ! Je n'arrive pas à faire tourner ma macro en remplaçant par un mot non plus.

Me conseilles-tu de tenter d’utiliser cette option, avec le .MatchWildcards = True, ou plutôt le Like, sachant que je ne maîtrise aucune des deux fonctions.

Je n'en sais rien car dans deux versions d'Excel et dans la documentation électronique de la version 2013 cela n'existe pas ‼

Ouvre ton aide VBA concernant cette méthode et, si elle existe dans ta version d'Excel, tu auras donc l'information …


L'avenir n'appartient pas qu'à ceux se levant tôt mais surtout à ceux se donnant la peine de lire …

J'ai réussi à faire marche mon code avec :

WApp.Selection.HomeKey unit:=6
WApp.Selection.Find.ClearFormatting  
With WApp.Selection.Find
.Text = "[0-9]{4}-[0-9]{3}"
.MatchWildcards = True
End With

Set WSel_a = WApp.Selection

WApp.Selection.Find.Execute   
ws.Cells(i, 2) = WSel_a 

je passe maintenant à l'étape suivante, qui est de chercher dans les documents l'occurrence suivante différente du type "[0-9]{4}-[0-9]{3}", sachant que l'on peut en avoir jusqu'à 12. J'ai bricolé quelque chose pour avoir au moins la 2e occurence, mais qui ne marche pas bien puisque la 2e colonne ne se remplit pas. J'y ai défini une seconde variable, mais j'aimerais ne pas avoir à en définir 12 du même type, je peux très bien en avoir une seule comme 12.

Peut-être une boucle qui cherche dans chaque document avant de passer au suivant, ou la fonction FindNext que je viens de découvrir ?

WApp.Selection.HomeKey unit:=6
WApp.Selection.Find.ClearFormatting 
With WApp.Selection.Find
.Text = "[0-9]{4}-[0-9]{3}"
.MatchWildcards = True
End With

Set WSel_b = WApp.Selection

WApp.Selection.Find.Execute 
If WSel_b = WSel_a Then
   ws.Cells(i, 3) = ""
   Else: ws.Cells(i, 3) = WSel_b
End If

Je suis désolé de revenir encore là dessus, mais je n'arrive pas à mettre en place ma recherche multiple. Pourriez-vous me donner une piste de recherche svp ?

Merci encore

Rechercher des sujets similaires à "importation donnees word"