Diviser un fichiers en plusieurs / saut de section VBA

Forum Microsoft Office Word

Modérateur : Argitxu

Diviser un fichiers en plusieurs / saut de section VBA

Publicité
 

nalumi
Posteur débutant
Posteur débutant
Messages : 6
Enregistré le : 03 août 2017, 14:08

Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par nalumi » 03 août 2017, 14:48

Bonjour,
Je souhaiterai diviser un gros document word généré par publipostage (environ 1300 pages) en plusieurs documents et cela au niveau de chaque saut de section.
J'ai trouvé un script vba qui me permet de faire ça à sur le site :

http://www.faqword.com/index.php/word/f ... de-section

(J'ai choisi le second script proposé)

Sub couper_sections()
Application.Browser.Target = wdBrowseSection

For i = 1 To ((ActiveDocument.Sections.Count) - 1)

'Selectionne et copie le texte de la section dans le presse-papier
ActiveDocument.Bookmarks("\Section").Range.Copy

'Crée un nouveau document et colle le texte du presse-papier
Documents.Add
Selection.Paste

' Retire le saut de section qui a été copié
Selection.MoveUp Unit:=wdLine, Count:=1, Extend:=wdExtend
Selection.Delete Unit:=wdCharacter, Count:=1

ChangeFileOpenDirectory "C:\"
DocNum = DocNum + 1
ActiveDocument.SaveAs FileName:="test_" & DocNum & ".doc"
ActiveDocument.Close
'section suivante
Application.Browser.Next
Next i
ActiveDocument.Close savechanges:=wdDoNotSaveChanges
End Sub

Cela fonctionne bien sauf que la mise en page est complétement chamboulée dans les nouveaux fichiers (taille de police, saut de ligne ...).

Est ce que vous auriez une solution pour que rien ne bouge ?

Merci !

Avatar du membre
m@rina
Administrateur
Administrateur
Messages : 1290
Enregistré le : 14 août 2009, 08:51
Contact :

Re: Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par m@rina » 06 août 2017, 18:19

Bonjour

Première chose : as-tu testé la première macro ?

Sinon, il faudrait essayer de créer un fichier normal.dotm avec les même spécifications que le fichier de publipostage (mise en page, mise en forme).

m@rina
m@rina

nalumi
Posteur débutant
Posteur débutant
Messages : 6
Enregistré le : 03 août 2017, 14:08

Re: Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par nalumi » 06 août 2017, 18:40

Bonjour,
Merci pour ta réponse

J ai essaye la première mais c était pire niveau mise en forme et comme je suis pas vraiment une pro j ai pas trop cherche et j ai gardé la deuxième qui se rapproche un peu plus de la mise en forme originale...

Quand tu parles de créer un format normal dotm est ce que tu veux dire que dans la macro je devrai remplacer le ".doc" par un autre format ?
( j ai essaye avec .pdf aussi ^^)

Désolé je me rend compte que je pedale un peu j essaye de m intéresser aux macro mais je suis vraiment novice ...

Encore merci de ta réponse ! :)

Avatar du membre
Geo Le Tourangeau
VIP
VIP
Messages : 449
Enregistré le : 09 sept. 2010, 16:19
Localisation : Tours

Re: Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par Geo Le Tourangeau » 06 août 2017, 21:34

Bonsoir
Vous pouvez essayer en supprimant la ligne :
Selection.Delete ...
de la deuxième macro ?

nalumi
Posteur débutant
Posteur débutant
Messages : 6
Enregistré le : 03 août 2017, 14:08

Re: Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par nalumi » 07 août 2017, 10:19

J'ai supprimé la ligne Selection.Delete... et j'ai défini par défaut la mise en forme de mon document d'origine et ça fonctionne !

Merci beaucoup à tous !

j'essaye de faire deux autres choses avec mon histoire :
- au lieu d'enregistrer au format word avec macro j'aimerai le faire directement en pdf ...
- et j'aimerai que cette macro nomme mes fichiers avec une nomenclature commune puis associé à une nomenclature spécifique correspondant à la 4ème ligne des mes documents séparés au niveau des sauts de section, je m'explique :

J'ai un fichier de 1300 pages qui est une compilation d'attestation correspondant à des produits différents.
Chaque attestation a la même mise en forme et la même structure :
ligne 1: Titre 1
ligne 2 :
ligne 3 : Titre 2
ligne 4 : Code archive
ligne 5 : désignation produit
....

et les attestations sont séparées par un saut de section au niveau duquel la macro me permet de diviser mon fichier source en fichier individuel par attestation.

Je voudrai enregistrer ces nouveaux fichiers une nomenclature commune (partie 1) et une nomenclature spécifique (partie 2) correspondant au code archive présent en ligne 4 de chacun de mes nouveaux documents :
partie1_partie2.doc (ou .pdf ca serait encore mieux :) )
La partie je peux la paramétrer avec la macro que j'utilise au niveau de la ligne :

ActiveDocument.SaveAs FileName:="Partie1"& DocNum & ".doc"

Mais je ne sais pas comment remplacer dans cette même ligne le "& DoxNum&" par le code archive de chaque attestation ...

Déjà merci pour votre aide pour mon premier soucis, et si jamais vous avez des idées pour le format d'enregistrement et le nom de mes fichiers je suis preneuse !

Avatar du membre
Geo Le Tourangeau
VIP
VIP
Messages : 449
Enregistré le : 09 sept. 2010, 16:19
Localisation : Tours

Re: Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par Geo Le Tourangeau » 07 août 2017, 14:46

Bonjour
Le format a sans doute suffit, il y a des chances que la suppression de la ligne ait été inutile.
Puisque ça marche, tout va bien.
Pour la ligne 4, est-ce que c'est vraiment une ligne ou un paragraphe au sens word ?
Autrement dit, si vous cliquez sur le P inversé qui est dans l'onglet d'accueil, groupe paragraphe, est-ce que vous avec ce caractère (qui symbolise la fin de paragraphe) en fin de chacune des 4 premières lignes ?
Si c'est le cas, il faut probablement un truc comme (pas testé) :
ActiveDocument.SaveAs FileName:= ActiveDocument.Paragraphs(4).Range.Text

pour le Pdf, je vais regarder dans la faq ;)

Edit : recherche couronnée de succès :
http://www.faqword.com/index.php/word/environnement/892

Si vous n'arrivez pas à recoller les morceaux, dites-le nous.

nalumi
Posteur débutant
Posteur débutant
Messages : 6
Enregistré le : 03 août 2017, 14:08

Re: Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par nalumi » 07 août 2017, 16:36

Bonjour !
J'ai vérifié ce que j'appelais "ligne 4" est bien un paragraphe au sens word :)

J'ai donc essayé avec ce que vous m'avez conseillé :
ActiveDocument.SaveAs FileName:= ActiveDocument.Paragraphs(4).Range.Text

Ca a l'air prometteur mais un message d'erreur apparait (cf pièce jointe).

(Néanmoins ce qui apparait sur la capture correspond bien à la dénomination sous laquelle je souhaiterai que mon premier fichier soit enregistré)

Ca bloque avant même d'avoir enregistré le premier fichier.
est ce que ca serait parce que dans la boucle ca intervient avant la séparation au niveau du saut de section ?
Initialement dans la macro il y a un compteur : DocNum = DocNum + 1 (et l'enregistrement fonctionnait) est il possible de définir le paragraphe 4 comme une variable et de l'incrémenter également ?
(j'ai fait quelques tentatives infructueuses du type Dim Archive as ... / Archive = ActiveDocument.Paragraphs(4) ...)

Encore merci ... :)
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Avatar du membre
Geo Le Tourangeau
VIP
VIP
Messages : 449
Enregistré le : 09 sept. 2010, 16:19
Localisation : Tours

Re: Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par Geo Le Tourangeau » 07 août 2017, 20:46

Bonsoir
Je ne sais pas trop ce qu'est cette erreur.
oui, il faut que les documents soient séparés, il aurait fallu remplacer le "ActiveDocument.SaveAs FileName..." par celui que je vous ai donné.
par contre je n'ai pas regardé avec le pdf.
Il faudrait que vous mettiez toute votre macro pour voir mieux et éventuellement tester.
Je ne vois pas bien ce que vous voulez faire en incrémentant le § 4.
Vous voulez ajouter un numéro d'ordre ?
Vous pourriez faire :
nomDuDocument = DocNum &"_" & ActiveDocument.Paragraphs(4).Range.Text
et
ActiveDocument.SaveAs FileName:=nomDuDocument, etc.

nalumi
Posteur débutant
Posteur débutant
Messages : 6
Enregistré le : 03 août 2017, 14:08

Re: Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par nalumi » 08 août 2017, 09:25

Bonjour :)

Voici la macro complète :

Sub couper_sections()
Application.Browser.Target = wdBrowseSection

For i = 1 To ((ActiveDocument.Sections.Count) - 1)

'Selectionne et copie le texte de la section dans le presse-papier
ActiveDocument.Bookmarks("\Section").Range.Copy

'Crée un nouveau document et colle le texte du presse-papier
Documents.Add
Selection.Paste

' Retire le saut de section qui a été copié
Selection.MoveUp Unit:=wdLine, Count:=1, Extend:=wdExtend
ChangeFileOpenDirectory "F:\"
nomDuDocument = "Ap5" & "_" & ActiveDocument.Paragraphs(4).Range.Text
ActiveDocument.SaveAs FileName:=nomDuDocument
ActiveDocument.Close
'section suivante
Application.Browser.Next
Next i
ActiveDocument.Close savechanges:=wdDoNotSaveChanges
End Sub

Ca bloque toujours avec le même message d'erreur et je n'ai pas encore essayer d'intégrer la partie pour l'enregistrement pdf.
Dans le message d'erreur pourtant la dénomination est complète est correcte j'ai l'impression que c'est le passage d'une section à une autre qui bloque, au niveau de la séparation des attestations.
Vous parliez de séparer le documents d'abord, il faudrait commencer par ca et ensuite créer une seconde macro pour renommer les fichiers et éventuellement les enregistrer au format pdf ?

Encore merci de votre aide et surtout de votre patience ...
Bonne journée !

Avatar du membre
Geo Le Tourangeau
VIP
VIP
Messages : 449
Enregistré le : 09 sept. 2010, 16:19
Localisation : Tours

Re: Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par Geo Le Tourangeau » 08 août 2017, 14:46

Bonjour
Voici la macro remaniée :

Code : Tout sélectionner

Sub couper_sections()
Dim SousDocument As Document
Dim ToutLeDoc As Document
Dim i As Long
Dim nomDuDocument As String
 Set ToutLeDoc = ActiveDocument
 'Positionnement en début de document
 Selection.HomeKey Unit:=wdStory, Extend:=wdMove
 Application.Browser.Target = wdBrowseSection

 For i = 1 To ((ToutLeDoc.Sections.count) - 1)
 'Selectionne et copie le texte de la section dans le presse-papier
 ActiveDocument.Bookmarks("\Section").Range.Copy

 'Crée un nouveau document et colle le texte du presse-papier
 Set SousDocument = Documents.Add
 Selection.Paste

 ' Retire le saut de section qui a été copié
  Selection.TypeBackspace
  ' compose le nom du document en supprimant la fin de paragraphe de la ligne 4
  ' ici : le nom du dossier,  puis Ap5 n° 'texte de la ligne 4'
 nomDuDocument = Replace("L:\temp\" & "Ap5" & "_" & i & "_" & SousDocument.Paragraphs(4).Range.Text & ".pdf", vbCr, "")

'enregistre dans le dossier indiqué au début du nom
  SousDocument.ExportAsFixedFormat outputFileName:=nomDuDocument, exportFormat:=wdExportFormatPDF
 'ActiveDocument.SaveAs FileName:=nomDudocument, FileFormat:=vb
 SousDocument.Saved = True
 SousDocument.Close
 'section suivante
 ToutLeDoc.Activate
 Application.Browser.Next
 Next i
 ' fermeture du document source
 ActiveDocument.Close savechanges:=wdDoNotSaveChanges
End Sub
Le dossier destinataire des pdf est directement en dur dans le nom du fichier.
J'ai aussi ajouté le n° de section dans le nom après AP5.
C'est juste pour montrer comment faire.

Bon courage

nalumi
Posteur débutant
Posteur débutant
Messages : 6
Enregistré le : 03 août 2017, 14:08

Re: Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par nalumi » 09 août 2017, 09:17

Bonjour,

Merci beaucoup :)
J'ai remplacé le : L:\temp\ par le chemin de mon dossier et lorsque je lance la macro cela fonctionne pour les 4 premiers documents puis ca bloque et affiche un message d'erreur "nom du fichier incorrect"
Est ce que ca peut être dû à un chemin de dossier trop long ?
J'ai vérifié le fichier d'origine pour voir s'il y avait bien un saut de section entre le document 4 et 5 mais tout est normal ...
Je ne vois pas trop :/
Et juste pour comprendre est ce que je peux vous demander pourquoi l'utilisation de la fonction "Replace" dans la définition du nom du document ?

Encore vraiment merci :)

