Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Publipostage, boucle

8 réponses
Avatar
lilou51
Bonjour,

J'aurais besoin d'un peu d'aide, car là, je bloque...

J'ai un code qui est capable de générer une lettre par enregistrement
correspondant à la combinaison de 2 critères (colonnes 2 & 37).
Le souci c'est qu'il ne génère qu'une lettre et qu'il faudrait qu'il génére
plusieurs lettres car il existe plusieurs enregistrements qui ont eux aussi
cette combinaison.
Il y a une histoire de boucle ou de filtre à gérer que je ne sais pas gérer.
Je joins le code :
-------
Sub Macro()


Dim iR As Integer
Dim i As Integer
Dim oDoc As Document
Dim DocName As String
Dim oDS As MailMergeDataSource


Set oDoc = ActiveDocument
Set oDS = oDoc.MailMerge.DataSource

iR = oDoc.MailMerge.DataSource.RecordCount - 1

Debug.Print x


sup = MsgBox("Voulez-vous démarrer la fusion du document ?",
vbYesNoCancel + vbQuestion, "Fusion ?")



If sup = vbYes Then


For i = 1 To iR
With oDoc.MailMerge
.DataSource.FirstRecord = i
.DataSource.LastRecord = i
.Destination = wdSendToNewDocument
.Execute
.DataSource.ActiveRecord = i
DocName = .DataSource.DataFields(37).Value
DocName = DocName & "-" & .DataSource.DataFields(2).Value
Debug.Print DocName; i
End With
With ActiveDocument
.SaveAs "c:\" & DocName & ".doc"
.Close
End With

Next i
End If

End Sub
------

Est-ce que cela inspire qq'un ?... Ce serait chouette !

Merci bcp d'avance pour votre aide & votre disponibilité

8 réponses

Avatar
parci
On 3 fév, 23:37, lilou51 wrote:
Bonjour,

J'aurais besoin d'un peu d'aide, car là, je bloque...

J'ai un code qui est capable de générer une lettre par enregistrement
correspondant à la combinaison de 2 critères (colonnes 2 & 37).
Le souci c'est qu'il ne génère qu'une lettre et qu'il faudrait qu'il génére
plusieurs lettres car il existe plusieurs enregistrements qui ont eux aus si
cette combinaison.
Il y a une histoire de boucle ou de filtre à gérer que je ne sais pas gérer.
Je joins le code :
-------
Sub Macro()

Dim iR As Integer
Dim i As Integer
Dim oDoc As Document
Dim DocName As String
Dim oDS As MailMergeDataSource

Set oDoc = ActiveDocument
Set oDS = oDoc.MailMerge.DataSource

iR = oDoc.MailMerge.DataSource.RecordCount - 1

Debug.Print x

    sup = MsgBox("Voulez-vous démarrer la fusion du document ?",
vbYesNoCancel + vbQuestion, "Fusion ?")

If sup = vbYes Then

For i = 1 To iR
    With oDoc.MailMerge
        .DataSource.FirstRecord = i
         .DataSource.LastRecord = i
        .Destination = wdSendToNewDocument
        .Execute
        .DataSource.ActiveRecord = i
        DocName = .DataSource.DataFields(37).Value
        DocName = DocName & "-" & .DataSource.DataFields(2).Val ue
        Debug.Print DocName; i
    End With
    With ActiveDocument
        .SaveAs "c:" & DocName & ".doc"
        .Close
    End With

Next i
End If

End Sub
------

Est-ce que cela inspire qq'un ?... Ce serait chouette !

Merci bcp d'avance pour votre aide & votre disponibilité



Supprime ta boucle (For i = 1 To iR) et écrit par exemple :

With oDoc.MailMerge
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Destination = wdSendToNewDocument
.Execute
End With

En supposant qu'il y ait bien une source de données associé à ton doc .
Sinon, on peut le faire dynamiquement avec la méthode OpenDataSource.
Ajoute Option Explicit en entête du module aussi.

La suite sur microsoft.public.fr.word
Avatar
lilou51
Bonjour Parci,

je n'ai pas bien compris ou qq ch m'échappe... Le code que tu me donnes
c'est le code de la fusion simple.
Mais comment je gère en ce cas les "x" fichiers correspondant aux "x"
combinaisons de 2 critères (et intégrant eux-mêmes un certains nb de lettres
/ destinataires) ?
Je ne sais pas à quoi sert l'Option Explicit et comment l'utiliser, ce
qu'elle appporte ?

Merci,


Supprime ta boucle (For i = 1 To iR) et écrit par exemple :

With oDoc.MailMerge
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Destination = wdSendToNewDocument
.Execute
End With

En supposant qu'il y ait bien une source de données associé à ton doc..
Sinon, on peut le faire dynamiquement avec la méthode OpenDataSource.
Ajoute Option Explicit en entête du module aussi.


Avatar
parci
On 4 fév, 12:50, lilou51 wrote:
Bonjour Parci,

je n'ai pas bien compris ou qq ch m'échappe... Le code que tu me donnes
c'est le code de la fusion simple.
Mais comment je gère en ce cas les "x" fichiers correspondant aux "x"
combinaisons de 2 critères (et intégrant eux-mêmes un certains nb d e lettres
/ destinataires) ?
Je ne sais pas à quoi sert l'Option Explicit et comment l'utiliser, ce
qu'elle appporte ?

Merci,



Désolé, j'étais à coté de la plaque. Tu peux le faire comme ça

