Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3333 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] Erreur 4605 lors d'un Publipostage.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VBA] Erreur 4605 lors d'un Publipostage.

n°2316993
Arnaud42
Cépafo!
Posté le 15-06-2018 à 16:05:34  profilanswer
 

Madame! Monsieur!  [:the bloodhound gang]  
 
Je viens vous rendre visite au sujet de publipostage en VBA.
 
J'vous explique rapidement : Je dispose d'un fichier Excel qui fait office de source de données ainsi qu'un fichier Word qui fait office de document de fusion.  
J'ai donc écrit une petite macro qui se charge du publipostage. Mais plus que l'automatisation du traitement, c'est davantage la possibilité d'enregistrer chaque résultat du publipostage dans un document Word et PDF distinct qui m’intéressait là...
 
Ainsi pour chaque ligne de ma source de données, je génère un document Word et son équivalent PDF à l'image de mon document de fusion.
L'tout fonctionne.... Presque... Bien!  [:thektulu]  
 
En effet, aléatoirement (Enfin! C'plus systématiquement dernièrement... :D), le traitement s'arrête et Visual Basic me gratifie d'un :
http://www.kirikoo.net/images/7Arnaud42-20180615-155120.png
 
Message qui se rapporte visiblement à l'instruction :

Code :
  1. .MailMerge.Execute


 
Sauf que j'obtiens pareil message après qu'Excel ait déjà passé 190-200 lignes en revue et que le fichier Word soit bien dûment généré au même titre que les 190-200 précédents.
 
Z'auriez une idée?  
J'suis à vot' écoute!
:jap:
 
Edit1 : Avec un petit peu de code... Cela sera peut être plus parlant! :D
Voilà le code se chargeant du Publipostage.

Code :
  1. For i = 1 To iR
  2.        
  3.         With FicWord.MailMerge
  4.             'Définition du premier et dernier enregistrement
  5.             .DataSource.FirstRecord = i
  6.             .DataSource.LastRecord = i
  7.            
  8.             ' Envoi des données dans un nouveau document
  9.             .Destination = wdSendToNewDocument
  10.             ' Exécution du publipostage
  11.             .Execute
  12.            
  13.             ' Récupération du nom du fichier Word généré pour le Publipostage
  14.             Nom_FicPub = AppWord.ActiveDocument.Name
  15.            
  16.             ' Actualisation de l'enregistrement pour la sauvegarde
  17.             .DataSource.ActiveRecord = i
  18.            
  19.             'Utilisation des champs de fusion pour générer le libellé du document
  20.                 If .DataSource.DataFields("Désignation" ).Value = "" Then
  21.                     AppWord.Documents(Nom_FicPub).Close SaveChanges:=False
  22.                     GoTo Suivant 'Next i
  23.                 Else
  24.                     If .DataSource.DataFields("N_de_Révision__insertion_date_du_jour" ).Value = "" Then
  25.                         NomCertificat = "Certificat Général " & .DataSource.DataFields("Désignation" ).Value
  26.                     Else
  27.                         Version = Split(.DataSource.DataFields("N_de_Révision__insertion_date_du_jour" ).Value, " " )
  28.                         NomCertificat = "Certificat Général " & .DataSource.DataFields("Désignation" ).Value & " V" & Mid(Version(1), 3)
  29.                     End If
  30.                
  31.                     'Suppression des caractères suivants que Windows refuserait dans le libellé du fichier
  32.                     NomCertificat = Replace( _
  33.                         Replace( _
  34.                         Replace( _
  35.                         Replace( _
  36.                         Replace( _
  37.                         Replace( _
  38.                         Replace(NomCertificat, _
  39.                             ":", "-" ), _
  40.                             "\", "-" ), _
  41.                             "/", "-" ), _
  42.                             "?", "" ), _
  43.                             "*", "" ), _
  44.                             "[", "-" ), _
  45.                             "]", "-" )
  46.                 End If
  47.         End With
  48.        
  49.         ' Sauvegarde du document publiposté
  50.         With AppWord.Documents(Nom_FicPub)
  51.             Nb_Certificat = Nb_Certificat + 1
  52.             .SaveAs CheminExportWord & NomCertificat & ".doc"
  53.             .ExportAsFixedFormat CheminExportPDF & NomCertificat & ".pdf", wdExportFormatPDF, False
  54.             .Close
  55.         End With
  56. Suivant:
  57. Next i


 
Edit2 : J'viens de me rendre compte que lorsque le traitement s'arrête, seul le document Word de fusion est ouvert. Je n'ai pas le document issu de :  .Destination = wdSendToNewDocument  devant normalement accueillir le résultat du publipostage.


Message édité par Arnaud42 le 21-06-2018 à 11:45:51

---------------
[VDS] Enermax MaxRevo 1350W - TV 22" - Samsung 913V - Dock Lenovo USB-C - Clavier/Souris MX5500 [ACH] Xeon E5-1680v2
mood
Publicité
Posté le 15-06-2018 à 16:05:34  profilanswer
 

n°2317116
Arnaud42
Cépafo!
Posté le 19-06-2018 à 17:20:45  profilanswer
 

[:ignition] C'est encore moi! Oui! Je travaille au problème en parallèle! :D
 
Comme Microsoft semble indiquer qu'il est possible de rencontrer l'erreur 4605 quand la propriété Visible du document est à False, j'ai donc autorisé l'affichage des documents Word (L'Doc de Fusion + L'Doc Temporaire) le temps d'un Publipostage.
 
Publipostage avec/sans Word avec une liste de 230 Résultats : Le traitement s'est arrêté après 167 lignes traitées, 115 lignes traitées... Ca fluctue pas mal! Et la propriété Visible semble ne pas changer grand chose ;)


---------------
[VDS] Enermax MaxRevo 1350W - TV 22" - Samsung 913V - Dock Lenovo USB-C - Clavier/Souris MX5500 [ACH] Xeon E5-1680v2
n°2317124
MaybeEijOr​Not
but someone at least
Posté le 19-06-2018 à 19:40:51  profilanswer
 

Bonjour,
 
As-tu testé de vérifier l'état du publipostage comme indiqué : https://msdn.microsoft.com/fr-fr/vb [...] bject-word
Je pense que le publipostage est réalisé de manière asynchrone, du coup si ton script s’exécute plus rapidement que le publipostage alors ça bug.
Il faudrait donc qu'à chaque tour de boucle tu attendes que le publipostage soit terminé.
 
Après je ne m'y connais pas trop, donc ce n'est qu'une hypothèse.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2317190
Arnaud42
Cépafo!
Posté le 21-06-2018 à 11:45:06  profilanswer
 

Bonjour MaybeEijOr?Not,
 
Je te remercie de t'être penché sur le sujet :jap:  
 
J'ai testé l'état du Publipostage! Bien sûr!
Quand tout se passe bien, la propriété .State me renvoyait la valeur 2 (wdMainAndDataSource). RAS donc!
Quand le traitement se grippe, la propriété .State me renvoyait la valeur 1 (wdMainDocumentOnly). J'ai donc commencé à envisager de palier à cela en ajoutant la (re)connexion au fichier de données au besoin.  [:benou_suisse]  
 
Puis! La solution vint d'une constatation fortuite... :D Et loin de ce sur quoi je m'orientais.
 
C'est en testant, pour la nième fois, le fonctionnement de la macro avec un fichier de données différent de celui que j'utilisais pour mes tests que je me suis aperçu que le nombre d'itérations de la boucle était bien inférieur aux nombre de lignes de la source de données... J'attendais 230 itérations et Excel m'a indiqué n'avoir fait que 114 tours de boucles. [:transparency]
Je me suis donc rapidement tourné vers la manière de calculer le nombre de lignes contenues dans la source de données et me suis aperçu bien vite que la commande :  

Code :
  1. ThisWorkbook.Worksheets("2018" ).Range("B:B" ).CurrentRegion.Rows.Count - 1

arrêtait légitimement le compteur à la première occurrence d'une ligne vide... La 116e pour ladite source de données.
 
Je l'ai donc remplacé par :

Code :
  1. ThisWorkbook.Worksheets("2018" ).Range("B" & Rows.Count).End(xlUp).Row - 1


 
Excel semble beaucoup mieux le vivre puisque les traitements déroulent sans la moindre anomalie à présent.
Comme quoi!  [:wonderwoman2]
 
Merci en tout cas pour le coup de main :jap:


---------------
[VDS] Enermax MaxRevo 1350W - TV 22" - Samsung 913V - Dock Lenovo USB-C - Clavier/Souris MX5500 [ACH] Xeon E5-1680v2

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] Erreur 4605 lors d'un Publipostage.

 

Sujets relatifs
A-t-on vraiment besoin du VBA sur Excel ? Voyez-vous même[VBA] Filtrage adressage ip
[VBA Excel] Tirage de personne en aleatoire selon 2 conditions[VBA] Mettre en forme une partie d'une cellule
[VBA Excel] Recuperer une couleur mise en forme par condition[VBA/HTML] SET de champ qui marche en F8 mais pas en F5
VBA / lancer un publipostage[VBA] requete SQL dans un programme VB pour publipostage vers word
Problème publipostage automatisé Word VBA[VBA] Comment créer un publipostage en vba sous word?
Plus de sujets relatifs à : [VBA] Erreur 4605 lors d'un Publipostage.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR