URL de document Word dans une macro Excel [Résolu]

Signaler
Messages postés
8
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
2 avril 2009
-
Messages postés
8
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
2 avril 2009
-
Bonjour à tous et merci à ceux qui m'ont aidé à réaliser ma macro!
Voilà, j'ai une nouvelle interrogation.

Ma macro a pour but de publiposter ma base excel avec un doc Word pré établi. Le problème est que ce document Word est désigné par un chemin précis.

Souhaitant pouvoir fusionner mes documents Word et Excel depuis une clé USB, je dois changer le chemin d'accès à ma base et à mon doc Word en permanence.

Quelqu'un aurait-il une solution pour, soit intégrer mes lettres directement dans excel, soit pour que le chemin de mon doc Word soit toujours le même, mm si ma clef USB passed 'un ord à l'autre (donc devient H: ou I: etc.)

Sub Mail()
'Nécessite d'activer la référence "Microsoft Word xx.x Object Library"
    Dim docWord As Word.Document
    Dim appWord As Word.Application
    Dim NomBase As String
   
 
    NomBase = "C:\Documents and Settings\EKV380\Bureau\Essai TI.xls"
   
    Application.ScreenUpdating = False
    Set appWord = New Word.Application
    appWord.Visible = True
    'Ouverture du document principal Word
    Set docWord = appWord.Documents.Open("C:\Documents and Settings\EKV380\Bureau\Bureau\Personnel\TI\Modèle de courrier\Mail acceptation.doc")
   
    'fonctionnalité de publipostage pour le document spécifié
    With docWord.mailMerge
                'Ouvre la base de données
                .OpenDataSource Name:=NomBase, _
            Connection:="Driver={Microsoft Excel Driver (*.xls)};" & _
            "DBQ=" & NomBase & "; ReadOnly=True;", _
            SQLStatement:="SELECT * FROM [Feuil1$]"
        'Spécifie la fusion vers l'imprimante
        .Destination = wdSendToNewDocument
        .suppressBlankLines = True
            'Prend en compte l'ensemble des enregistrements
            With .DataSource
                .firstRecord = wdDefaultFirstRecord
                .lastRecord = wdDefaultLastRecord
            End With
        'Exécute l'opération de publipostage
        .Execute Pause:=False
    End With
   
    docWord.Close
    Application.ScreenUpdating = True
   
End Sub

Je vous remercie de votre aide!

6 réponses

Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
4
Bonjour Dioul2


Voilà la nouvelle version, qui tient compte de notre dernier échange et de tes quatre premières questions que je rappelle

Q1 : le "type" sera-t-il valable pour toutes mes "Sub" de mon module ou dois-je l'écrire avant chaque macro?
Q2 : Ce "type" veut simplement dire que tout ce qui sera définit par MesFichiers sera soit du type Word, soit du type Excel, c'est ca?
Q3 : La function chercheconfig doit-elle être présente dans le corps de la macro ou à part (comme le "type")? Si c'est à part, sera-t-elle valable pour toutes les macros de mon module?
Q4 :- ".MonFichierXls": il ne me semble pas qu'on ait défini ce que c'était. Peux-tu m'expliquer? Dois-je rentrer un autre nom?
_______________________________

' En haut de ton module, déclaration unique du type mesFichiers (cf. ta question n° 1)



type mesFichiers
    Xls as string        ' variable pour le chemin du classeur Excel (cf. ta question n° 2)
    Doc as string      ' variable de stockage du chemin du document Word
end type


sub mail
dim fichier as mesFichiers
    fichier = chercheConfig
...
nomBase = fichier.Xls
...

'Ouverture du document principal Word
    Set docWord = appWord.Documents.Open(fichier.Doc)
...
end sub   ' je l'avais oublié dans mon code précédent, d'où ta question n° 3 (désolé !)

function chercheConfig() as mesFichiers
   dim candidatXls as string, candidatDoc as string
