Envoyer à Word un paramètre de publipostage : une Source des données particulière

EtienneChouard

XLDnaute Nouveau
Bonjour,

À partir d'un tableau d'adresses calculées sous Excel (Adresses.xls), j'aimerais envoyer un paramètre à Word, au moment d'ouvrir un document principal de fusion (Fiche_rappel.doc, déjà créé et enregistré à l'avance) :

Je voudrais juste demander à Word d'utiliser une Source des données bien précise (calculée dans Excel, en fonction de l'emplacement actuel du classeur).

Ceci permettrait d'éviter les erreurs (sous Word) qui surviennent chaque fois qu'on déplace l'ensemble de l'application "BDD Excel + Document principal Word".


Pour l'instant, mon code est simplement :

Code:
Sub Publipostage()

MyAppID = Shell("Winword.EXE """ & Range("DossierCourant") & "Fiche_rappel.doc""", 1)

End Sub

Et je voudrais imposer à Word, par exemple, d'utiliser l'adresse suivante comme source des données variables : C:\Mes documents\Mailing\Adresses.xls, à la place de l'adresse que le Document principal mémorise actuellement (celle qui était active lors de sa dernière sauvegarde).

Auriez-vous des suggestions ou des pistes ?


Remarque :
Le nom des cellules à prendre dans ce classeur est toujours le même : "ZoneRécapAjustée" (nom calculé au plus juste, un peu avant la ligne de code qui lance Word). Je ne sais pas si le paramètre à donner à Word peut ou doit préciser, en plus du classeur, la plage à utiliser.


D'avance, un grand merci :)

Étienne.
 
Dernière édition:
G

Guest

Guest
Re : Envoyer à Word un paramètre de publipostage : une Source des données particulièr

Bonjour,

Voici comment je m'y prendrai.
Il faut non seulement indiquer le fichier mais également la plage des données (nommée de préférence) ici Datas

Code:
[COLOR=blue]Sub[/COLOR] ToWord()
 
    [COLOR=blue]Dim[/COLOR] wdApp [COLOR=blue]As[/COLOR] [COLOR=blue]Object[/COLOR]
    [COLOR=blue]Dim[/COLOR] wdDoc [COLOR=blue]As[/COLOR] [COLOR=blue]Object[/COLOR]
 
    [COLOR=blue]Set[/COLOR] wdApp = CreateObject([I]"Word.Application"[/I])
    wdApp.Visible = [COLOR=blue]True[/COLOR]
    [COLOR=green]'Ouvrir le document[/COLOR]
    [COLOR=blue]Set[/COLOR] wdDoc = wdApp.Documents.[COLOR=blue]Open[/COLOR]([I]"D:\Mes Documents\.......\datasourceWord.doc"[/I])
 
    [COLOR=green]'Renseigner sa DataSource[/COLOR]
    [COLOR=blue]With[/COLOR] wdDoc.MailMerge
        .OpenDataSource _
                Name:=ThisWorkbook.FullName, _
                SQLStatement:=[I]"SELECT * FROM [Datas]"[/I]
    End[/COLOR] [COLOR=blue]With[/COLOR]
 
    [COLOR=green]'....Suite du traitement sur le document            [/COLOR]
    [COLOR=green]'*************** IMPORTANT **********************************[/COLOR]
[COLOR=#008000] '            Bien nettoyer les variables après avoir quitté proprement l'application[/COLOR]
[COLOR=#008000]'***********************************************************[/COLOR]
    [COLOR=green]'Fermeture du document sans enregistrement des modifications'[/COLOR]
    [COLOR=green]'et nettoyage de la variable document[/COLOR]
    wdDoc.[COLOR=blue]Close[/COLOR] [COLOR=blue]False[/COLOR]
    [COLOR=blue]Set[/COLOR] wdDoc = [COLOR=blue]Nothing[/COLOR]
 
    [COLOR=green]'Quitter l'application et nettoyage de la variable idoine[/COLOR]
    wdApp.Quit
    [COLOR=blue]Set[/COLOR] wdApp = [COLOR=blue]Nothing[/COLOR]
 
[COLOR=blue]End[/COLOR] [COLOR=blue]Sub[/COLOR]

A la place du nom de la plage tu peux mettre aussi une adresse de plage: [Feuil1$A1:B31]

Attention à la place du '$' juste après le nom de la feuille mais pas dans les adresses de cellules.

Le chemin du fichier quant à lui peut être ThisWorkBook.FullName

A+
 
Dernière modification par un modérateur:

EtienneChouard

XLDnaute Nouveau
Re : Envoyer à Word un paramètre de publipostage : une Source des données particulièr

Merci Hasco, c'est exactement ce dont j'avais besoin :)

Je vais adapter ton exemple à mon cas et je reviendrai faire un tour car j'ai deux ou trois petites merdouilles qui sont nées à cette occasion et pour lesquelles j'aurai peut-être encore besoin d'un tuyau.

En tout cas, merci beaucoup, vraiment :)

