Publipostage Image Word et regroupement

NellyAblon Messages postés 10 Statut Membre -  
Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour,

J'ai deux soucis de publipostage Word sous un format d'étiquettes 3*5 qui représente un petit trombinoscope avec des informations pour chaque personne :

1) j'ai utilisé un champ INCLUDEPICTURE pour insérer une image via un lien URL contenu dans mon fichier Excel et quand j'ai des étiquettes vides ça m'indique "Erreur ! nom du fichier non spécifié". Y a t-il un moyen de ne pas l'afficher j'ai essayé avec un champ IF mais du coup mon image ne marche pas

2) j'aimerais regrouper les étiquettes par service avec le nom du service affiché en haut de chaque page et un saut de page au changement de service. Pour l'instant à part éditer un publipostage différent par service je n'ai pas réussi.

Merci de votre aide.


Windows / Firefox 115.0

13 réponses

Résumé de la discussion

La solution robuste consiste à remplacer INCLUDEPICTURE par une macro VBA qui insère les photos à un signet dédié lors du publipostage.
La macro lit le chemin de l’image dans la colonne Photo de la source de données, vérifie qu’il n’est pas vide et insère l’image à l’emplacement du signet nommé ImagePlace dans chaque enregistrement fusionné.
Les données textuelles, comme Nom et Prenom, restent gérées par les champs de fusion standard et se remplissent pour chaque enregistrement à partir des colonnes correspondantes dans Excel.
Pour mettre en œuvre ce cadre, placer manuellement un signet ImagePlace dans le document et s’assurer que les noms de colonnes Excel correspondent aux noms utilisés par la fusion, puis lancer la macro afin d’obtenir un document fusionné où chaque fiche affiche l’image et les informations associées.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   171
     

    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.


    0
    1. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   171
       

      { MERGEFIELD "LienImage" } : C'est le champ où le lien de l'image est stocké dans Excel.

      0
  2. NellyAblon Messages postés 10 Statut Membre
     

    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

    0
  3. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   171
     

    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.


    0
  4. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   171
     

    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 }
     


    0
    1. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   171
       

      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.

      0
    2. NellyAblon Messages postés 10 Statut Membre
       

      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

      0
    3. NellyAblon Messages postés 10 Statut Membre
       

      J'ai l'impression que le includepicture et le if ne font pas bon ménage !!!

      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. NellyAblon Messages postés 10 Statut Membre
     

    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

    0
  7. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   171
     

    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.


    0
    1. NellyAblon Messages postés 10 Statut Membre
       

      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
      0
  8. NellyAblon Messages postés 10 Statut Membre
     

    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

    0
  9. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   171
     

    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.


    0
  10. NellyAblon Messages postés 10 Statut Membre
     

    Ca ne marche pas. Je n'ai pas de document fusionné final et en plus aucune photo ne s'affiche dans le signet

    0
  11. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   171
     


    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.


    0
  12. NellyAblon Messages postés 10 Statut Membre
     

    Tout fonctionne sauf l'image (aucune image) le signet est bien là et les chemins sont bons

    0
  13. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   171
     

    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.


    0
  14. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   171
     

    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.


    0