OVH Cloud OVH Cloud

Publipostage et envoi de mail

2 réponses
Avatar
fabrice
Bonjour,

je souhaiterai pouvoir automatiser l'envoi de mails suite=20
=E0 un publipostage.
L'op=E9ration s'effectue bien la premiere fois mais si je=20
souhaite effectuer un deuxieme envoi de mail l'erreur 462=20
apparait: "Le serveur distant n'existe pas ou n'est pas=20
disponible"

---------------------------------------------------
Voici mon code:
Set WordObj =3D Nothing
Set WordObj =3D CreateObject("Word.Application")
WordObj.Documents.Open (Texte & lettre & ".doc")
WordObj.Visible =3D True

ActiveDocument.MailMerge.DataSource.ActiveRecord =3D=20
wdLastRecord 'On se place sur le dernier enregistrement=20
du fichier de donn=E9es
nb =3D=20
ActiveDocument.MailMerge.DataSource.ActiveRecord 'Le=20
nombre d'enregistrements Nb est =E9gal au num=E9ro de=20
l'enregistrement actif, c'est =E0 dire le dernier
ActiveDocument.MailMerge.DataSource.ActiveRecord =3D=20
wdFirstRecord 'On se place sur le premier enregistrement=20
du fichier de donn=E9es
Numero =3D 1
ActiveDocument.MailMerge.EditMainDocument

Do While Numero <=3D nb 'D=E9but de la boucle de=20
construction du document principal
With ActiveDocument.MailMerge
.DataSource.ActiveRecord =3D Numero
End With
=20
With ActiveDocument.MailMerge 'Fusion des donn=E9es et=20
envoi de l'e-mail correspondant =E0 l'enregistrement en cours
.destination =3D wdSendToEmail
.MailAsAttachment =3D True 'Piece jointe ou dans le=20
mail
.MailAddressFieldName =3D "PERS_E_MAIL"
.MailSubject =3D "Edition de Courrier"
.SuppressBlankLines =3D False
With .DataSource
.FirstRecord =3D Numero
.LastRecord =3D Numero
End With
.Execute pause:=3DFalse
End With
Numero =3D Numero + 1 'On avance =E0 l'enregistrement=20
suivant dans la source de donn=E9es
Loop 'On retourne au d=E9but de la boucle pour la=20
construction et l'envoi d'un nouvel e-mail
'ActiveDocument.Close
Word.ActiveDocument.Close
Set WordObj =3D Nothing
-----------------------------------------------------
Sachant que l'erreur intervient lors du passage sur:
ActiveDocument.MailMerge.DataSource.ActiveRecord =3D=20
wdLastRecord

Que dois-je faire??

Merci d'avance pour vos r=E9ponses et conseils =E0 ce sujet

2 réponses

Avatar
Benoit Compoint
Bonjour,

J'ai trouvé 3 anomalies dans votre code VBA qui pourraient être la cause de
votre problème :

1. Au début du programme, vous réinitialisez la variable objet WordObj à
Nothing,
mais votre code VBA ne ferme jamais l'application Word.
Donc chaque publipostage essaie de lancer une nouvelle instance de Word.
Je vous conseille d'utiliser la méthode Quit pour forcer la fermeture de
Word.
Vous pouvez aussi laisser volontairement ouverte la première instance de
Word.
Dans ce cas vous devriez déclarer WordObj comme une variable globale, et
vous ne devriez pas le réinitialiser systématiquement à Nothing ni exécuter
Set WordObj = CreateObject("Word.Application") pour chaque nouvelle fusion.

2. A la fin de votre programme, vous écrivez :
Word.ActiveDocument.Close
La syntaxe correcte est :
WordObj.ActiveDocument.Close

3. Dans le corps de votre programme, vous utilisez plusieurs fois la
propriété ActiveDocument sans la faire précédér du nom de l'objet qui
possède cette propriété : WordObj.

Benoît Compoint.

"fabrice" wrote in message
news:030c01c39c71$00c824e0$
Bonjour,

je souhaiterai pouvoir automatiser l'envoi de mails suite
à un publipostage.
L'opération s'effectue bien la premiere fois mais si je
souhaite effectuer un deuxieme envoi de mail l'erreur 462
apparait: "Le serveur distant n'existe pas ou n'est pas
disponible"

