Récupérer des informations de Word vers Excel
Bonjour,
J'ai un code qui me permet d'automatiser le remplissage de document word à partir d'Excel grâce à la création de contrôles de contenus ayant pour balise les mêmes informations que les en-tête de colonne.
Je souhaite à présent inverser le sens en récupérant les données déjà présentes dans ces contôles de contenu directement sur une nouvelle ligne Excel mais je ne parviens parviens pas à trouver une solution fonctionnelle.
Auriez-vous une idée svp?
Voici le code orginal qui marche pour le remplissage d'Excel vers Word
Sub remplissage_doc()
Dim WordApp As Object, WordDoc As Object, ctrl As Object
Dim nom_fichier As String
Set WordApp = CreateObject("word.application")
WordApp.Visible = True
nom_fichier = CreateObject("Wscript.Shell").SpecialFolders("MyDocuments") & "\essai01.docx"
Set WordDoc = WordApp.Documents.Open(nom_fichier)
'entête document
For Each ctrl In WordDoc.Sections(1).Headers(1).Range.ContentControls
GoSub remplissage_ctrl_text
Next ctrl
'corps document
For Each ctrl In WordDoc.ContentControls
GoSub remplissage_ctrl_text
Next ctrl
'sortie procédure
Exit Sub
remplissage_ctrl_text:
If ctrl.Type = 0 Then
Set cell = ActiveSheet.Rows(1).Find(ctrl.Tag)
If Not cell Is Nothing Then
ctrl.Range.Text = cell.Offset(ActiveCell.Row - 1)
ctrl.Range.Font.ColorIndex = 2 'couleur bleue
End If
End If
Return
End SubBonjour Atomic0329
Avez-vous déjà entendu parler du "Publipostage"
Vous avez des ces idées parfois
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
A mon avis, votre demande s'apparente à celle formulée par ArnaudLBRD, à savoir remplir par formulaire les champs d'un document Word et générer ce formulaire à partir des champs présents dans ce document.
J'y ai apporté réponse dans ce post :
Merci pour vos réponses.
Ce n'est pas vraiment du publipostage j'ai besoin du coup.
J'ai été voir sur le lien mais le problème résolu ne rejoint pas forcément le mien.
Le remplissage des contrôles de contenu sur Word à partir du fichier Excel "exemple.xlsm" marche parfaitement comme vous pouvez le voir avec le fichier "essai01.docx" qui sert de modèle de remplissage. Il suffit de sélectionner une cellule sur la ligne dont on souhaite utiliser les informations pour le remplissage puis lancer la macro.
L'idée maintenant est de récupérer toutes les données déjà saisies dans les contrôles de contenu dans "essai02.docx" sur une nouvelle ligne (ligne 3) vide à la suite sur la Feuille1 du même fichier Excel "exemple.xlsm". Ainsi, à partir d'une macro "Importer données" on pourra sélectionner le fichier "essai02.docx" dont on souhaite récupérer les données à partir de la boite de dialogue qui s'affiche et la copie des informations se fera à dans A3, B3, C3 dans le cas précis. Et ainsi de suite si j'ai d'autres documents du même type que "essai02.docx".
Je vous joint les trois fichiers pour que ma demande soit plus claire.
Pour exécuter la macro "Remplissage doc" chez vous, pensez à changer juste le path_working par votre chemin d'accès au fichier "essai01.docx".
Merci.
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour Thev,
Merci pour ta correction du code, il marche bien pour importer les données.
Cependant, quand j'importe de nouvelles données, celles déjà présentes sur la ligne 2 s'écrasent automatiquement.
Serait-il possible d'importer chaque fois sur une nouvelle ligne vide à partir d'un repère (la colonne A par exemple) les données récupérées ?
Exemple: si j'importe les données de "essai02.docx", je veux que les informations se positionnent sur la ligne 1 si cette dernière est vide, pour "essai03.docx" sur la ligne 2 si elle est vide, ainsi de suite.
Je pense qu'il faut utiliser cette ligne de code mais je ne sais pas trop à quel niveau le positionner pour l'intégrer dans la macro :
Sheets("Feuil1").Range("A456541").End(xlUp).Row + 1Merci encore pour ton aide.
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
ci-dessous code modifié
Sub Importation_donnees()
Dim nom_fichier As String, fichier As Object
Dim wdoc As Word.Document, ctrl_text As Word.ContentControl
Dim cell As Range, ligne As Integer
'Affiche la boîte de dialogue "Ouvrir"
nom_fichier = Application.GetOpenFilename("Tous les fichiers (*.doc*),")
'On sort si aucun fichier n'a été sélectionné ou si l'utilisateur
'a cliqué sur le bouton "Annuler", ou sur la croix de fermeture.
If nom_fichier = "Faux" Or nom_fichier = Empty Then MsgBox "aucun fichier sélectionné": Exit Sub
'Assigne le fichier ouvert et vérifie que c'est un document Word
Set fichier = GetObject(nom_fichier)
If Not fichier.Application.Name Like "*Word" Then MsgBox "fichier ouvert non Word": fichier.Close: Exit Sub
Set wdoc = fichier
'Première ligne vide de la feuille active
ligne = ActiveSheet.Columns("A").Find("").Row
'Récupérer le texte dans les controles de contenu en recherchant dans l'en-tete du Fichier sélectionné
'les informations seront récupérées et rangées sur une meme ligne en suivant les en-tete de colonne
For Each ctrl_text In wdoc.Sections(1).Headers(1).Range.ContentControls
GoSub remplissage_feuille
Next ctrl_text
'Récupérer le texte dans les controles de contenu en recherchant dans le corps du Fichier selectionné
'les informations seront récupérées et rangées sur une meme ligne en suivant les en-tete de colonne
For Each ctrl_text In wdoc.ContentControls
GoSub remplissage_feuille
Next ctrl_text
'fermeture application Word et sortie procédure
wdoc.Application.Quit
Exit Sub
remplissage_feuille:
If ctrl_text.Type = 0 Then
Set cell = ActiveSheet.Rows(1).Find(ctrl_text.Tag)
If Not cell Is Nothing Then Cells(ligne, cell.Column) = ctrl_text.Range.Text
End If
Return
End SubLe code fonctionne très bien et répond à mon besoin.
Merci pour ta réactivité Thev.