' est-ce que les fichiers sont sur le HDD ?
   candidatXls = "
C:\Documents and Settings\EKV380\Bureau\Essai TI.xls"
   candidatDoc = "C:\Documents and S Settings\EKV380"\Bureau\Bureau\Personnel\TI\Modèle de courrier\Mail acceptation.doc")
if dir(candidatXls
) <> "" and dir(candidatDoc) <> "" then
    with chercheConfig
        .Xls = candidatXls      ' Xls au lieu de monFichierXls (cf. ta question n° 4)
        .Doc = candidatDoc   ' Doc au lieu de monFichierDoc (id.)
    end with
else
' on suppose que les fichiers sont sur la clé USB (alias Zip, cf. ta question n° 5)
   candidatXls = "D:\...\Essai TI.xls"    ' à modifier
   candidatDoc = "D:\...\Mail acceptation.doc   ' à modifier
endif
end function
_____________________________________

Est-ce que ce code fonctionne ?

Si oui, tu peux l'optimiser en remplaçant ton instruction :

   NomBase = "C:\Documents and Settings\EKV380\Bureau\Essai TI.xls"

par :

  Nombase = Workbooks("Essai TI.xls").path & application.pathSeparator & "Essai TI.xls"

  et en supprimant, dans mon propre code toutes les déclarations et variables faisant référence au classeur Excel,

en effet, comme tu as dit que : la baseExcel sur laquelle je m'appuie est un onglet du classeur xls dans lequel se trouve la macro
______________________________________

Cordialement
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
4
Bonjour

C'est un problème récurrent quand on travaille sur une même appli chez soi et au boulot (enfin, quand le boss n'est pas là). J'ai été confronté à cette situation, et j'ai trouvé deux solutions :

   - tuer le boss. C'est simple, mais pas efficace : la Direction Générale aurait tôt fait de nommer un remplaçant ;

   - écrire une fonction qui cherche le document dans les différents répertoires possibles. J'ai écrit ça (enfin, j'ai un peu modifié pour que cela colle à ton appli) :

type mesFichiers
    Xls as string
    Doc as string
end type



sub mail
dim fichier as mesFichiers
    fichier = chercheConfig
...
nomBase = fichier.Xls
...

'Ouverture du document principal Word
    Set docWord = appWord.Documents.Open(fichier.Doc)
...

function chercheConfig() as mesFichiers
   dim candidatXls as string, candidatDoc as string
   candidatXls = "
C:\Documents and Settings\EKV380\Bureau\Essai TI.xls"
   candidatDoc = "C:\Documents and S Settings\EKV380"\Bureau\Bureau\Personnel\TI\Modèle de courrier\Mail acceptation.doc")
if dir(candidatXls
) <> "" and dir(candidatDoc) <> "" then
    with chercheConfig
        .monFichierXls = candidatXls
        .monFichierDoc = candidatDoc
    end with
else
   ... meme chose avec le zip
endif
end function


Comme quoi, on peut parfois résoudre un problème informatique sans devoir nécessairement se mettre du sang sur les mains.

Est-ce que ma solution t'aide ?
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
4
Au fait, quand je réfléchis, si j'avais choisi la première solution, ça n'aurait pas réglé le problème. Mon boss serait mort pour rien... En plus, il est plutôt sympa.
Messages postés
8
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
2 avril 2009

Merci de ton aide Orohena!
Je suis débutant en VBA et il y a quelques points que j'ai du mal à comprendre:

- le "type" sera-t-il valable pour toutes mes "Sub" de mon module ou dois-je l'écrire avant chaque macro?
Ce "type" veut simplement dire que tout ce qui sera définit par MesFichiers sera soit du type Word, soit du type Excel, c'est ca?

- La function chercheconfig doit-elle être présente dans le corps de la macro ou à part (comme le "type")? Si c'est à part, sera-t-elle valable pour toutes les macros de mon module?

