Macro Publipostage PDF - Erreur aléatoire
Bonjour à tous !
Je fais appel à votre aide car j'ai un problème avec une macro VBA dans Word dans le cadre de publipostages...
L'idée de ce code est de préparer un publipostage comme si on souhaitait le faire "normalement" et ensuite de lancer la macro pour qu'à chaque occurrence du publipostage il l'enregistre en PDF dans un dossier spécifique et qu'il lui donne le nom d'une donnée présente dans la 1ère, 2e... colonne (c'est l'utilisateur qui choisit).
J'ai à peu de choses près la même macro qui publiposte les fichiers en autant de Word individuels et là-dessus aucun problème...
Sauf que dans le cas des PDF, j'ai toujours la même erreur : la macro s'arrête en cours de route (95% du temps) et ce, de manière complètement aléatoire. Le message d'erreur me dit que "l'objet à été supprimé !" Je peux recommencer le même publipostage avec la même base, la 1ere fois il en fera 6 et la 2e il n'en fera que 5 ou peut-être 10...
J'aurais donc aimé savoir si dans le code que vous pourrez retrouver ci-dessous, vous voyez quelque chose qui cloche ^^ ?
Travaillant avec Sharepoint, j'avais d'abord pensé à un problème d'actualisation/de rafraichissement des données qui faisait que le fichier source s'actualisait trop lentement mais en faisant le test directement depuis le C:\, c'est la même chose. J'ai également testé de mettre un Sleep(1000) pour ralentir un peu le code mais rien n'y fait...
D'avance merci pour l'aide que vous voudrez bien m'apporter :)
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub PublipostagePDFv2()
'Déclaration des variables
Dim Repertoire, monRepertoire As Variant
Dim SourceDonnees As MailMergeDataSource
Dim Enregistrement As MailMergeDataField
Dim colName As Integer
Dim i As Long, j As Long
Dim FichierPDF As String
colName = InputBox("Veuillez entrer le numéro de la colonne dans votre base de données qui servira de titre a vos documents (par défaut, c'est la 1ère colonne qui est utilisée)", "Titre", "Entrez 1, 2, 3...")
'Définir le chemin du dossier de destination
Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
Application.FileDialog(msoFileDialogFolderPicker).Title = "Choix du répertoire de stockage des fichiers générés"
Repertoire.Show
If Repertoire.SelectedItems.Count = 0 Then Exit Sub
monRepertoire = Repertoire.SelectedItems(1)
'Ouvrir la source de données et le document principal
Set SourceDonnees = ActiveDocument.MailMerge.DataSource
'Boucle à travers chaque enregistrement
For i = 1 To SourceDonnees.RecordCount
'Définir le nom de fichier PDF
FichierPDF = monRepertoire & "\" & SourceDonnees.DataFields(colName).Value & ".pdf"
'Exécuter le publipostage pour l'enregistrement courant
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = i
.LastRecord = i
End With
.Execute Pause:=False
End With
'Enregistrer le document en PDF
ActiveDocument.ExportAsFixedFormat OutputFileName:=FichierPDF, ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:=wdExportOptimizeForPrint, Range:=wdExportAllDocument, Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, BitmapMissingFonts:=True, UseISO19005_1:=False
'Fermer le document courant
ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges
'Passer à l'enregistrement suivant
SourceDonnees.ActiveRecord = wdNextRecord
'Sleep (1000)
Next i
'Fermer la source de données
SourceDonnees.Close
'Afficher un message de confirmation
MsgBox "Terminé !", vbInformation
End SubBonjour Ropperlinp
J'aurais donc aimé savoir si dans le code que vous pourrez retrouver ci-dessous, vous voyez quelque chose qui cloche ^^ ?
Travaillant avec Sharepoint, j'avais d'abord pensé à un problème d'actualisation/de rafraichissement des données qui faisait que le fichier source s'actualisait trop lentement mais en faisant le test directement depuis le C:\, c'est la même chose. J'ai également testé de mettre un Sleep(1000) pour ralentir un peu le code mais rien n'y fait...
A première vue, je ne vois malheureusement rien qui cloche
Lorsque ave le message, cliquez sur "debogage" qu'elle ligne est en surbrillance ?
A+
Bonjour Bruno ! et merci de ta réactivité.
Malheureusement, c'est un peu ce que je craignais..
Comme la macro peut (très rarement mais quand même) fonctionner jusqu'au bout, je reste convaincu que le problème est ailleurs... mais je ne vois pas où.
Le pire est que je n'ai même pas le débranchement dans l'editeur VBA avec la fonctionnalité débogage. J'ai seulement une fenêtre d'erreur windows comme quoi l'objet a été supprimé et je n'ai le pas d'autre choix que de cliquer sur Ok ou Annuler (ce qui revient au même). C'est pour ça que j'ai pensé à un problème de synchro avec Sharepoint (d'où ma pause de 1s pour laisser le temps au dossier partagé d'actualiser le nouveau fichier).
En tout cas, je vais continuer de chercher !
Merci
Après avoir fait un 2e essai avec la fonction Sleep(1000), j'arrive bien sur le débogage et c'est la ligne
'Passer à l'enregistrement suivant
SourceDonnees.ActiveRecord = wdNextRecordqui se met en surbrillance. Mais comme il me disait que "l'objet a été supprimé", j'imagine que c'est pour ça qu'il ne peut pas passer à l'enregistrement suivant.
Re,
Ce qui me gène un peu quand même après réflexion, c'est que tu utilises toujours "ActiveDocument"
Essaye avec ceci
Option Explicit
#If VBA7 Then
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
Sub PublipostagePDFv2()
'Déclaration des variables
Dim ThisDoc As Document
Dim Repertoire, monRepertoire As Variant
Dim SourceDonnees As MailMergeDataSource
Dim Enregistrement As MailMergeDataField
Dim colName As Integer
Dim i As Long, j As Long
Dim FichierPDF As String
colName = InputBox("Veuillez entrer le numéro de la colonne dans votre base de données qui servira de titre a vos documents (par défaut, c'est la 1ère colonne qui est utilisée)", "Titre", "Entrez 1, 2, 3...")
'Définir le chemin du dossier de destination
Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
Application.FileDialog(msoFileDialogFolderPicker).Title = "Choix du répertoire de stockage des fichiers générés"
Repertoire.Show
If Repertoire.SelectedItems.Count = 0 Then Exit Sub
monRepertoire = Repertoire.SelectedItems(1)
' CHANGEMENT ICI
' Définir ce document comme étant la source
Set ThisDoc = ThisDocument
'Ouvrir la source de données et le document principal
Set SourceDonnees = ThisDoc.MailMerge.DataSource
'Boucle à travers chaque enregistrement
For i = 1 To SourceDonnees.RecordCount
'Définir le nom de fichier PDF
FichierPDF = monRepertoire & "\" & SourceDonnees.DataFields(colName).Value & ".pdf"
'Exécuter le publipostage pour l'enregistrement courant
With ThisDoc.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = i
.LastRecord = i
End With
.Execute Pause:=False
End With
'Enregistrer le document actif en PDF
With ActiveDocument
.ExportAsFixedFormat OutputFileName:=FichierPDF, ExportFormat:=wdExportFormatPDF, _
OpenAfterExport:=False, OptimizeFor:=wdExportOptimizeForPrint, Range:=wdExportAllDocument, _
Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, CreateBookmarks:=wdExportCreateNoBookmarks, _
DocStructureTags:=True, BitmapMissingFonts:=True, UseISO19005_1:=False
'Fermer le document courant
.Close SaveChanges:=wdDoNotSaveChanges
End With
Sleep (1000)
'Passer à l'enregistrement suivant
SourceDonnees.ActiveRecord = wdNextRecord
Next i
'Fermer la source de données
SourceDonnees.Close
'Afficher un message de confirmation
MsgBox "Terminé !", vbInformation
End SubJe ne peux pas tester par contre, je ne sais pas si cela changera quelque chose
A+
Hey ! Je n'avais pas vu ça et c'est probablement une piste.
Pour l'instant j'ai simplement une erreur sur cette ligne là
SourceDonnees.Closeoù la boite de dialogue m'indique que l'objet n'est pas disponible...
Re,
C'est normal, s'il y a déjà une erreur sur la ligne donnée précédemment
A+
Je comprends. Cependant avec la dernière version, il ne démarre même pas la macro. L'erreur se produit dès l'exécution du code.
Je vais continuer de chercher. Encore merci pour ton aide.
Re,
Je ne connais pas trop le VBA sous Word, c'est certainement cette ligne qui pose problème
Set ThisDoc = ThisDocumentEssaye plutôt
Set ThisDoc = Application.ActiveDocumentA+
Effectivement avec cette modification, ça passe !
Cependant j'ai toujours la ligne
SourceDonnees.ActiveRecord = wdNextRecordqui pose problème. J'ai l'impression qu'il tourne en boucle. Il a éxecuté plusieurs fois la boucle mais n'a créé qu'un seul fichier PDF (j'imagine qu'ils se sont mutuellement écrasés..). Mais bref, je ne vais pas t'embêter plus.
La solution viendra peut-être après une bonne nuit.
Encore merci de ton aide en tout cas. J'ai déjà pu amélioré le code avec ta proposition.