With oDoc.MailMerge.DataSource
.ActiveRecord = wdFirstRecord
Do While .ActiveRecord <> .LastRecord
.FirstRecord = .ActiveRecord
.LastRecord = .ActiveRecord
oDoc.MailMerge.Execute False
' ici tu sauvegardes le doc actif
.ActiveRecord = wdNextRecord
Loop
End With

Ma version de Word ne connait pas DataSource.RecordCount mais sur le
principe ça ne change rien à ce que tu fais. Donc, si ça ne fonctionn e
pas pour toi, le problème vient sans doute de ta source de données.

Option Explicit en entête de module impose la déclaration des
variables, ça t'évitera plein d'erreurs.

Tu devrais aussi gérer les erreurs, surtout lors de la sauvegarde (la
combinaison des 2 champs est-elle un nom de fichier possible ?
remplacer le fichier si il existe déjà ou pas ? un doc de même nom es t-
il déjà ouvert ? ...)
Avatar
lilou51
je comprends pas ... à quel moment ds le process on dit que la fusion doit
correspondre à l'enregistrement actuel jusqu'au dernier enregistrement ayant
les 2 mêmes critères identiques ?

Parce que là, si je lis bien, on dit si les lignes entières (record) sont
identiques ? Alors que tous les records sont bien différents mais certains
ont 2 critères semblables.

Dès lors que 2 critères sont semblables (ils sont triés en fonction de cela
sous Excel), alors on fait la fusion et on génère un fichier au nom des 2
critères (et accessoirement, on fait un pdf, mais pour cela, je sais faire).

Dis-moi ?
Avatar
lilou51
Holà Parci !

En fait la macro n'enclenche rien...
Ca marchait pr toi ?
Merci.
Avatar
parci
On 4 fév, 17:51, lilou51 wrote:
je comprends pas ... à quel moment ds le process on dit que la fusion d oit
correspondre à l'enregistrement actuel jusqu'au dernier enregistrement ayant
les 2 mêmes critères identiques ?

Parce que là, si je lis bien, on dit si les lignes entières (record) sont
identiques ? Alors que tous les records sont bien différents mais certa ins
ont 2 critères semblables.



Ok, ,j'avais pas compris.

Sub Publi

Dim oDoc As Document
Dim c1 As String
Dim c2 As String
Dim nFirst As Long
Dim nLast As Long
Dim i As Long
Dim nbRecords As Long
Dim bLast As Boolean

Set oDoc = ActiveDocument

With oDoc.MailMerge
.OpenDataSource ' tes paramètres suivant le format des données
(voir l'aide pour les détails)
.Destination = wdSendToNewDocument
End With


With oDoc.MailMerge.DataSource
.ActiveRecord = wdLastRecord
nbRecords = .ActiveRecord
.ActiveRecord = wdFirstRecord
i=1

If nbRecords = 0 Then
Exit Sub
End if

Do
c1 = .DataFields(2)
c2 = .DataFields(37)
nFirst = i

Do While (c1 & c2) = (.DataFields(1) & .DataFields(2))
If .ActiveRecord = nbRecords Then
bLast = True
Exit Do
End If
.ActiveRecord = wdNextRecord
i = i + 1
Loop

If Not bLast Then
nLast = i - 1
Else
nLast = nbRecords
End If

.FirstRecord = nFirst
.LastRecord = nLast
oDoc.MailMerge.Execute False
' ici tu sauvegardes le doc actif
' avec un nom du type : path & c1 & c2 & ".doc"

Loop While Not bLast
End With

End Sub


Ca suppose que les données source soient triées sur les colonnes 2 et
37.
Il manquait l'appel de OpenDataSource dans ta macro d'origine pour
qu'elle fasse quelque chose.
Ma version de Word ne connait pas MailMerge.DataSource.RecordCount,
donc je l'ai calculé.
Avatar
parci
a écrit :





Correction :

c1 = .DataFields(2)
c2 = .DataFields(37)

Do While (c1 & c2) = (.DataFields(2) & .DataFields(37))
Avatar
lilou51
Bonjour !

Merci bcp Parci pour ton aide.... Mais ça n'a pas voulu marché. Pdt mon
absence du forum pdt les 10 derniers jours, j'ai continué à chercher et j'ai
trouvé !... Pour ceux qui serait intéressés voici comment ça marche...

Il fallait compter le nb de records contenant la combinaison des 2 colonnes,
mais en décallant d'une ligne vers le haut (en ligne 2, on calcule le nb de
combinaison identiques à celle présente en ligne 3). J'ai donc ajouté pour +
de simplicité cette colonne directement ds le fichier source + une colonne
combinaison.
Formule concatener de combinaison (col. AQ) ²&"-"&AK2
Formule compteur de combinaisons (col. AR)
=SI(ESTVIDE(AQ3);0;NB.SI($AQ$2:$AQ$53;AQ3)-1)

Partant de là, on peut faire la macro suivante

i = 1

With oDoc.MailMerge
.DataSource.ActiveRecord = 1
End With

Do While i <= iR
With oDoc.MailMerge
j = .DataSource.DataFields(6).Value
.DataSource.FirstRecord = i
.DataSource.LastRecord = i + j
.Destination = wdSendToNewDocument
.Execute
.DataSource.ActiveRecord = i + j
DocName = .DataSource.DataFields(2).Value
DocName = DocName & "-" & .DataSource.DataFields(1).Value
Debug.Print DocName; i
End With
' Sauvegarde du document publiposté
With ActiveDocument
.SaveAs stChemin & "" & DocName & ".doc"
End with

i = i + j + 1
Loop