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 Sub

Bonjour 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 = wdNextRecord

qui 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 Sub

Je 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.Close

où 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 = ThisDocument

Essaye plutôt

Set ThisDoc = Application.ActiveDocument

A+

Effectivement avec cette modification, ça passe !

Cependant j'ai toujours la ligne

SourceDonnees.ActiveRecord = wdNextRecord

qui 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.

Rechercher des sujets similaires à "macro publipostage pdf erreur aleatoire"