VBA - contrôle du contenu de texte enrichi en zone de texte
Bonjour,
Je souhaite remplir un document Word à partir de données contenues dans un fichier Excel. Pour cela j'ai placé des contrôles du contenu de texte enrichi dans mon document Word. Tout fonctionne très bien excepté quand le contrôle se situe dans une zone de texte. Dans ce cas, il n'est pas détecté.
J'utilise le code suivant :
Dim wrdDoc As Word.Document
Dim ctrl As Object
'la partie ci-dessous entre For each ctrl et Next ctrl passe en revue tous les contrôles de contenu de texte enrichi du document word
'ouvert et les complète
For Each ctrl In wrdDoc.ContentControls
If ctrl.Type = 0 Then
Set Cell = ActiveSheet.Rows(1).Find(ctrl.Title)
'la première ligne de l'onglet source de données continent les titres et balises. Ces deux informations doivent être identiques 'dans les propriétés du contrôle sur Word.
If Not Cell Is Nothing Then ctrl.Range.Text = Cell.Offset(j)
'le contrôle est rempli par les données contenues dans la ligne en cours avec la colonne correspondant au contrôle
End If
Next ctrlQuelqu'un a une idée ?
Salut,
On peut voir deux fichiers modèles (Word et Excel) ?
Cordialement.
Bonjour,
Ci-dessous les fichiers tests à placer dans un même dossier.
Depuis mon message j'ai trouvé une réponse sur un forum anglais. Les zones de textes seraient à traiter d'une autre manière en ajoutant d'autres lignes de code :
'------------------------------------Remplissage des contrôles de contenu de texte enrichi---------------------------
'la partie ci-dessous entre For each ctrl et Next ctrl passe en revue tous les contrôles de contenu de texte enrichi du document word
'ouvert et les complète
For Each ctrl In wrdDoc.ContentControls
If ctrl.Type = 0 Or ctrl.Type = 1 Then
Set Cell = ActiveSheet.Rows(1).Find(ctrl.Title)
'la première ligne de l'onglet source de données continent les titres et balises. Ces deux informations doivent être identiques 'dans les propriétés du contrôle sur Word.
If Not Cell Is Nothing Then ctrl.Range.Text = Cell.Offset(j)
'If Not Cell Is Nothing Then ctrl.TextFrame.TextRange.Text = Cell.Offset(j)
'le contrôle est rempli par les données contenues dans la ligne en cours avec la colonne correspondant au contrôle
End If
Next ctrl
On Error Resume Next
'pour traiter les contrôles dans les zones de texte
For Each shp In wrdDoc.Shapes
For Each ctrl In shp.TextFrame.TextRange.ContentControls
If ctrl.Type = 0 Or ctrl.Type = 1 Then
Set Cell = ActiveSheet.Rows(1).Find(ctrl.Title)
'la première ligne de l'onglet source de données continent les titres et balises. Ces deux informations doivent être 'identiques dans les propriétés du contrôle sur Word.
If Not Cell Is Nothing Then ctrl.Range.Text = Cell.Offset(j)
'le contrôle est rempli par les données contenues dans la ligne en cours avec la colonne correspondant au contrôle
End If
Next ctrl
Next shpCa me pose plusieurs problèmes :
- Sans "On error resume next" j'ai un message d'erreur "Erreur d'execution 5917 : Cet objet ne prend pas en charge le texte joint". En effet, il essaie de traiter des images reconnue comme shape qui ne contiennent pas de texte et donc pas contrôle de contenu. Y-a-t-il une autre façon de faire ?
- En appliquant ce code sur ma version Office 2019 tous les contrôles de contenu se remplissent. Lorsque que je l'utilise au boulot, sur une version Office 365, la macro tourne parfaitement jusqu'au bout. Mais quand j'ouvre le fichier final, les contrôles dans les zones de texte ne sont pas remplis...
Merci d'avance pour vos retours :D
Désolé, mais avec ces nouvelles données, ça dépasse mes compétences. J'espère que quelqu'un viendra t'aider !
Amicalement.
Bonjour,
J'ai relancé ma macro sous Office 365 ce matin et ça fonctionne. Grand mystère...
Toujours le soucis avec "Erreur d'execution 5917 : Cet objet ne prend pas en charge le texte joint" sans explication mais avec "On error resume next" ça passe.
Du coup sujet résolu avec mon code plus haut
Si vous avez des éléments de réponse, je suis preneur.
Merci à tous !
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Ce test supplémentaire devrait résoudre votre problème
'pour traiter les contrôles dans les zones de texte
For Each shp In wrdDoc.Shapes
If shp.Type = msoAutoShape Or shp.Type = msoTextBox Then
For Each ctrl In shp.TextFrame.TextRange.ContentControls
If ctrl.Type = 0 Or ctrl.Type = 1 Then
Set Cell = ActiveSheet.Rows(1).Find(ctrl.Title)
'la première ligne de l'onglet source de données continent les titres et balises. Ces deux informations doivent être 'identiques dans les propriétés du contrôle sur Word.
If Not Cell Is Nothing Then ctrl.Range.Text = Cell.Offset(j)
'le contrôle est rempli par les données contenues dans la ligne en cours avec la colonne correspondant au contrôle
End If
Next ctrl
End If
Next shpMerci beaucoup thev !
Ca fonctionne à la perfection