IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Word Discussion :

Publipostage Avec Tableau


Sujet :

Word

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 51
    Points : 22
    Points
    22
    Par défaut Publipostage Avec Tableau
    Bonjour,

    Je cherche à faire du publipostage Word à partir d'une liste Excel (classique)
    Seul bémol, mon tableau Excel est de la forme suivante:

    Client 1: XXXX
    Matériel1 Type1 Ect1
    Matériel2 Type2 Ect2

    Client 2: XXXX
    ...

    J'arrive à avoir une liste de destinataire avec les bonnes valeurs, comme dans tout publipostage (en filtrant la colonne "client = non vide")
    Cependant je n'arrive pas à avoir mon tableau "matériel type etc...." pour chaque client !

    Pour Exemple, je voudrais avoir une lettre de ce type:

    ==================================
    Dupond Jean Paul
    Adresse 1
    CP
    Ville
    06 XX XX XX XX

    Votre matériel ci-dessous!
    Matériel1 Type1 Ect1
    Matériel2 Type2 Ect2

    ==================================

    Est-ce que ce type de lettre est possible à faire avec Word ? si oui, pouvez vous me dire comment faire?

    Sinon auriez vous une autre solution par exemble en VBA.
    On ajoute une colonne "tableau" à la suite des autres colonnes qui serait le contenu des matériaux.

    Si la colonne client est non vide ALORS
    Tant que la ligne n'est pas vide
    La colonne "tableau" = concaténation de toutes les lignes suivantes

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Avec un publipostage normal, tu n'y parviendra pas.
    On peut utiliser des astuces, mais tu dois impérativement connaître le nombre de lignes maximale que ton tableau va contenir.

    Si tu jettes un oeil à ce tuto, on peut y parvenir en VBA :
    http://heureuxoli.developpez.com/off...ostage/#L8-D-2
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 51
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    La partie 8-C et 8-D-1 "Le traitement avec une feuille Excel" du tutoriel que tu ma donné sont exactement ce qu'il me faut.

    Cependant, étant un "ignare" en VBA, je voudrais savoir ou je met ces scripts pour tenter de les faire marcher car même en lisant tout le tuto, je n'ai pas vu. (ai-je loupé quelque chose ?)
    Je pourrais commencer à tester quelque modifications de progs, mais pour le moment je ne vois même pas ou insérer ces codes.

    Je te remercie de ton aide.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 51
    Points : 22
    Points
    22
    Par défaut
    Je m'excuse pour le post précédent, j'ai trouvé tout seul.

    Je suis en train de tester les macros. si j'ai bien compris, il me faut trois fichiers:
    Un fichier Excel ou il y aura les Données.
    Un fichier Excel ou il y aura les Macros.
    Un fichier Word de publipostage.

    Le fichier de données change d'un mois sur l'autre, cependant il aura toujours le même nom.

    Pour le moment si j'ai bien compris, j'ai le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    Sub donneeAvecExcel2()
    'Déclaration des variables
    Dim xlApp As Excel.Application
    Dim xlWb As Excel.Workbook
    Dim xlSh As Excel.Worksheet
    Dim iR As Integer
    Dim iC As Integer
    Dim i As Integer, j As Integer
     
     
    'Affectation des données aux variables
    Set xlApp = New Excel.Application
    Set xlWb = xlApp.Workbooks.Open("C:\Publipostage\A relancer par Fax.xlsx")
    Set xlSh = xlWb.Worksheets(1)
    'Récupération du nombre de lignes et de colonnes
    iR = xlSh.UsedRange.Rows.Count
    iC = xlSh.UsedRange.Columns.Count
     
    'Boucle pour adresser les cellules contenant des données
    'en excluant la première ligne qui contient les titres
    For i = 2 To iR
        For j = 1 To iC
            'On effectue ici nos opérations sur les cellules.
            Debug.Print xlSh.Cells(i, j)
        Next j
    Next i
     
     
    xlWb.Close
    xlApp.Quit
    Set xlSh = Nothing
    Set xlWb = Nothing
    Set xlApp = Nothing
     
     
    End Sub
    à ce moment là j'ai un fichier Excel.xls formaté comme je le veux soit:
    un tableur avec comme colonne particulière la colonne "Tableau" qui est la concaténation de toutes les lignes de matériaux (cf post précédent) pour chaque client distinct.

    Viens ensuite l'appel du document de publipostage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    Sub Publipostage()
        Dim docWord As Word.Document
        Dim appWord As Word.Application
        Dim NomBase As String
     
        NomBase = "C:\Publipostage\MonFichier.xls"
     
        Application.ScreenUpdating = False
        Set appWord = New Word.Application
        appWord.Visible = True
        'Ouverture du document principal Word
        Set docWord = appWord.Documents.Open("C:\Publipostage\publi.doc")
     
        'fonctionnalité de publipostage pour le document spécifié
        With docWord.mailMerge
            'Ouvre la base de données
            .OpenDataSource Name:=NomBase, _
                Connection:="Driver={Microsoft Excel Driver (*.xls)};" & _
                "DBQ=" & NomBase & "; ReadOnly=True;", _
                SQLStatement:="SELECT * FROM [Feuil1$]"
            'Spécifie la fusion vers l'imprimante
            .Destination = wdSendToPrinter
            .suppressBlankLines = True
                'Prend en compte l'ensemble des enregistrements
                With .DataSource
                    .firstRecord = wdDefaultFirstRecord
                    .lastRecord = wdDefaultLastRecord
                End With
            'Exécute l'opération de publipostage
            .Execute Pause:=False
        End With
     
        Application.ScreenUpdating = True
     
        'Fermeture du document Word
        docWord.Close False
        appWord.Quit
    End Sub
    Si j'ai bien tout suivis de ce qu'il fallait faire, alors ça devrait être ça.
    Quelqu'un pourrais t'il me dire si je suis dans le vrai ?

    Un problème persiste par contre, c'est que dans la première sub, on à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    For i = 2 To iR
        For j = 1 To iC
            'On effectue ici nos opérations sur les cellules.
            Debug.Print xlSh.Cells(i, j)
        Next j
    Next i
    Hors je voudrais enregistrer les valeurs des cellules (i,j) dans un tableau ou dans une cellule pour pouvoir les envoyer directement vers le fichier word. Mais je ne sais pas comment on peut faire pour faire ça.
    Quelqu'un pourrait-il m'aider ?

    Merci d'avance.

  5. #5
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Les macros ont été écrites pour fonctionner au départ de Word.
    Les mettre en Excel est possible, mais elles doivent être modifiées.

    Si tu ne sais pas comment utiliser du code, dans ma signature, il y a deux tutos sur le VBA et tu peux poser toutes les questions que tu souhaites sur le forum.

    Le fait d'amputer le code ne va pas t'aider.
    Le code donné dans le tut contient une comparaison de différence et tant que le résultat de la comparaison reste faux, on ajoute un ligne au tableau, dès que le résultat devient vrai, on crée un nouveau document.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    Sub donneeAvecExcel()
    On Error GoTo GestErr
    'Déclaration des variables
    Dim xlApp As Excel.Application
    Dim xlWb As Excel.Workbook
    Dim xlSh As Excel.Worksheet
    Dim iR As Integer
    Dim i As Integer, j As Integer
    Dim oDoc As Document
    Dim NoFact As Integer
    Dim oTbl As Table
    Dim stDocName As String
     
     
     
     
    'Affectation des données aux variables
    Set xlApp = New Excel.Application
    Set xlWb = xlApp.Workbooks.Open("C:\Documents and Settings\Olivier\Mes documents\Mes sources de données\adresses.xlsx")
    Set xlSh = xlWb.Worksheets(2)
    'Récupération du nombre de lignes et de colonnes
    iR = xlSh.UsedRange.Rows.Count
    NoFact = 0
     
     
    ' Récupération des des données de la feuille pour les injecter dans le document.
    For i = 2 To iR
        If NoFact <> xlSh.Cells(i, 2) Then
    'Test de comparaison si le résultat est vrai, on crée un nouveau document
            stDocName = "c:\temp\" & xlSh.Cells(i, 2) & "-" & Format(Date, "yy-mm-dd") & ".docm"
            oDoc.Close
            Set oDoc = Documents.Add("C:\Documents and Settings\Olivier\Application Data\Microsoft\Templates\pub1.dotm")
            oDoc.Bookmarks(1).Range.Text = xlSh.Cells(i, 1)
            oDoc.Bookmarks(2).Range.Text = xlSh.Cells(i, 2)
            oDoc.Bookmarks(3).Range.Text = xlSh.Cells(i, 3)
            Set oTbl = oDoc.Tables(1)
            oTbl.Rows.Add
            oTbl.Rows.Last.Cells(1).Range.Text = xlSh.Cells(i, 4)
            oTbl.Rows.Last.Cells(2).Range.Text = xlSh.Cells(i, 5)
            Set oTbl = Nothing
            oDoc.SaveAs stDocName
            'Affectation du nouveau numéro de facture pour la comparaison
            NoFact = xlSh.Cells(i, 2)
        Else
    'Si le résultat est faux on ajoute un ligne
            Set oTbl = oDoc.Tables(1)
            oTbl.Rows.Add
            oTbl.Rows.Last.Cells(1).Range.Text = xlSh.Cells(i, 4)
            oTbl.Rows.Last.Cells(2).Range.Text = xlSh.Cells(i, 5)
            Set oTbl = Nothing
            oDoc.Save
        End If
    Next i
     
    oDoc.Close
     
    Set oDoc = Nothing
    GestErr:
    'Si pas de document ouvert on fait un resume next
    If Err.Number = 91 Then Resume Next
    Debug.Print "Erreur : " & Err.Number & Err.Description
    xlWb.Close
    xlApp.Quit
    Set xlSh = Nothing
    Set xlWb = Nothing
    Set xlApp = Nothing
     
     
    End Sub
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

Discussions similaires

  1. Publipostage avec document contenant un tableau
    Par hfranck dans le forum VBA Word
    Réponses: 5
    Dernier message: 30/06/2015, 08h35
  2. [JComboBox] Remplissage avec tableau de String
    Par linkit dans le forum Composants
    Réponses: 2
    Dernier message: 26/05/2005, 21h39
  3. Réponses: 11
    Dernier message: 29/04/2005, 19h45
  4. Interbase et publipostage avec word
    Par gdicom dans le forum InterBase
    Réponses: 3
    Dernier message: 01/10/2004, 10h06
  5. [OLE] Publipostage avec Word
    Par claude delattre dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 06/01/2004, 14h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo