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

Publipostage Word depuis Excel

4 réponses
Avatar
Pap
Hello,

Lorsque je lance un publipostage via VBA depuis l'interface Excel sur un
Objet Word Application, ça marche parfaitement, mais qu'une fois.

Lors d'un deuxième essai (Excel restant ouvert), un message m'informe que le
serveur distant est inexistant ou n'est pas disponible.

En fait j'ai fermé l'accès à la source de données pour l'objet Word, mais
comme Excel reste actif, j'ai l'impression que lui ne coupe pas la liaison
ODBC qu'il a avec Word quand bien même que l'objet Word est fermé.

Voilà mon code.... Si quelqu'un peu m'aider, un grand merci

Private Sub CommandButton1_Click()
'Variable pour l'application Word
Dim WdObjet As Word.Application
'Gestion erreur si Word n'est pas ouvert
On Error GoTo Fin
'Déclaration de l'objet word déjà ouvert
Set WdObjet = GetObject("Word.Application")
'Remise de la procédure d'erreur en vigueur pour le reste du code
On Error GoTo 0
'Sélection de la feuille article
With WdObjet
'rend invisible l'ouverture de word
.Visible = True
.Documents.Open "C:\Temp\DocPrinPubli.doc"
'Crée la connexion avec la source de données
ActiveDocument.MailMerge.OpenDataSource
Name:="C:\Temp\BDClient.xls", _
ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="",
_
WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False,
_
Format:=wdOpenFormatAuto, Connection:= _
"Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data
Source=C:\Temp\BDClient.xls;Mode=Read;Extended
Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet
OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine
Type=35;Jet" _
, SQLStatement:="SELECT * FROM `Feuil1$`", SQLStatement1:="",
SubType:= _
wdMergeSubTypeAccess
'Fusion vers un nouveau document
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With
'Devrait fermer le lien avec la source de donnée
Documents("C:\Temp\DocPrinPubli.doc").MailMerge.DataSource.Close

End With

Documents("DocPrinPubli.doc").Close
ActiveDocument.SaveAs ("C:\temp\Publi.doc")
WdObjet.Quit (wdDoNotSaveChanges)

Set WdObjet = Nothing
'Sélectionne la feuille Menu

Exit Sub
Fin: Set WdObjet = CreateObject("Word.application")
Resume Next

End Sub

4 réponses

Avatar
Gloops
Hello,

Vu l'heure je ne vais pas m'éterniser, mais il y un truc qui m'intrigue,
c'est qu'il n'y a pas de point devant
Documents("C:TempDocPrinPubli.doc").MailMerge.DataSource.Close

Si je ne m'abuse cette macro tourne sous Excel, donc on cherche un objet
Documents dans Excel, il n'existe pas. La procédure d'erreur consiste
simplement à réouvrir Word. Il pourrait être intéressant d'écrire une
procédure d'erreur plus évoluée qui affiche le numéro d'erreur, et ouvre
Word si le numéro d'erreur correspond à application non ouverte. En
mettant un stop dans la procédure d'erreur on peut débuguer
tranquillement, surtout si la procédure d'erreur se termine par Resume
Next et qu'on continue en pas à pas. Une fois qu'on a corrigé on retire
le Resume Next, parce qu'il n'a lieu d'être qu'en phase de débuguage.

En mettant un point devant l'instruction citée ci-dessus, l'objet
Documents se référera à With wdObject, ce qui me paraît plus orthodoxe.

Pas le temps de regarder si il y en a d'autres comme ça, surtout que le
manque d'indentations rendent difficile la distinction entre les
propriétés et méthodes de wdObject et les arguments de OpenDataSource.
__________________________________
Pap a écrit, le 06/10/2004 17:15 :

Hello,

Lorsque je lance un publipostage via VBA depuis l'interface Excel sur un
Objet Word Application, ça marche parfaitement, mais qu'une fois.

Lors d'un deuxième essai (Excel restant ouvert), un message m'informe que le
serveur distant est inexistant ou n'est pas disponible.

En fait j'ai fermé l'accès à la source de données pour l'objet Word, mais
comme Excel reste actif, j'ai l'impression que lui ne coupe pas la liaison
ODBC qu'il a avec Word quand bien même que l'objet Word est fermé.

Voilà mon code.... Si quelqu'un peu m'aider, un grand merci

Private Sub CommandButton1_Click()
'Variable pour l'application Word
Dim WdObjet As Word.Application
'Gestion erreur si Word n'est pas ouvert
On Error GoTo Fin
'Déclaration de l'objet word déjà ouvert
Set WdObjet = GetObject("Word.Application")
'Remise de la procédure d'erreur en vigueur pour le reste du code
On Error GoTo 0
'Sélection de la feuille article
With WdObjet
'rend invisible l'ouverture de word
.Visible = True
.Documents.Open "C:TempDocPrinPubli.doc"
'Crée la connexion avec la source de données
ActiveDocument.MailMerge.OpenDataSource
Name:="C:TempBDClient.xls", _
ConfirmConversions:úlse, ReadOnly:úlse, LinkToSource:=True, _
AddToRecentFiles:úlse, PasswordDocument:="", PasswordTemplate:="",
_
WritePasswordDocument:="", WritePasswordTemplate:="", Revert:úlse,
_
Format:=wdOpenFormatAuto, Connection:= _
"Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID­min;Data
Source=C:TempBDClient.xls;Mode=Read;Extended
Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet
OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine
Type5;Jet" _
, SQLStatement:="SELECT * FROM `Feuil1$`", SQLStatement1:="",
SubType:= _
wdMergeSubTypeAccess
'Fusion vers un nouveau document
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:úlse
End With
'Devrait fermer le lien avec la source de donnée
Documents("C:TempDocPrinPubli.doc").MailMerge.DataSource.Close

End With

Documents("DocPrinPubli.doc").Close
ActiveDocument.SaveAs ("C:tempPubli.doc")
WdObjet.Quit (wdDoNotSaveChanges)

Set WdObjet = Nothing
'Sélectionne la feuille Menu

Exit Sub
Fin: Set WdObjet = CreateObject("Word.application")
Resume Next

End Sub




Avatar
Gloops
Je disais bien qu'il était temps que j'arrête ...
_____________________________________
Gloops a écrit, le 12/10/2004 02:24 :
Pas le temps de regarder si il y en a d'autres comme ça, surtout que le
manque d'indentations rendent difficile la distinction entre les


*******
propriétés et méthodes de wdObject et les arguments de OpenDataSource.


Avatar
Gloops
De plus en plus gag.
C'est "le manque rendent", qui me paraît bizarre.
Mais les coupures de lignes ne se faisaient pas où je croyais. Bref.
_____________________________________
Gloops a écrit, le 12/10/2004 02:33 :

Je disais bien qu'il était temps que j'arrête ...
_____________________________________
Gloops a écrit, le 12/10/2004 02:24 :

Pas le temps de regarder si il y en a d'autres comme ça, surtout que
le manque d'indentations rendent difficile la distinction entre les



*******

propriétés et méthodes de wdObject et les arguments de OpenDataSource.






Avatar
Gloops
Bon, d'accord, j'ai court-circuité "On Error Goto 0".
N'empêche, ça serait bien de s'intéresser à cette histoire de point.

Gloops a écrit, le 12/10/2004 02:24 :

Hello,

Vu l'heure je ne vais pas m'éterniser, mais il y un truc qui m'intrigue,
c'est qu'il n'y a pas de point devant
Documents("C:TempDocPrinPubli.doc").MailMerge.DataSource.Close

Si je ne m'abuse cette macro tourne sous Excel, donc on cherche un objet
Documents dans Excel, il n'existe pas. La procédure d'erreur consiste
simplement à réouvrir Word. Il pourrait être intéressant d'écrire une
procédure d'erreur plus évoluée qui affiche le numéro d'erreur, et ouvre
Word si le numéro d'erreur correspond à application non ouverte. En
mettant un stop dans la procédure d'erreur on peut débuguer
tranquillement, surtout si la procédure d'erreur se termine par Resume
Next et qu'on continue en pas à pas. Une fois qu'on a corrigé on retire
le Resume Next, parce qu'il n'a lieu d'être qu'en phase de débuguage.

En mettant un point devant l'instruction citée ci-dessus, l'objet
Documents se référera à With wdObject, ce qui me paraît plus orthodoxe.

Pas le temps de regarder si il y en a d'autres comme ça, surtout que le
manque d'indentations rendent difficile la distinction entre les
propriétés et méthodes de wdObject et les arguments de OpenDataSource.
__________________________________
Pap a écrit, le 06/10/2004 17:15 :

Hello,

Lorsque je lance un publipostage via VBA depuis l'interface Excel sur un
Objet Word Application, ça marche parfaitement, mais qu'une fois.

Lors d'un deuxième essai (Excel restant ouvert), un message m'informe
que le
serveur distant est inexistant ou n'est pas disponible.

En fait j'ai fermé l'accès à la source de données pour l'objet Word, mais
comme Excel reste actif, j'ai l'impression que lui ne coupe pas la
liaison
ODBC qu'il a avec Word quand bien même que l'objet Word est fermé.

Voilà mon code.... Si quelqu'un peu m'aider, un grand merci

Private Sub CommandButton1_Click()
'Variable pour l'application Word
Dim WdObjet As Word.Application
'Gestion erreur si Word n'est pas ouvert
On Error GoTo Fin
'Déclaration de l'objet word déjà ouvert
Set WdObjet = GetObject("Word.Application")
'Remise de la procédure d'erreur en vigueur pour le reste du code
On Error GoTo 0
'Sélection de la feuille article
With WdObjet
'rend invisible l'ouverture de word
.Visible = True
.Documents.Open "C:TempDocPrinPubli.doc"
'Crée la connexion avec la source de données
ActiveDocument.MailMerge.OpenDataSource
Name:="C:TempBDClient.xls", _
ConfirmConversions:úlse, ReadOnly:úlse, LinkToSource:=True, _
AddToRecentFiles:úlse, PasswordDocument:="",
PasswordTemplate:="",
_
WritePasswordDocument:="", WritePasswordTemplate:="",
Revert:úlse,
_
Format:=wdOpenFormatAuto, Connection:= _
"Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User
ID­min;Data
Source=C:TempBDClient.xls;Mode=Read;Extended
Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet
OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet
OLEDB:Engine
Type5;Jet" _
, SQLStatement:="SELECT * FROM `Feuil1$`", SQLStatement1:="",
SubType:= _
wdMergeSubTypeAccess
'Fusion vers un nouveau document
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:úlse
End With
'Devrait fermer le lien avec la source de donnée
Documents("C:TempDocPrinPubli.doc").MailMerge.DataSource.Close

End With

Documents("DocPrinPubli.doc").Close
ActiveDocument.SaveAs ("C:tempPubli.doc")
WdObjet.Quit (wdDoNotSaveChanges)

Set WdObjet = Nothing
'Sélectionne la feuille Menu

Exit Sub
Fin: Set WdObjet = CreateObject("Word.application")
Resume Next

End Sub