Publipostage avec un tableau Word

Bonjour à tous,

J'ai des données dans une feuille Excel, que j'aimerais les exporter dans deux modèles Word de publipostage.

1)S'il se trouve que le champ "Réf/Bon" dans la feuille Excel, se répète, alors on doit utiliser le modèle de publipostage avec remplissage d'un tableau avec les lignes qui ont la même "Réf/Bon".

Sinon, s'il est unique, on utilisera le modèle de publipostage sans tableau.

-Comment choisir l’un ou l’autre modèle ?

2)Comment insérer les données d’un même "Réf/Bon" dans le tableau Word ?

Merci d’avance.

135decharge.zip (45.62 Ko)

Bonjour,

Manque-t-il des éclaircissements ?

Bonjour,

Une première tentative avec une macro.

69decharge-v001.zip (29.59 Ko)

Bonjour,

Une nouvelle macro, mais elle ne fonctionne pas bien encore :

'Option Explicit

Sub PublipostageTest()
    Dim C As Range, Plage As Range, Sh As Worksheet, Acc As Range
    Dim NbreX As Long, L As Long, Cel As Range
    Dim Wd As Word.Application, WdDoc As Word.Document
    Dim Chemin As String, Fichier As String, Source As String

    'En supposant que le document Word est dans le
    'même répertoire que le fichier Excel ouvert
    Chemin = ThisWorkbook.Path & "\"

    'Chemin & Nom du fichier Excel où est le tableau des données
    'Ce fichier est présumé ouvert
    Source = ThisWorkbook.FullName
    'MsgBox "Chemin : " & Chemin & vbCrLf & _
           "Fichier : " & Fichier & vbCrLf & _
           "Chemin & Fichier : " & Chemin & Fichier & vbCrLf & _
           "Source : " & Source

    With Sheets("feuil1")
        .Activate
        NbreX = Application.CountIf(.Range(.[O2], .[O65536]), "x")
        If NbreX = 0 Then
            MsgBox "Il n'y a pas d'étiquette à extraire.", vbInformation + vbOKOnly
            .Range("A1").Select
            Exit Sub
        End If
    End With

    'Attribution d'un nom "Insertion / names" de la plage de données du tableau
    With Workbooks(ThisWorkbook.Name).Worksheets("Feuil1")
        .Range("A1:O" & .Range("A65536").End(xlUp).Row).Name = "Données"
    End With

    '---------

    With Sheets("Feuil1")
        .AutoFilterMode = False
        Set Plage = .Range(.[C1], .Cells(.Rows.Count, 3).End(xlUp))

        'Plage.AdvancedFilter xlFilterInPlace, unique:=True
        .Range(.[A1], .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 15).AutoFilter 15, "x"
        Set Plage = Plage.Offset(1).Resize(Plage.Rows.Count - 1)
        Set Plage = Plage.SpecialCells(xlCellTypeVisible)
        .ShowAllData
        For Each C In Plage
            .AutoFilterMode = False
            .Range(.[A1], .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 15).AutoFilter 3, C.Value
            .Range(.[A1], .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 15).AutoFilter 15, "x"

            'on test le nombre d'occurence de C dans la plage filtrée
            If Application.Subtotal(103, .[A:A]) > 2 Then

                '+1 on utilise le deuxième modèle pour le publipostage avec un tableau
                'MsgBox "Lignes supérieur à 2 :" & Application.Subtotal(103, .[A:A])
                Fichier = "DéchargeTableau.doc"
                L = 1
            Else
                'MsgBox "Lignes inférieur ou égal à 2 :" & Application.Subtotal(103, .[A:A])
                Fichier = "Décharge.doc"
                L = 0
            End If
            With .AutoFilter.Range
                Set Acc = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)

                'Création d'une instance de Word
                Set Wd = CreateObject("Word.Application")

                'Rendre visible ou nom l'application Word
                Wd.Visible = True    ' or False

                'Ouverture du document pour la publication
                Set WdDoc = Wd.Documents.Open(Chemin & Fichier)

                With WdDoc.MailMerge

                    .OpenDataSource Name:=Source, _
                                    Connection:="Driver={Microsoft Excel Driver (*.xls)};" & "DBQ=" & _
                                                Chemin & "; ReadOnly=True;", SQLStatement:="SELECT * FROM [feuil1$] WHERE [impression] like 'x' OR [impression] like 'X'"

                    'déterminer au besoin l'imprimante pour ce document
                    '.ActivePrinter = "Xerox 4512 PCL5e"

                    ' Lancer l'impression du publipostage
                    .Destination = wdSendToNewDocument    ' OU wdSendToPrinter

                    'parcourir la plage Acc ligne par ligne pour la fusion
                    For Each Cel In Acc.Column(3).Address

                        With .DataSource
                            .FirstRecord = wdDefaultFirstRecord
                            .LastRecord = wdDefaultLastRecord
                        End With
                        .Execute Pause:=False
                        'Prochaine ligne dans Acc
                    Next Cel

                    'Attente que l'impression soit terminée avant de fermé
                    'le document et Word
                    While Wd.BackgroundPrintingStatus <> 0
                        DoEvents
                    Wend

                End With
                WdDoc.Close SaveChanges:=wdDoNotSaveChanges  'Ferme le document
                'Ferme Word
                Wd.Quit wdDoNotSaveChanges

                '-------------
            End With

        Next C
        .AutoFilterMode = False
        'Libère la mémoire occupée par les objects
        Set WdDoc = Nothing
        Set Wd = Nothing

    End With