Bonne journée !

Avatar du membre
Geo Le Tourangeau
VIP
VIP
Messages : 449
Enregistré le : 09 sept. 2010, 16:19
Localisation : Tours

Re: Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par Geo Le Tourangeau » 09 août 2017, 10:36

Bonjour
Pas de chance, j'ai essayé avec 4 c'était bon. :D
Un nom trop long, oui c'est possible, mais il faudrait qu'il soit très long, de mémoire on a droit à 255 caractères avec le nom du chemin. On peut tronquer si vous voulez.
Ce serait quand même mieux de connaître la cause exacte.

Hier j'ai eu le même message car Range.text contient la marque de fin de paragraphe, ce qui n'est pas autorisé dans le nom de fichier.
D'où le bricolage avec le "Replace". Mon hypothèse est donc qu'il y a un caractère particulier et interdit dans le 4-ème paragraphe ou qu'il ne se termine pas par une fin de paragraphe.
Je vais rechercher une fonction plus efficace.

Avatar du membre
Geo Le Tourangeau
VIP
VIP
Messages : 449
Enregistré le : 09 sept. 2010, 16:19
Localisation : Tours

Re: Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par Geo Le Tourangeau » 09 août 2017, 11:27

Re

Voici du code pour remplacer la préparation du nom et l'export, vous devriez identifier facilement la partie à remplacer :

Code : Tout sélectionner

  
' compose le nom du document en supprimant la fin de paragraphe de la ligne 4
  ' ici : Ap5 n° 'texte de la ligne 4'
nomDuDocument = "Ap5" & "_" & i & "_" & SousDocument.Paragraphs(4).Range.Text & ".pdf"
  'Effacer ou remplacer  tous les caractères interdits dans un nom de fichier
nomDuDocument = Replace(nomDuDocument, vbCr, "") ' supprime les fin de paragraphes
nomDuDocument = Replace(nomDuDocument, vbLf, "") ' supprime les retours à la ligne
nomDuDocument = Replace(nomDuDocument, vbCrLf, "") ' supprime les retours à la ligne
nomDuDocument = Replace(nomDuDocument, "/", "_") ' remplace les / par '_'
nomDuDocument = Replace(nomDuDocument, "\", "_") ' remplace les \ par '_'
nomDuDocument = Replace(nomDuDocument, "*", "_") ' remplace les * par '_'
nomDuDocument = Replace(nomDuDocument, "|", "_") ' remplace les | par '_'
nomDuDocument = Replace(nomDuDocument, ":", "_") ' remplace les : par '_'
nomDuDocument = Replace(nomDuDocument, Chr(34), "_") ' remplace les " par '_'
nomDuDocument = Replace(nomDuDocument, ">", "_") ' remplace les > par '_'
nomDuDocument = Replace(nomDuDocument, "<", "_") ' remplace les < par '_'
nomDuDocument = Replace(nomDuDocument, "?", "_") ' remplace les ? par '_'

'enregistre dans le dossier indiqué ci-dessous
  SousDocument.ExportAsFixedFormat outputFileName:="L:\temp\" & nomDuDocument, exportFormat:=wdExportFormatPDF
Le nom du dossier a été déplacé pour éviter d'être massacré par les instructions Replace.
Normalement, tous les caractères interdits dans Windows sont passés en revue et remplacés par un espace souligné.
Bons tests.

matisren10
Posteur débutant
Posteur débutant
Messages : 1
Enregistré le : 12 mars 2019, 18:00

Re: Diviser un fichiers en plusieurs / saut de section VBA

Message non lu par matisren10 » 13 mars 2019, 06:38

nalumi a écrit :
06 août 2017, 18:40
Bonjour,
Merci pour ta réponse

J ai essaye la première mais c était pire niveau mise en forme et comme je suis pas vraiment une pro j ai pas trop cherche et j ai gardé la deuxième qui se rapproche un peu plus de la mise en forme originale...

Quand tu parles de créer un format normal dotm est ce que tu veux dire que dans la macro je devrai remplacer le ".doc" par un autre format ?
( j ai essaye avec .pdf aussi ^^)

Désolé je me rend compte que je pedale un peu j essaye de m intéresser aux macro mais je suis vraiment novice ...

Encore merci de ta réponse ! :)
En fait tu peux aussi utiliser les séparateurs excel si tu me maîtrises pas bien les fonctionnalités VBA, mais il faut bien déterminer les critères de séparations.

Répondre