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

VBA Word Discussion :

Personnaliser le nombre de copies d'un document [WD-2010]


Sujet :

VBA Word

  1. #1
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut Personnaliser le nombre de copies d'un document
    Bonjour,

    Je suis un peu "rouillé" en VBA et malgré des recherches je n'ai pas véritablement trouvé mon bonheur.

    Je dois faire un publipostage sur la base d'une liste Excel et produire un document distinct par ligne Excel.

    Je me suis donc basé sur l'excellent tutoriel d'Olivier Lebeau, ça fonctionne nickel !

    Maintenant, on m'en demande évidemment plus.

    Chaque document peut avoir de 0 à 4 adresses de "Copies" au bas du document, sous forme de liste.

    Cela se présente comme ceci :

    Copies :
    • «COPIE_1»
    • «COPIE_2»
    • «COPIE_3»
    • «COPIE_4»
    Et donc il faudrait supprimer la totalité du "pavé" s'il n'y aucune copie ou modifier "Copies" en "Copie" si une seule copie.

    J'arrive à correctement compter le nombre de copie et à fusionner mes documents avec 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
    38
    39
    40
    41
    42
    43
    44
    45
    Sub TestPublipost()
    'Déclaration des variables
    Dim iR As Integer
    Dim i As Integer
    Dim oDoc As Document
    Dim DocName As String
    Dim oDS As MailMergeDataSource
    Dim iCopie1 As Integer
    Dim iNbCopies As Integer
     
    ' Affectation des objets
    Set oDoc = ActiveDocument
    Set oDS = oDoc.MailMerge.DataSource
     
    iR = oDoc.MailMerge.DataSource.RecordCount
    'Debug.Print iR'
    For i = 1 To iR
        With oDoc.MailMerge
            'Définition du premier et dernier enregistrement
            .DataSource.FirstRecord = i
            .DataSource.LastRecord = i
            ' Envoi des données dans un nouveau document
            .Destination = wdSendToNewDocument
            ' Exécution du publipostage
            .Execute
            ' Actualisation de l'enregistrement pour la sauvegarde
            .DataSource.ActiveRecord = i
            iCopie1 = IIf(.DataSource.DataFields("COPIE_1").Value = "", 0, 1)
            iCopie2 = IIf(.DataSource.DataFields("COPIE_2").Value = "", 0, 1)
            iCopie3 = IIf(.DataSource.DataFields("COPIE_3").Value = "", 0, 1)
            iCopie4 = IIf(.DataSource.DataFields("COPIE_4").Value = "", 0, 1)
            iNbCopies = iCopie1 + iCopie2 + iCopie3 + iCopie4
            MsgBox "Nombre copie(s) : " & iNbCopies, vbOKOnly + vbInformation, "Publipostage terminé"
            'Utilisation du premier champ pour obtenir le nom du document
            DocName = .DataSource.DataFields("NO_DOSSIER").Value
            'Debug.Print DocName; i'
        End With
        'Sauvegarde du document publiposté
        With ActiveDocument
            .SaveAs "xxxxxxxxxxxxxxx\" & DocName & ".docx"
            .Close
        End With
    Next i
    MsgBox "Nombre de documents générés : " & i - 1, vbOKOnly + vbInformation, "Publipostage terminé"
    End Sub
    Je ne suis évidemment pas contre la solution inverse, soit ajouter du texte et les copies en fonction du nombre de celles-ci.

    Voyez-vous une solution pas trop complexe ?

    Merci d'avance.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  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,

    Et avec un test If sur le recordcount, j'ai pas essayé, mais ça me semble être une piste honnête.
    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
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour et merci,

    Je ne vois pas bien ce que tu veux dire.

    J'arrive à compter le nombre de copie(s).

    J'ai plus de difficultés par contre à trouver une bonne solution pour personnaliser le bas de la page.

    Une discussion récente m'a mis sur une piste sur une piste, mais c'est un peu tiré par les cheveux.

    En fait, j'ai créé des saut de section continu, comme ceci :

    Saut de section
    Copie :
    • «COPIE_1»
    Saut de section
    Copies :
    • «COPIE_1»
    • «COPIE_2»
    • «COPIE_3»
    • «COPIE_4»
    Et en fonction du nombre de copie(s), je les supprime ou non :
    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
    Sub genererDocuments()
    'Déclaration des variables
    Dim iR As Integer
    Dim i As Integer
    Dim oDoc As Document
    Dim DocName As String
    Dim oDS As MailMergeDataSource
    Dim iCopie1 As Integer
    Dim iNbCopies As Integer
     
    ' Affectation des objets
    Set oDoc = ActiveDocument
    Set oDS = oDoc.MailMerge.DataSource
     
    iR = oDoc.MailMerge.DataSource.RecordCount
    'Debug.Print iR'
    For i = 1 To iR
        With oDoc.MailMerge
            'Définition du premier et dernier enregistrement
            .DataSource.FirstRecord = i
            .DataSource.LastRecord = i
            ' Envoi des données dans un nouveau document
            .Destination = wdSendToNewDocument
            ' Exécution du publipostage
            .Execute
            ' Actualisation de l'enregistrement pour la sauvegarde
            .DataSource.ActiveRecord = i
            iCopie1 = IIf(.DataSource.DataFields("COPIE_1").Value = "", 0, 1)
            iCopie2 = IIf(.DataSource.DataFields("COPIE_2").Value = "", 0, 1)
            iCopie3 = IIf(.DataSource.DataFields("COPIE_3").Value = "", 0, 1)
            iCopie4 = IIf(.DataSource.DataFields("COPIE_4").Value = "", 0, 1)
            iNbCopies = iCopie1 + iCopie2 + iCopie3 + iCopie4
            'MsgBox "Nombre copie(s) : " & iNbCopies, vbOKOnly + vbInformation, "Publipostage terminé"'
            'Utilisation du premier champ pour obtenir le nom du document
            DocName = .DataSource.DataFields("NO_DOSSIER").Value
            'Debug.Print DocName; i'
        End With
        'Sauvegarde du document publiposté
        With ActiveDocument
            If iNbCopies = 0 Then
                ActiveDocument.Sections(3).Range.Delete
                ActiveDocument.Sections(4).Range.Delete
            End If
            If iNbCopies = 1 Then
                ActiveDocument.Sections(4).Range.Delete
            Else
                ActiveDocument.Sections(3).Range.Delete
            End If
            .SaveAs "xxxxxxxxxxxxxxxxxxx\" & DocName & ".docx"
            .Close
        End With
    Next i
    MsgBox "Nombre de documents générés : " & i - 1, vbOKOnly + vbInformation, "Publipostage terminé"
    End Sub
    Ca fonctionne plutôt bien, mais j'ai encore un problème, c'est que je n'arrive pas à supprimer les saut de section, cela m'ennuie un peu.

    Et évidemment, si je veux faire une fusion "traditionnelle", il faut que je modifie mon document.

    Donc si quelque a une solution plus propre, je reste preneur.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  4. #4
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    Bonjour à toi,

    J'ai trouvé cette petite Sub qui permet de virer les saut de section qui ne sont plus nécéssaires :
    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
    Sub RemoveUnnecessarySectionBreaksButPreservePageLayout() 
        Dim i As Integer 
        Dim rngWhere As Range 
        Dim oSec As Section 
     
        For i = ActiveDocument.Sections.Count To 2 Step -1 
            Set oSec = ActiveDocument.Sections(i) 
            Set rngWhere = oSec.Range 
     
            If oSec.Headers(wdHeaderFooterPrimary).LinkToPrevious = True Then 
                rngWhere.Paragraphs.Last.Range.ParagraphFormat.PageBreakBefore = True 
                rngWhere.Paragraphs.First.Previous.Range.Characters.Last = vbCr 
            End If 
        Next 
    End Sub
    As essayé sur ton cas.
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  5. #5
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour,

    Merci pour ce code, ça fonctionne bien.

    J'ai dû un peu l'adapté à mon cas spécifique car j'ai un saut de section (2) qui ne doit pas être supprimé, ainsi que la constante de remplacement.

    Du coup, j'ai modifié la boucle et la constante, ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For iSection = ActiveDocument.Sections.Count To 3 Step -1
        Set oSec = ActiveDocument.Sections(iSection)
        Set rngWhere = oSec.Range
     
        If oSec.Headers(wdHeaderFooterPrimary).LinkToPrevious = True Then
            rngWhere.Paragraphs.Last.Range.ParagraphFormat.PageBreakBefore = True
            rngWhere.Paragraphs.First.Previous.Range.Characters.Last = vbNullString
        End If
    Next
    Le sauts de sections (3) et (4) sont bien supprimés, ainsi que le saut de section de fin de document généré par le publipostage, c'est parfait.

    Par contre, maintenant, j'ai de manière systématique une deuxième page ajoutée à mes documents, avec une seule marque de paragraphe précédée d'un petit carré noir.

    Une idée ?
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  6. #6
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    En fait, c'est cette ligne là qui posait problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rngWhere.Paragraphs.Last.Range.ParagraphFormat.PageBreakBefore = True
    J'aurais pu m'en rendre compte plus vite

    Il me reste encore un petit détail, soit supprimé deux paragraphe en fin de document, cela ne devrait pas poser trop de difficultés, du moins je l'espère.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  7. #7
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    Ceci supprime le dernier paragraphe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count).Range.Delete
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  8. #8
    Membre expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Points : 3 016
    Points
    3 016
    Par défaut
    Bonjour,

    Pourquoi ne pas insérer les copies directement avec une condition IF? cela permettrait un affichage que si elles existent directement dans le modèle puisqu'il s'agit d'un champ de la source de données
    Cordialement,
    Christophe

    Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche

  9. #9
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour Carden752,

    J'ai effectivement fait l'essai, mais cela ne me permettait pas de supprimer les puces.

    Peut-être n'ai-je pas pris suffisamment de temps pour mettre cette solution au point.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  10. #10
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Citation Envoyé par cerede2000 Voir le message
    Ceci supprime le dernier paragraphe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveDocument.Paragraphs(ActiveDocument.Paragraphs.Count).Range.Delete
    Parfait ! Merci beaucoup, ma mise en page en est grandement améliorée
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compté le nombre de pages d'un document excel
    Par Emplyst dans le forum Windows Forms
    Réponses: 3
    Dernier message: 21/02/2007, 16h11
  2. [Access 97] Nombre de copies
    Par motrin dans le forum Access
    Réponses: 2
    Dernier message: 08/07/2006, 23h16
  3. Réponses: 5
    Dernier message: 11/01/2006, 10h41
  4. [Report 6i] Editer un certain nombre de copies
    Par Invité dans le forum Oracle
    Réponses: 2
    Dernier message: 07/12/2005, 16h51
  5. [Crystal Report] Nombre de copies différentes
    Par franck.cvitrans dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 25/11/2004, 11h09

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