---------------------------------------------------
Voici mon code:
Set WordObj = Nothing
Set WordObj = CreateObject("Word.Application")
WordObj.Documents.Open (Texte & lettre & ".doc")
WordObj.Visible = True

ActiveDocument.MailMerge.DataSource.ActiveRecord wdLastRecord 'On se place sur le dernier enregistrement
du fichier de données
nb ActiveDocument.MailMerge.DataSource.ActiveRecord 'Le
nombre d'enregistrements Nb est égal au numéro de
l'enregistrement actif, c'est à dire le dernier
ActiveDocument.MailMerge.DataSource.ActiveRecord wdFirstRecord 'On se place sur le premier enregistrement
du fichier de données
Numero = 1
ActiveDocument.MailMerge.EditMainDocument

Do While Numero <= nb 'Début de la boucle de
construction du document principal
With ActiveDocument.MailMerge
.DataSource.ActiveRecord = Numero
End With

With ActiveDocument.MailMerge 'Fusion des données et
envoi de l'e-mail correspondant à l'enregistrement en cours
.destination = wdSendToEmail
.MailAsAttachment = True 'Piece jointe ou dans le
mail
.MailAddressFieldName = "PERS_E_MAIL"
.MailSubject = "Edition de Courrier"
.SuppressBlankLines = False
With .DataSource
.FirstRecord = Numero
.LastRecord = Numero
End With
.Execute pause:úlse
End With
Numero = Numero + 1 'On avance à l'enregistrement
suivant dans la source de données
Loop 'On retourne au début de la boucle pour la
construction et l'envoi d'un nouvel e-mail
'ActiveDocument.Close
Word.ActiveDocument.Close
Set WordObj = Nothing
-----------------------------------------------------
Sachant que l'erreur intervient lors du passage sur:
ActiveDocument.MailMerge.DataSource.ActiveRecord wdLastRecord

Que dois-je faire??

Merci d'avance pour vos réponses et conseils à ce sujet
Avatar
fabrice
Tout d'abord,je tiens à vous remercier pour avoir répondu
à mon problème dans un tres bref délai puisque j'ai pu
avoir une proposition à mon soucis dans la journée.
De plus,vous avez corrigé mon probleme par votre 3e
proposition de résolution.En effet,il fallait faire
précéder activedocument par wordobj.
Pour rendre cela plus explicite pour les autres
lecteurs,je joins le code corrigé:

Function fusion(lettre As String) 'envoi par outlook
express avec la piece jointe
Dim Texte As String
Dim nb
Dim Numero
Dim WordObj As Word.Application

On Error GoTo err_fusion
Texte = var_chemin_doc
Set WordObj = Nothing
Set WordObj = CreateObject("Word.Application")
WordObj.Documents.Open (Texte & lettre & ".doc")
WordObj.Visible = True

With WordObj
.ActiveDocument.MailMerge.DataSource.ActiveRecord =
wdLastRecord 'On se place sur le dernier enregistrement
du fichier de données
nb
= .ActiveDocument.MailMerge.DataSource.ActiveRecord 'Le
nombre d'enregistrements Nb est égal au numéro de
l'enregistrement actif, c'est à dire le dernier
.ActiveDocument.MailMerge.DataSource.ActiveRecord =
wdFirstRecord 'On se place sur le premier enregistrement
du fichier de données
Numero = 1
.ActiveDocument.MailMerge.EditMainDocument

Do While Numero <= nb 'Début de la boucle de
construction du document principal
With .ActiveDocument.MailMerge
.DataSource.ActiveRecord = Numero
End With

With .ActiveDocument.MailMerge 'Fusion des
données et envoi de l'e-mail correspondant à
l'enregistrement en cours
.destination = wdSendToEmail
.MailAsAttachment = True 'Piece jointe ou
dans le mail
.MailAddressFieldName = "PERS_E_MAIL"
.MailSubject = "Edition de Courrier"
.SuppressBlankLines = False
With .DataSource
.FirstRecord = Numero
.LastRecord = Numero
End With
.Execute pause:úlse
End With
Numero = Numero + 1 'On avance à
l'enregistrement suivant dans la source de données
Loop 'On retourne au début de la boucle pour la
construction et l'envoi d'un nouvel e-mail
End With
WordObj.Quit wdDoNotSaveChanges
passage = 1
Exit Function

Merci encore pour votre aide.

Fabrice