End Sub

Merci de votre aide.

Bonjour à tous,

Voila une nouvelle version avec du code VBA Excel et Word.

Reste à trouver une solution aux problèmes suivants :

- Problème pour publier tous les enregistrements marqués par une croix dans la feuille Excel.

- Formatage du tableau :

Le code se trouve bien mais rien ne se passe :

Private Sub Document_Open()
    TableOptimize
End Sub

'----------------------------------------

Sub TableOptimize()
    Dim myTable As Table
    'If Selection.Information(wdWithInTable) = False Then Exit Sub
    'Set myTable = Selection.Tables(1)
     Set myTable = Application.ActiveDocument.Tables(1)
    With myTable
        '.Range.Style = "ANewStyle"
        .AutoFitBehavior (wdAutoFitContent)
        '.AutoFormat Format:=wdTableFormatContemporary    '35
        'Ajustement des colonnes
        .AutoFitBehavior (wdAutoFitWindow)
        .AutoFitBehavior (wdAutoFitFixed)
        .AutoFitBehavior wdAutoFitContent
        'Bordures
        .Columns.Borders.Enable = True
        .Rows.Borders.Enable = True
        'Mettre les titres de la première ligne en gras
        .Rows.First.Range.Font.Bold = True
        'Centrer les titres
        .Rows(1).Alignment = wdAlignRowCenter
        'Centrer le contenu de la 1ère colonne
        .Columns(1).Cells.VerticalAlignment = wdCellAlignVerticalCenter
        'Réduire la largeur de la première colonne
        .Columns(1).Width = 15
        'Centrer le contenu de la 4ème colonne
        .Columns(4).Cells.VerticalAlignment = wdCellAlignVerticalCenter

    End With
End Sub

Bonsoir,

Y a-t-il une personne qui a pu lire le sujet, le comprendre et peut me proposer une solution ?

Bonjour,

Comme la solution ne venait pas, je vais essayer d’expliquer le problème, peut-être qu'elle servira pour quelqu'un pour trouver la solution :

Dans une gestion de stock, il arrive que des personnes prennent des pièces de rechange (Sortie stock).

Pour Chaque sortie, un document, pour une seule personne avec une référence unique est délivré. Ceci est valable pour une sortie d’une ou de plusieurs pièces prises.

Pour faire du publipostage multiple (chaque référence est affichée avec son détail de pièces prises inscrites dans cette même référence), deux plages nommées ont été crées dans Excel pour servir dans la fusion des champs dans Word).

- "Extraction" (pour boucler sur les références uniques concernées)

- "Base" pour afficher le détail des pièces prises pour chaque référence unique trouvée.

Le document type de publipostage, contient des champs de fusion (PublipostageMultiple.docm) pour afficher :

- La référence unique avec le nom de la personne qui a pris les pièces (Plage nommée : "Extraction")

- Le détail de chaque référence traitée (un champ DATABASE nous servira pour le détail) (Plage nommée : "Base")

Les références (Réf/Bon) qui devront être publiés sont marquées par une croix dans la colonne impression e la feuille Excel.

Maintenant, le code utilisé lance bien le publipostage, mais les documents obtenus comportent des données identiques.

J’aimerais revoir le code de manière à avoir des documents déférents selon le choix établit dans la feuille Excel.

J’espère avoir un peu éclairé vos lanternes.

Merci d’avance.

Rechercher des sujets similaires à "publipostage tableau word"