@+

Étienne.
 

EtienneChouard

XLDnaute Nouveau
Re : Envoyer à Word un paramètre de publipostage : une Source des données particulièr

Bonsoir,

Encore merci Hasco, tu m'as bien aidé.

Pour la plupart des petits problèmes résiduels, je me suis débrouillé comme un grand ;)

Il me reste juste une difficulté pour la partie publipostage par mail :

je ne sais pas programmer le message des mails si je choisis d'attacher le document en pièce jointe (MailAsAttachment = True).

Si tu sais comment faire, ça me permettrait d'éviter d'envoyer des mails vides :rolleyes:


Merci à tous pour ce site havre de paix où les hommes s'aident volontiers les uns les autres. C'est la démonstration politique qu'un monde de collaboration et de solidarité est possible.

Merci à tous :)

Étienne.



PS : pour info, si ça peut servir à quelqu'un, voici le code (très cromagnonesque) que j'ai mis au point autour de la suggestion d'Hasco :


Code:
Sub Publipostage()

'===============
'PRÉPARATION
'===============

'Par sous-programme, on donne d'abord un nom bien ajusté aux cellules remplies pour que le publipostage ne soit pas ralenti pour rien :

SP_Dénommer_Récapitulatif_zone_ajustée

'==================================
'Création d'un classeur vierge, pour y recopier la BDD qui ne doit pas être ouverte si on utilise l'instruction MailMerge :
'==================================

'Mémorisation du nom actuel pour y revenir tout à l'heure :
PRINCIP = ActiveWorkbook.Name

'Préparation du nom de fichier pendant qu'on est encore dans le classeur qui permet de le calculer :
NOMFICHIER = Range("DossierCourant") & "TEMP.xls"

Workbooks.Add

'On va donner un nom de classeur qui existe déjà : on désactive les messages d'erreur :
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:=NOMFICHIER _
    , FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
    ReadOnlyRecommended:=False, CreateBackup:=False Application.DisplayAlerts = True

'On renomme aussi la feuille : 
Sheets("Feuil1").Name = "Récap"
'On mémorise le nom de la fenêtre pour y revenir tout à l'heure :
TEMPO = ActiveWorkbook.Name

'On retourne au modèle, pour y copier la plage BDD :
Windows(PRINCIP).Activate
Application.Goto Reference:="Récapitulatif_zone_ajustée"
Selection.Copy

Windows(TEMPO).Activate
'Et on la colle en valeur, puis en format, dans le classeur temporaire :
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
Cells.EntireColumn.AutoFit
Application.CutCopyMode = False

'Par sous-programme, comme on l'a fait dans le modèle, on donne dans la copie un nom bien ajusté aux cellules remplies pour que le publipostage ne soit pas ralenti pour rien :

SP_Dénommer_Récapitulatif_zone_ajustée

'On sauve et on ferme :
ActiveWorkbook.Save
ActiveWorkbook.Close
Range("E2").Select

'==================================


'===============
'PUBLIPOSTAGE
'===============

Dim wdApp As Object
Dim wdDoc As Object

Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True

'Ouvrir le document
NOMDOC = Range("DossierCourant") & "Fiche_rappel.doc"
Set wdDoc = wdApp.Documents.Open(NOMDOC)

