Découpe d'un fichier Word selon nombre de pages donné
Rookiz
Messages postés11Date d'inscriptionlundi 12 mars 2012StatutMembreDernière intervention21 mars 2012
-
19 mars 2012 à 17:22
Palickia -
11 juin 2013 à 16:14
Bonjour,
Je n'ai vraiment pas un bon niveau en VB et je m'excuse si ma demande ressemble à d'autres à quelques détails près.
Je cherche a découper un résultat de plublipostage. Selon le publipostage que je traite, j'ai parfois besoin de coupe mon fichier toutes les X pages.
Voila la première macro que j'ai trouvé et adapté à mon besoin :
Sub DissocierPage()
Dim NomDocDepart As String
Dim j As Long
Dim Termine As Boolean
Dim PgDepart As Long
Dim Dossier As String, DossierSauvegarde As String
Dim DecouperEn As Integer
Dim NumLigne As Integer, NumMot1 As Integer, NumMot2 As Integer
DecouperEn = InputBox("Combien de page fait le document ?", "Question")
NumLigne = InputBox("A quelle ligne se situe les Nom/Prénom ?", "Personnalisation du nom de fichier")
NumMot1 = InputBox("A quelle place se situe le Nom ?", "Personnalisation du nom de fichier")
NumMot2 = InputBox("A quelle place se situe le Prénom ?", "Personnalisation du nom de fichier")
Application.ScreenUpdating = False
NomDocDepart = ActiveDocument.Name
Dossier = ActiveDocument.Path
DossierSauvegarde = Dossier & Application.PathSeparator & "Découpe"
VerifDossier (DossierSauvegarde)
Selection.EndKey Unit:=wdStory
Selection.HomeKey Unit:=wdStory
Termine = False
ChangeFileOpenDirectory DossierSauvegarde
Do While True
PgDepart = Selection.Range.Start
For j = 1 To DecouperEn
Application.Browser.Next
Next
If Selection.Range.Start = PgDepart Then
Termine = True
Selection.EndKey Unit:=wdStory
Else
Selection.MoveLeft Unit:=wdCharacter, Count:=1
End If
ActiveDocument.Range(Start:=PgDepart, End:=Selection.Range.Start).Copy
Documents.Add NewTemplate:=False
Selection.Paste
ActiveDocument.SaveAs FileName:=ActiveDocument.Paragraphs(NumLigne).Range.Words(NumMot1) + "_" + _
ActiveDocument.Paragraphs(NumLigne).Range.Words(NumMot2) + _
".doc", FileFormat:=wdFormatDocument
ActiveDocument.Close
Documents(NomDocDepart).Activate
If Termine Then Exit Do
Selection.MoveRight Unit:=wdCharacter, Count:=1
Loop
Application.ScreenUpdating = True
Private Sub VerifDossier(ByVal DossierSauvegarde As String)
On Error GoTo erreur
ChDir DossierSauvegarde
Exit Sub
erreur:
If Err.Number = 76 Then
MkDir DossierSauvegarde
Resume Next
End If
End Sub
Le problème, c'est que cette macro ne me copie pas les en-têtes et pied de pages.
J'ai donc cherché autre chose et j'ai trouvé cette deuxième macro qui la me copie les en-tête et pied de page, mais me fait une découpe page par page. Voici la macro :
Sub DissocierPage() 'Permet de créer un fichier par page
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
Alors, j'essai de l'adapter, mais il y a plein de variable/intitulé que je ne comprend pas. Je fais des tests entre mes deux macros, mais je n'arrive pas a obtenir de bon résultat.
Es-ce que quelqu'un saurait m'aider gracieusement s'il vous plaît ?
Merci beaucoup pour le temps que vous prendrez à me répondre.
Cordialement,
Rookiz
A voir également:
Découpe d'un fichier Word selon nombre de pages donné
Si tu veux faire un document global de publipostage puis séparer chaque envoi en fichiers distincts, la seconde macro devrait faire l'ouvrage, si tu ne modifies aucunement le document fusionné après le publipostage. Dans ce cas, si chaque envoi individuel est de cinq pages, chaque nouveau fichier aura cinq pages.
Si tu veux séparer le document fusionné en extraits fixes de, disons, 7 pages et imprimer les entêtes et pieds de pages, là, il faudra penser à autre chose. Si tes envois individuels sont de 5 pages et que tu coupes à 7 pages, tu auras environ un document et demi par fichier.
Ceci dit, quelques commentaires sur les deux macros. Premièrement, ne jamais au grand jamais indiquer un numéro de page, de ligne manuellement avec des InputBox. Les paginations et calculs manuels à partir de l'écran, de même que les sauts de lignes seront bien souvent différents à l'écran et à l'impression. Même que d'imprimer sur des imprimantes différentes peut tout saboter.
La première macro utilise l'objet Selection pour sélectionner une partie, ou l'ensemble du texte. Cependant, l'objet Selection ne peut pas sélectionner les en-têtes et pieds de page.
La deuxième macro permet de sélectionner des sections de document, lesquelles sections sont définies par l'auteur à la rédaction du document. Par définition les sections comprennent les en-têtes et pieds de pages.
Maintenant, comme demandé précédemment : c'est quoi la vraie question ?
Rookiz
Messages postés11Date d'inscriptionlundi 12 mars 2012StatutMembreDernière intervention21 mars 2012 20 mars 2012 à 11:39
Merci beaucoup cmarcotte pour ton retour et tes explications.
Effectivement, je n'ai peut-être pas été assez clair sur mon besoin final qui est de séparer chaque envoie (d'un fichier publipostage) dans des fichiers distincts.
Je ne modifie pas le fichier publipostage. Je le reçois et effectue la séparation selon le nombre de pages de l'envoi. D'ou mon besoin de spécifier le nombre de page qui varie d'un publipostage à un autre.
Ma première macro fonctionnait plutôt bien (même si comme tu me l'explique, j'y ai fais beaucoup d'erreur), mais je ne récupérait pas les en-tête et pied de page.
J'ai donc trouvé la deuxième macro, mais je n'arrive pas à spécifier le nombre de page de l'envoi.
J'espère que mes explications sont plus clair.
Et merci encore aux intervenants.
Rookiz
Il n'y rien à ajouter et le nombre de pages n'a AUCUNE importance. L'assistant fusion et publipostage sépare lui-même les envois en sections. Chaque envoi constitue sa propre section. La seconde macro utilise les sections pré-définies pour séparer les envois. Tu appliques la seconde macro telle quelle au document de publipostage, ni plus, ni moins.
Rookiz
Messages postés11Date d'inscriptionlundi 12 mars 2012StatutMembreDernière intervention21 mars 2012 20 mars 2012 à 16:58
Dans ce cas, c'est mon résultat de publipostage qui n'est pas correct.
J'avais déjà fais le test quand j'ai trouvé la macro et je me retrouvais avec 24 fichiers au lieu de 8. Chaque envoi est decoupé en 3 parties.
Je viens de faire un nouveau test et j'obtiens le meme résultat.
Je ne suis pas le propriétaire des publipostage. Je me contente juste de faire la découpe, donc j'vais avoir du mal à contrôler la manière dont ils sont fait.
Il y a un moyen de controler le nombre de section ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
D'une manière plus générale tu peux gérer les sections manuellement. Commence par para métrer Word pour afficher tous les caractères. Une fois fait, tu vas voir tous les sauts de section, les tirets et les sauts de pages à l'écran. C'est le seul moyen de contrôler l'édition du document.
J'ai une question concernant la macro commande plus bas. Est-ce possible de faire en sorte que les fichiers soient renommés selon les informations d'un ou de plusieurs champs de fusion contenus dans le document.
---------
Sub DissocierPage() 'Permet de créer un fichier par page
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