- ".MonFichierXls": il ne me semble pas qu'on ait défini ce que c'était. Peux-tu m'expliquer? Dois-je rentrer un autre nom?

- Qu'entends-tu par même chose avec le "Zip"?

- Enfin, la baseExcel sur laquelle je m'appuie est un onglet du classeur xls dans lequel se trouve la macro. ne peut-on pas directement lui dire qu'elle se trouve dans cet onglet, quel que soit le chemin d'accès du classeur?

Je te remercie de tes réponses,
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
4
Bonjour Dioul2



- le "type" sera-t-il valable pour toutes mes "Sub" de mon module ou dois-je l'écrire avant chaque macro? C'est une très bonne question. Une déclaration de type est faite au niveau module ; elle est donc unique est valable pour tout le module. Si tu veux qu'elle s'applique à tous tes modules de ton application , il faut mettre public type

Ce "type" veut simplement dire que tout ce qui sera définit par MesFichiers sera soit du type Word, soit du type Excel, c'est ca? Non, disons plutôt, pour faire simple, qu'il découpe une variable en deux "sous-variables" .Doc et .Xls, qui sont toutes deux de type string. En utilisant une variable type comme parametre de la fonction chercheConfig(), celle-ci renvoie une seule variable, avec deux "sous-variables".

La function chercheconfig doit-elle être présente dans le corps de la macro ou à part (comme le "type")? Si c'est à part, sera-t-elle valable pour toutes les macros de mon module?La fonction chercheConfig est extérieure à la macro. Je vois pourquoi tu poses cette question, je n'ai pas mis le end sub du sub Mail. Il faut donc lire :



sub mail
...
end sub
sub chercheConfig
...
end sub





- ".MonFichierXls": il ne me semble pas qu'on ait défini ce que c'était. Peux-tu m'expliquer? Dois-je rentrer un autre nom?
Oups ! tu as tout à fait raison
.MonFichierXls    dsl, il faut lire    .Xls
.MonFichierDoc
    idem, lire       .Doc

Si c'est à part, sera-t-elle valable pour toutes les macros de mon module?Oui. Chaque macro qui veut récupérer le chemin des fichiers pourra (et devra) l'appeler.






- Qu'entends-tu par même chose avec le "Zip"?
Oh, par là j'entends pas grand'chose ! aurait répondu Pierre Dac . Je suis désolé, je ne sais vraiment pas pourquoi j'ai tapé Zip, je voulais parler de la clé USB. Exemple :




'   ...même chose avec la clé USB
  candidatXls = "D:\Essai TI.xls"
   candidatDoc = "D:\Mail acceptation.doc")
if dir(candidatXls) <> "" and dir(candidatDoc) <> "" then
    with chercheConfig
        .monFichierXls = candidatXls
        .monFichierDoc = candidatDoc
    end with

- Enfin, la baseExcel sur laquelle je m'appuie est un onglet du classeur xls dans lequel se trouve la macro. ne peut-on pas directement lui dire qu'elle se trouve dans cet onglet, quel que soit le chemin d'accès du classeur? Oui, bien sûr. Comme tu as surligné en rouge le chemin complet de ta baseExcel, j'avais pensé qu'elle était dans un autre classeur que ta macro. Je pensais aussi qu'elle était sur la même unité de disque que ton document Word (tantôt sur le HDD, tantôt sur la clé USB). J'aurais dû mieux lire ton message.
Ta question peut s'écrire comme cela : est-ce que la propriété Name de l'objet openDataSource peut spécifier le nom d'une feuille de calcul plutôt que celui d'un classeur Excel. Hmmm, je t'avoue que je n'en sais rien. Le mieux est de consulter la doc en ligne et de faire un essai.



Le mieux, c'est que je t'envoie une version corrigée de mon chercheConfig() qui tienne compte de toutes ces remaques. Ca fera l'objet d'un msg d'ici 1 h ou 2.

@+
Messages postés
8
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
2 avril 2009

Merci de ton aide!