'Renseigner sa DataSource
With wdDoc.MailMerge
    .OpenDataSource _
            Name:=Range("DossierCourant") & "TEMP.xls", _
            SQLStatement:="SELECT * FROM [Récapitulatif_zone_ajustée]"

    'Pour que les champs affichent toujours leur valeur (et pas leur nom) :
    .ViewMailMergeFieldCodes = False

    'Pour mémoriser les champs utiles au publipostage électronique (et que les valeurs par défaut de l'outil 'Fusionner vers un message électronique' soient bien initialisées, ce qui évite à l'utilisateur de les retaper à chaque fois) :
    .Destination = wdSendToEmail
    .MailSubject = "Votre fiche"
    'il faut choisir une seule des deux lignes suivantes (exclusives l'une de l'autre, il faut en mettre une en commentaires) :
    '.MailFormat = wdMailFormatPlainText    'Soit le document est traduit en Format texte brut dans le corps du texte, et on perd toutes les mises en forme
    .MailAsAttachment = True                'Soit le document est attaché en pièce jointe, mais on n'a aucun texte dans le corps du mail

    .SuppressBlankLines = True
End With

'Une fois sous Word, c'est l'utilisateur qui contrôle ses fiches et qui lance soit l'impression, soit les mails, soit les deux. En quittant Word, il revient à Excel.

End Sub



Sub SP_Dénommer_Récapitulatif_zone_ajustée()

ActiveSheet.Unprotect
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
LARGEUR = Selection.Columns.Count
Range(Selection, Selection.End(xlDown)).Select
HAUTEUR = Selection.Rows.Count
ActiveWorkbook.Names.Add Name:="Récapitulatif_zone_ajustée", RefersToR1C1:="=Récap!R1C1:R" & HAUTEUR & "C" & LARGEUR
Range("E2").Select
ActiveSheet.Protect

End Sub
 
G

Guest

Guest
Re : Envoyer à Word un paramètre de publipostage : une Source des données particulièr

Bonjour Etienne,

Je connais moins le VBA Word que celui d'excel. Mais pour le MailFormat as-tu essayé: wdMailFormatHTML.

ci-dessous un exemple pour montrer comment utiliser les plages de cellules sans avoir à les sélectionner (j'ai laissé Range("A2").Select car je ne sais pas s'il est important ou non).

Code:
[COLOR=blue]Sub[/COLOR] SP_Dénommer_Récapitulatif_zone_ajustée()
[COLOR=blue]Dim[/COLOR] HAUTEUR [COLOR=blue]As[/COLOR] [COLOR=blue]Long[/COLOR], LARGEUR [COLOR=blue]As[/COLOR] [COLOR=blue]Long[/COLOR]
    [COLOR=blue]With[/COLOR] ActiveSheet
        .Unprotect
        [COLOR=green]'Retourne la zone rectangulaire de A1[/COLOR]
        [COLOR=blue]With[/COLOR] Range([I]"A1"[/I]).CurrentRegion
            LARGEUR = .Columns.Count
            HAUTEUR = .Rows.Count
            ActiveWorkbook.Names.Add Name:=[I]"Récapitulatif_zone_ajustée"[/I], RefersToR1C1:=[I]"=Récap!R1C1:R"[/I] & HAUTEUR & [I]"C"[/I] & LARGEUR
        [COLOR=blue]End[/COLOR] [COLOR=blue]With[/COLOR]
        .Range([I]"E2"[/I]).[COLOR=blue]Select[/COLOR]
        .Protect
    [COLOR=blue]End[/COLOR] [COLOR=blue]With[/COLOR]
[COLOR=blue]End[/COLOR] [COLOR=blue]Sub[/COLOR]

A+
 

EtienneChouard

XLDnaute Nouveau
Re : Envoyer à Word un paramètre de publipostage : une Source des données particulièr

Cher Hasco,

Je te remercie : effectivement, ton code est beaucoup plus élégant, nettement moins cromagnonesque :)

Je connais wdMailFormatHTML, que j'ai essayé en code mais qui semble bugué : aucun mail ne part quand MailFormat est ainsi réglé.

C'est d'ailleurs le cas également quand on lance le publipostage par mail à la main : quand on choisit HTML avec l'outil Fusionner avec un message électronique (à droite de la barre d'outils Fusion et publipostage), aucun mail ne part. Bug ou maladresse de ma part ? Je ne sais pas.

Et c'est précisément parce que cette fonctionnalité semble en panne que je cherche une instruction pour définir le message du mail avec du code VBA. Comment faire ? Mystère et pomme de terre...

Merci à toi, pour ton aide précieuse.

Amicalement.

Étienne.
 

Discussions similaires

Statistiques des forums

Discussions
312 380
Messages
2 087 800
Membres
103 664
dernier inscrit
wolvi71