[Catégorie modifiée VB6 -> VBA] Publipostage Excel/Word création d'un fichier wo

jeanlucr Messages postés 2 Date d'inscription mercredi 27 octobre 2010 Statut Membre Dernière intervention 27 octobre 2010 - 27 oct. 2010 à 14:16
jeanlucr Messages postés 2 Date d'inscription mercredi 27 octobre 2010 Statut Membre Dernière intervention 27 octobre 2010 - 27 oct. 2010 à 17:44
Bonjour,

J'ai besoin d'éditer un grand nombre de courriers.
J'ai une base excel avec les renseignements nécessaires et un courrier type sous word.
J’ai une macro qui crée un fichier par ligne excel, mais je souhaiterai variabiliser le nom du fichier avec le contenu de certaines cellules. Je m’explique : le nom du fichier alimenté par la ligne i sera constitué de la valeur de la cellue W de la ligne i.
Je souhaiterai également savoir comment alimenter directement la variable nbredoc avec le nombre de ligne du classeur excel

Merci d'avance

Voici ma macro
Sub Generation_Fiches_traitements()
'
' Generation_Fiches_traitements Macro
' Macro enregistrée le 10/10/2010 par JLR
'
' Variables :
' Nombre de documents a generer
nbredoc = 4
' Prefixe utilise pour la generation du nom des doc
modeldoc = "AMA_PRD_appli_"
' repertoire ou les documents generes sont sauvegardes
dirdoc = "C:\Users\JLR\Documents\ARSOE\Generation de fiches - wrk\Livraison"
directoryimage = "C:\Documents and Settings\Jean-Luc RIVET\Mes documents\ARSOE\Generation de fiches - wrk\Fiches Chaines\Images Chaines"

For i = 1 To nbredoc
'creation du document
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.MailAsAttachment = False
.MailAddressFieldName = ""
.MailSubject = ""
.SuppressBlankLines = True
With .DataSource
.FirstRecord = i
.LastRecord = i
End With
.Execute Pause:=True
'definition du format du numero du traitement
End With
If i < 10 Then
i = "00000" & i
Else
If i < 100 Then
i = "0000" & i
Else
If i < 1000 Then
i = "000" & i
Else
If i < 10000 Then
i = "00" & i
Else
i = "0" & i
End If
End If
End If
End If

' definition du nom du document cree
file_name = modeldoc & i & ".doc"
' on cree le document dans le repertoire designe par dirdoc
ChangeFileOpenDirectory dirdoc
' Ajout de liens Hyperlink par recuperation du nom dans le doc
Selection.MoveDown Unit:=wdLine, Count:=6
Selection.MoveRight Unit:=wdCell
chaine_name = Selection.Text
chaine_adress = Selection.Text & ".doc"
ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:= _
chaine_adress, SubAddress:="", ScreenTip:="", TextToDisplay:= _
chaine_name
' Sauvegarde du document actif
ActiveDocument.SaveAs FileName:=file_name, FileFormat:= _
wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
SaveAsAOCELetter:=False
' fermeture du document actif
ActiveWindow.Close
'passage au suivant
Next i

End Sub

3 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
27 oct. 2010 à 14:53
Salut et bienvenu

Observe bien la catégorie des questions liées à VBA. Merci.

Quand tu colles du code, utilise la coloration syntaxique = 3ème icone à droite. La lecture sera facilité, surtout quand il y a des If ou des With

Première chose que me saute aux yeux :
Ta gestion du format sur 7 digits est lourde.
Remplace tous ces If par cette simple ligne :
i = Format(i, "0000000")

Méfiance aussi aux variables qui changent de type à tout de bras. 'i' est tantôt une chaine, tantôt un chiffre : quand tu feras i = i + x, pas sûr qu'il fasse une addition, mais risque de coller le contenu de 'x' à ton 'i'.
--> Voir le dimensionnement des variables et la définition de leurs types

" j'ai une base Excel "
Oui, mais ton programme tourne sur Excel ou sur Word ?
Apparemment, c'est sous Word.

Tout ce que tu cherches doit dans ton DataSource, je pense.
Regarde dans l'aide s'il a une propriété .Count ou .RecordCount qui te renverrai le nombre d'enregistrements.
Pour ce qui est du contenu de la cellule de la colonne W, tu ne pourras y avoir accès que si elle est dans le DataSource
--> Voir l'aide sur l'objet MailMergeDataSource et ses propriétés comme .Field permettant de désigner le nom de la colonne

Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
27 oct. 2010 à 14:55
"permettant de désigner le nom de la colonne"
Colonne du DataSource, pas de la feuille Excel.
0
jeanlucr Messages postés 2 Date d'inscription mercredi 27 octobre 2010 Statut Membre Dernière intervention 27 octobre 2010
27 oct. 2010 à 17:44
Merci beaucoup pour ces conseils.
ça marche nickel

voici le source

Sub Generation_Fiches_traitements()
'
' Generation_Fiches_traitements Macro
' Macro enregistrée le 10/10/2010 par JLR
'
' Variables :
' repertoire ou les documents generes sont sauvegardes
dirdoc = "C:\Users\JLR\Documents\ARSOE\Generation de fiches - wrk\Livraison"
directoryimage = "C:\Documents and Settings\Jean-Luc RIVET\Mes documents\ARSOE\Generation de fiches - wrk\Fiches Chaines\Images Chaines"
' Nombre de documents a generer
With ActiveDocument.MailMerge
With .DataSource
nbredoc = .RecordCount - 1
End With
End With

For i = 1 To nbredoc
'creation du document
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.MailAsAttachment = False
.MailAddressFieldName = ""
.MailSubject = ""
.SuppressBlankLines = True
With .DataSource
.FirstRecord = i
.LastRecord = i
End With
.DataSource.ActiveRecord = i
nom_fiche = .DataSource.DataFields(23)
.Execute Pause:=True
End With
' definition du nom du document cree
file_name = nom_fiche & ".doc"

' on cree le document dans le repertoire designe par dirdoc
ChangeFileOpenDirectory dirdoc
' Ajout de liens Hyperlink par recuperation du nom dans le doc
Selection.MoveDown Unit:=wdLine, Count:=7
Selection.MoveRight Unit:=wdCell
chaine_name = Selection.Text
chaine_adress = Selection.Text & ".doc"
ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:= _
chaine_adress, SubAddress:="", ScreenTip:="", TextToDisplay:= _
chaine_name
Selection.MoveDown Unit:=wdLine, Count:=8
Selection.MoveRight Unit:=wdCell
chaine_name = Selection.Text
chaine_adress = Selection.Text & ".doc"
ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:= _
chaine_adress, SubAddress:="", ScreenTip:="", TextToDisplay:= _
chaine_name
' Sauvegarde du document actif
ActiveDocument.SaveAs FileName:=file_name, FileFormat:= _
wdFormatDocument, LockComments:=False, Password:="", AddToRecentFiles:= _
True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:= _
False, SaveNativePictureFormat:=False, SaveFormsData:=False, _
SaveAsAOCELetter:=False
' fermeture du document actif
ActiveWindow.Close
'passage au suivant
Next i

End Sub
0
Rejoignez-nous