Publipostage Image Word et regroupement
Bruno83200_6929 Messages postés 282 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 23 octobre 2024 - 18 sept. 2024 à 19:02
- Publipostage Image Word et regroupement
- Publipostage mail - Accueil - Word
- Word et excel gratuit - Guide
- Espace insécable word - Guide
- Supprimer une page word - Guide
- Organigramme word - Guide
13 réponses
13 sept. 2024 à 14:01
Bonjour,
Le champ INCLUDEPICTURE peut poser un problème lorsqu'il essaie de charger une image avec une URL vide ou incorrecte, ce qui génère l'erreur "Erreur ! nom du fichier non spécifié". Il est possible d'utiliser un champ conditionnel IF pour éviter l'affichage de cette erreur, mais cela nécessite quelques ajustements pour ne pas perturber l'insertion de l'image.
Modifiez la structure du champ IF : Utilisez un champ IF qui vérifie si le lien vers l'image est vide ou non. Si le champ est vide, rien ne s'affiche, sinon l'image est insérée.
La structure du champ ressemblera à ceci :
{ IF { MERGEFIELD "LienImage" } = "" "" "{ INCLUDEPICTURE { MERGEFIELD "LienImage" } \d }" }
Utilisez la combinaison des touches Alt + F9 pour basculer en mode "codes de champ" dans Word afin de pouvoir insérer manuellement ces champs, car les crochets { } ne peuvent pas être tapés directement. Ils doivent être insérés avec Ctrl + F9.
Une fois le publipostage terminé, vous devrez peut-être sélectionner tout le document (Ctrl + A) et appuyer sur F9 pour mettre à jour tous les champs et forcer l'affichage des images.
13 sept. 2024 à 15:07
Merci Bruno
Mais non justement j'ai déjà essayé et ça ne marche pas. Quand j'utilise un champ IF comme indiqué la photo ne se met plus à jour dans le document fusionné en faisant F9
13 sept. 2024 à 15:23
D'accord. Mais il existe peut-être une alternative avec l'ajout d'une image vide dans la base de données.
Si l'utilisation de macros n'est pas pratique pour toi, une autre solution consiste à ajouter un lien vers une image vide directement dans ta source de données (le fichier Excel). Ainsi, au lieu d'avoir des cellules vides dans le champ "LienImage", tu insères un lien vers une petite image transparente ou blanche que tu crées au préalable.
Par exemple, dans Excel, au lieu d'avoir des champs vides pour les personnes sans photo, tu peux remplacer les cellules vides par une URL vers une image blanche (comme C:\chemin\vers\image_vide.jpg).
Cette approche garantit que le champ INCLUDEPICTURE ne tombera jamais sur une URL vide, ce qui évite l'erreur sans nécessiter de champs IF supplémentaires.
13 sept. 2024 à 15:25
As-tu essayé l'utilisation d'un champ IF sans casser le lien de l'image.
Insertion des champs :
Utilise toujours cette structure de champ IF, mais sans directement encapsuler le INCLUDEPICTURE dans l'IF :
{ INCLUDEPICTURE { IF { MERGEFIELD "LienImage" } = "" "C:\\chemin\\vers\\image_vide.jpg" { MERGEFIELD "LienImage" } } \d }
13 sept. 2024 à 15:26
Ici, si le lien de l'image est vide, une image par défaut (par exemple, une image vide) est insérée.
Si le lien est valide, le champ MERGEFIELD insère l'URL de l'image réelle.
13 sept. 2024 à 17:29
Alors je viens d'essayer ça marche sauf que maintenant au lieu du message d'erreur c'est une photo qui s'affiche mais pas l'image vide... on avance
13 sept. 2024 à 17:31
J'ai l'impression que le includepicture et le if ne font pas bon ménage !!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question13 sept. 2024 à 17:16
Je vais essayer ta réponse mais précision en fait ce ne sont pas des champs vides dans ma base de données j'ai systématiquement un lien c'est dans la planche d'étiquettes quand il n'y a plus de données c'est le champ includepicture qui affiche erreur dans les étiquettes vides restantes sur la page
13 sept. 2024 à 19:06
Personnellement, je n'aurais pas utilisé INCLUDEPICTURE
qui est souvent capricieux, surtout lorsqu'il est combiné avec des conditions dans un publipostage.
Un script VBA est plus fiable et permet de contrôler le comportement des images de manière plus fine.
Par contre, il faut préparer votre fichier Excel avant. Assurez-vous que dans votre fichier Excel, vous avez une colonne avec les URL des images, et que vous avez d'autres colonnes avec les informations nécessaires pour le publipostage.
Dans l'éditeur VBA, allez sur Insertion > Module pour créer un nouveau module.
Insérez le code suivant :
Sub InsertImages() Dim doc As Document Dim r As Range Dim imgPath As String Dim i As Integer Dim dataField As String Dim imageCell As Range ' Initialisation du document actif Set doc = ActiveDocument ' Parcourt tous les enregistrements du publipostage For i = 1 To doc.MailMerge.DataSource.RecordCount ' Aller à l'enregistrement en cours doc.MailMerge.DataSource.ActiveRecord = i ' Obtenir le lien de l'image depuis la source de données imgPath = doc.MailMerge.DataSource.DataFields("LienImage").Value ' Vérifier si le lien de l'image n'est pas vide If imgPath <> "" Then ' Sélectionner le champ ou la cellule où l'image doit être insérée Set r = doc.MailMerge.DataSource.DataFields("PositionImage") ' Supprimer le texte actuel si nécessaire r.Text = "" ' Insérer l'image dans la cellule ou à l'endroit spécifié doc.InlineShapes.AddPicture FileName:=imgPath, LinkToFile:=False, SaveWithDocument:=True, Range:=r End If Next i End Sub
Modifiez le code pour correspondre à vos besoins
LienImage fait référence à la colonne dans votre fichier Excel contenant les liens des images.
PositionImage représente l'endroit dans le document où vous souhaitez insérer l'image. Vous devrez peut-être adapter cette partie en fonction de la structure de votre document Word.
Ensuite allez sur Affichage > Macros > Afficher les macros, sélectionnez InsertImages, puis cliquez sur "Exécuter".
Avantages de cette méthode
Plus de flexibilité : Vous pouvez entièrement personnaliser où et comment les images sont insérées.
Meilleure gestion des erreurs : Si un lien est invalide ou manquant, la macro peut ignorer cette image sans provoquer d'erreur visible.
Pas de problème de mise à jour : Contrairement au champ INCLUDEPICTURE, qui nécessite souvent une mise à jour manuelle, la macro insère directement les images dans le document.
16 sept. 2024 à 08:47
J'ai déjà ce code dans ma macro VBA sur Excel pour lancer mon publipostage
Sub Publipostage() 'Call AjouterReference Dim NomBase As String Dim appWord As Object Set appWord = CreateObject("Word.application") Dim docWord As Object ' Chemin vers le fichier Excel et le document Word NomBase = "G:\24-Bureautique\01-Gestion des projets\Nelly en cours\Sénateurs nettoyé.xlsm" Dim DocWordPath As String DocWordPath = "G:\24-Bureautique\01-Gestion des projets\Nelly en cours\Fusion 348 sénateurs tableau - nettoyé.docx" ' Créer une instance de Word Set appWord = CreateObject("Word.Application") appWord.Visible = True ' Ouverture du document Word Set docWord = appWord.Documents.Open(DocWordPath) ' Configuration du publipostage With docWord.MailMerge .MainDocumentType = 1 ' Ouvrir la base de données Excel avec le bon pilote .OpenDataSource Name:=NomBase, _ Connection:="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & NomBase & ";Extended Properties=""Excel 12.0 Macro;HDR=Yes;"";", _ SQLStatement:="SELECT * FROM [Base$] WHERE [Groupe_politique] = 'Les Républicains' ORDER BY Qualite DESC, Nom" ' Spécifier la fusion vers un nouveau document .Destination = wdSendToNewDocument .SuppressBlankLines = True ' Utiliser tous les enregistrements disponibles With .DataSource .FirstRecord = 1 .LastRecord = -16 End With ' Exécuter l'opération de publipostage .Execute Pause:=False End With appWord.Selection.wholestory appWord.Selection.Fields.Update ' Fermer le document source sans sauvegarder docWord.Close False ' Libérer les objets Word Set docWord = Nothing Set appWord = Nothing ' Activer la mise à jour de l'écran Application.ScreenUpdating = True End Sub
16 sept. 2024 à 08:44
Super je vais essayer mais comment je spécifie l'endroit dans mon document word ?
j'avoue que là je suis perdue.
Mon but aurait été de remplir tous les champs via vba mais je suis un peu perdue... par exemple nom, prénom sachant que j'ai les colonnes dans mon fichier excel ainsi que la colonne "Photo" avec le lien URL de la photo
Merci infiniment pour votre aide
16 sept. 2024 à 18:45
Bonjour,
Il faut utiliser les signets ou les champs de fusion (MergeField) pour spécifier l'emplacement où vous souhaitez insérer les images et les autres données.
Pour les images, vous pouvez utiliser un signet dans le document Word, et la macro utilisera ce signet pour insérer l'image à cet endroit.
Pour les autres données (nom, prénom, etc.), Word s'en occupera automatiquement via les champs de fusion standard.
Essayez plutôt avec cette macro modifiée :
Sub InsertImages() Dim doc As Document Dim imgPath As String Dim i As Integer Dim imageBookmark As Bookmark Dim mergeField As Field Dim nomField As Field, prenomField As Field ' Initialisation du document actif Set doc = ActiveDocument ' Lancer le publipostage, parcourir tous les enregistrements du publipostage For i = 1 To doc.MailMerge.DataSource.RecordCount ' Aller à l'enregistrement en cours doc.MailMerge.DataSource.ActiveRecord = i ' Obtenir le lien de l'image depuis la source de données imgPath = doc.MailMerge.DataSource.DataFields("Photo").Value ' Vérifier si le lien de l'image n'est pas vide If imgPath <> "" Then ' Vérifier si le signet pour l'image existe (par exemple "ImagePlace") If doc.Bookmarks.Exists("ImagePlace") Then ' Insérer l'image au niveau du signet "ImagePlace" Set imageBookmark = doc.Bookmarks("ImagePlace") ' Supprimer le texte actuel du signet (s'il existe) imageBookmark.Range.Text = "" ' Insérer l'image dans la position spécifiée par le signet doc.InlineShapes.AddPicture FileName:=imgPath, LinkToFile:=False, SaveWithDocument:=True, _ Range:=imageBookmark.Range End If End If ' Mise à jour des champs comme "Nom" et "Prénom" via le publipostage classique For Each mergeField In doc.Fields If mergeField.Type = wdFieldMergeField Then If InStr(mergeField.Code.Text, "Nom") > 0 Then mergeField.Result.Text = doc.MailMerge.DataSource.DataFields("Nom").Value ElseIf InStr(mergeField.Code.Text, "Prenom") > 0 Then mergeField.Result.Text = doc.MailMerge.DataSource.DataFields("Prenom").Value End If End If Next mergeField Next i End Sub
Signet pour l'image :
La macro utilise maintenant un signet (nommé "ImagePlace") pour spécifier où l'image doit être insérée dans le document Word. Vous devez ajouter ce signet manuellement dans votre document Word à l'endroit où vous voulez que l'image apparaisse.
Champs de fusion (MergeFields) :
Pour insérer des données comme le nom et le prénom, vous pouvez ajouter des champs de fusion standards (MergeField) dans votre document Word. La macro les parcourt et remplace les valeurs des champs de fusion correspondants avec les données de la source.
Obtenir les données d'Excel :
La macro accède à vos colonnes dans Excel en utilisant doc.MailMerge.DataSource.DataFields("Nom de la colonne"). Vous devez vous assurer que les noms des colonnes dans Excel correspondent exactement aux noms utilisés dans la macro.
Miantenant il faut configurer le document Word :
Insérer un signet pour l'image :
Allez dans votre document Word.
Placez le curseur là où vous voulez que l'image soit insérée.
Allez dans l'onglet Insertion > Signet, puis nommez-le "ImagePlace".
Ajouter les champs de fusion :
Dans Word, allez dans l'onglet Publipostage > Insérer un champ de fusion.
Insérez les champs Nom, Prenom et d'autres colonnes que vous avez dans votre fichier Excel.
Lorsque vous exécuterez la macro, elle parcourra chaque enregistrement du publipostage, insérera l'image à l'emplacement du signet "ImagePlace" et remplira les autres champs (comme le nom et le prénom) avec les données provenant d'Excel.
Cela vous permettra de personnaliser votre document avec des images et des données pour chaque enregistrement du publipostage.
18 sept. 2024 à 10:46
Ca ne marche pas. Je n'ai pas de document fusionné final et en plus aucune photo ne s'affiche dans le signet
18 sept. 2024 à 12:03
D'accord, si la macro ne fonctionne pas comme prévu et ne produit pas de document final fusionné avec les photos, cela peut être dû à plusieurs facteurs.
Assurez-vous que le publipostage est prêt.
Configuration dans Word
Champs de fusion : Votre document Word doit contenir des champs de fusion (<<Nom>>, <<Prenom>>, etc.) aux emplacements appropriés pour insérer les données depuis Excel.
Signet pour l'image : Ajoutez un signet appelé "ImagePlace" dans le document Word à l'endroit où vous voulez que les images soient insérées.
Voici une macro révisée qui gère correctement le processus de fusion et d'insertion des images.
Sub InsertImagesAndMerge() Dim doc As Document Dim imgPath As String Dim i As Integer Dim imageBookmark As Bookmark Dim mergedDoc As Document Dim mergeField As Field Dim dataSource As MailMergeDataSource ' Initialisation du document actif Set doc = ActiveDocument ' Exécuter la fusion pour créer un nouveau document avec tous les enregistrements doc.MailMerge.Execute ' Récupérer le document fusionné Set mergedDoc = ActiveDocument ' Parcourt chaque enregistrement fusionné dans le document final Set dataSource = doc.MailMerge.DataSource For i = 1 To mergedDoc.MailMerge.DataSource.RecordCount ' Se positionner sur le bon enregistrement mergedDoc.MailMerge.DataSource.ActiveRecord = i ' Obtenir le lien de l'image depuis la source de données imgPath = mergedDoc.MailMerge.DataSource.DataFields("Photo").Value ' Vérifier si le lien de l'image n'est pas vide If imgPath <> "" Then ' Vérifier si le signet pour l'image existe (par exemple "ImagePlace") If mergedDoc.Bookmarks.Exists("ImagePlace") Then ' Insérer l'image au niveau du signet "ImagePlace" Set imageBookmark = mergedDoc.Bookmarks("ImagePlace") ' Supprimer le texte actuel du signet imageBookmark.Range.Text = "" ' Insérer l'image dans la position spécifiée par le signet mergedDoc.InlineShapes.AddPicture FileName:=imgPath, LinkToFile:=False, SaveWithDocument:=True, _ Range:=imageBookmark.Range End If End If Next i End Sub
Lancez la macro InsertImagesAndMerge.
Le document sera fusionné et générera un nouveau fichier où chaque enregistrement sera traité, et les images seront insérées à l'endroit du signet "ImagePlace".
Points de contrôle si cela ne fonctionne toujours pas :
Assurez-vous que la fusion fonctionne : Vous devriez voir vos champs comme <<Nom>> et <<Prenom>> remplis correctement après la fusion.
Chemin des images : Vérifiez que les chemins des images sont corrects et accessibles.
Signet présent : Assurez-vous que le signet "ImagePlace" existe dans votre document à l'endroit où vous voulez insérer les images.
18 sept. 2024 à 17:03
Tout fonctionne sauf l'image (aucune image) le signet est bien là et les chemins sont bons
18 sept. 2024 à 18:32
D'accord, puisque tout fonctionne sauf l'insertion des images, il est probable que le problème vienne de la manière dont l'image est insérée à l'endroit du signet. Je vais vous proposer une approche plus robuste pour l'insertion des images à l'aide d'une méthode alternative pour traiter les signets et les chemins d'image.
Je reviens.
18 sept. 2024 à 19:02
Mise à jour de la macro pour l'insertion des images
Sub InsertImagesAndMerge() Dim doc As Document Dim imgPath As String Dim i As Integer Dim imageBookmark As Bookmark Dim mergedDoc As Document Dim dataSource As MailMergeDataSource Dim imageRange As Range ' Initialisation du document actif Set doc = ActiveDocument ' Exécuter la fusion pour créer un nouveau document avec tous les enregistrements doc.MailMerge.Execute ' Récupérer le document fusionné Set mergedDoc = ActiveDocument ' Parcourt chaque enregistrement fusionné dans le document final For i = 1 To mergedDoc.MailMerge.DataSource.RecordCount ' Aller à l'enregistrement en cours mergedDoc.MailMerge.DataSource.ActiveRecord = i ' Obtenir le lien de l'image depuis la source de données imgPath = mergedDoc.MailMerge.DataSource.DataFields("Photo").Value ' Vérifier si le lien de l'image n'est pas vide et que l'image existe If imgPath <> "" And Dir(imgPath) <> "" Then ' Vérifier si le signet pour l'image existe (par exemple "ImagePlace") If mergedDoc.Bookmarks.Exists("ImagePlace") Then ' Récupérer la plage du signet Set imageRange = mergedDoc.Bookmarks("ImagePlace").Range ' Supprimer le signet actuel pour éviter des conflits lors de l'insertion mergedDoc.Bookmarks("ImagePlace").Delete ' Insérer l'image à l'endroit du signet mergedDoc.InlineShapes.AddPicture FileName:=imgPath, LinkToFile:=False, SaveWithDocument:=True, _ Range:=imageRange End If End If Next i End Sub
La ligne If imgPath <> "" And Dir(imgPath) <> "" Then vérifie que le lien de l'image n'est pas vide et que l'image existe bien à l'emplacement spécifié avant d'essayer de l'insérer.
Si le signet existe, il est supprimé juste avant d'insérer l'image à sa place. Cela évite que le signet reste dans le document et crée des problèmes lors de l'insertion.
La plage du signet (Range) est utilisée pour insérer l'image à l'endroit précis où le signet était situé, même après la suppression du signet.
Étape supplémentaire à vérifier
Vérifiez les chemins d'image : Assurez-vous que les chemins d'image dans Excel sont corrects et qu'ils pointent bien vers des fichiers image existants (format JPG, PNG, etc.).
Exécuter la macro
Si le signet "ImagePlace" est bien placé, la macro insérera maintenant l'image à l'emplacement correct.
Testez également avec une image locale pour éviter tout problème lié aux permissions ou aux chemins incorrects.
Si vous voulez tester rapidement si le chemin de l'image est correct, vous pouvez ajouter cette ligne dans la macro pour afficher le chemin dans une boîte de message avant l'insertion de chaque image :
MsgBox "Chemin de l'image : " & imgPath
Cela vous permet de vérifier visuellement que le bon chemin est utilisé pour chaque image.
13 sept. 2024 à 14:02
{ MERGEFIELD "LienImage" } : C'est le champ où le lien de l'image est stocké dans Excel.