Dioul2
Messages postés8Date d'inscriptionmardi 21 octobre 2008StatutMembreDernière intervention 2 avril 2009
-
22 oct. 2008 à 16:16
Dioul2
Messages postés8Date d'inscriptionmardi 21 octobre 2008StatutMembreDernière intervention 2 avril 2009
-
12 nov. 2008 à 18:03
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
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 24 oct. 2008 à 20:58
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"
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 ______________________________________
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 23 oct. 2008 à 00:49
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.
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 23 oct. 2008 à 00:55
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.
Dioul2
Messages postés8Date d'inscriptionmardi 21 octobre 2008StatutMembreDernière intervention 2 avril 2009 23 oct. 2008 à 10:34
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,
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 24 oct. 2008 à 00:03
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.