Subdiviser un gros fichier Word

orionis Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -  
 orionis -
Bonjour à tous,
Je dois subdiviser un gros fichier (57Mo) contenant des informations de sites, en autant de sous-fichiers que de sites distincts.
La dernière chaîne de caractères marquant la fin de chaque page page du site est toujours la même.
Chaque site contient un nombre de pages indéterminé.

Mon idée est la suivante :
- initialiser page_debut à 1
- parcourir le fichier à la recherche de la chaine
- récupérer le n°page de la chaine -> page_fin
- "enregistrer sous" le fichier source de page_debut à page_fin
- page_debut = page_fin+1
- et recommencer jusqu'à la fin du fichier source

Quelles fonctions ou propriétés de macro dois-je utiliser pour cela?
Merci d'avance!
A voir également:

14 réponses

m@rina Messages postés 23891 Date d'inscription   Statut Contributeur Dernière intervention   11 464
 
Bonjour,

Je te propose de faire un recherche-remplace rapide :
Rechercher ta phrase
Remplacer par ta phrase + 1 saut de section

Ensuite, tu appliques cette macro :
https://faqword.com/index.php/faq/vba-solutions/552-comment-couper-un-gros-fichier-en-autant-de-petits-fichiers-quil-y-a-de-sauts-de-section-.html

m@rina
0
orionis Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
merci m@rina, je vais tenter ça.
0
orionis Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Re,

J'ai trouvé comment insérer un saut de section :
Selection.InsertBreak Type:=wdSectionBreakContinuous

J'utilise le code suivant pour remplacer ma chaine 'bla' par 'bla2' (histoire de la distinguer), mais j'ignore comment ajouter à cette chaine 'bla2' le saut de section?

Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "bla"
.Replacement.Text = "bla2"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

Merci d'avance
0
m@rina Messages postés 23891 Date d'inscription   Statut Contributeur Dernière intervention   11 464
 
Bonjour,

Voici une macro qui ajoute après ta phrase un saut de section :

Sub sauts_section()
maphrase = "ceci est ma phrase"

With ActiveDocument.Content.Find
.Execute findtext:=maphrase, Forward:=True
Do While .Execute(findtext:=maphrase, Forward:=True) = True
With .Parent
.StartOf Unit:=wdParagraph, Extend:=wdMove
.InsertBreak Type:=wdSectionBreakContinuous
.Move Unit:=wdParagraph, Count:=1
End With
Loop
End With

m@rina
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
orionis Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Ah oui, rien à voir avec mon code, quand même... :o)
Merci beaucoup, j'essaie ça.
0
orionis Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Hmm, ça ne fonctionne pas tout à fait comme je voudrais.
'bla' étant la chaine après laquelle je veux scinder mes pages, dans mon fichier original de 2 pages, j'ai les lignes suivantes :
page 1 :
aaaa
bbbb
bla
cccc

page 2 :
dddd
bla
eeee

Je voudrais donc obtenir au final 3 fichiers contenant :
fichier 1 :
aaaa
bbbb
bla
fichier 2 :
cccc
dddd
bla
fichier 3 :
eeee

Or, avec le code proposé, j'obtiens 2 fichiers contenant :
fichier 1 (2 pages):
aaaa
bbbb
bla
cccc

2ème page : dddd

fichier 2 :
bla
eeee

Bizarre...
0
orionis Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
j'avance tout doucement, mais je bloque à présent sur ce souci : je parviens bien à trouver ma chaine de recherche, la remplacer par un saut de section, puis à éclater le fichier d'origine en autant de sous-fichiers qu'il existe de sauts.

Mon problème est que la toute première chaine n'est jamais détectée? Voici le code de la partie de recherche/remplacement.


With ActiveDocument.Content.Find
.Execute findtext:=MaPhrase, Forward:=True
Do While .Execute(findtext:=MaPhrase, Forward:=True) = True
With .Parent
.StartOf Unit:=wdWord, Extend:=wdMove
.InsertBreak Type:=wdSectionBreakNextPage
.Move Unit:=wdWord, Count:=1
End With
Loop
End With

D'où cela peut-il provenir?
0
m@rina Messages postés 23891 Date d'inscription   Statut Contributeur Dernière intervention   11 464
 
Bonjour,

Non pas bizarre... J'ai été un peu rapide sur ce coup là !! ;)

Essaie ça :
Sub sauts_section2()
maphrase = "bla"
With ActiveDocument.Content.Find
Do While .Execute(findtext:=maphrase, Forward:=True) = True
With .Parent
.Select
.EndOf Unit:=wdWord
.InsertBreak Type:=wdSectionBreakContinuous
.Move Unit:=wdParagraph, Count:=1
End With
Loop
End With
End Sub
0
orionis Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Ah oui, ça fonctionne tout de suite beaucoup mieux! :o)
Merci beaucoup pour ton aide.
0
orionis Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Il me reste un dernier problème à résoudre : je voudrais identifier les sous-fichiers générés à l'aide d'un code client qui se trouve toujours à la même place : c'est le 1er mot de la 1ère ligne de la section de chaque sous-fichier.
j'ai essayé d'utiliser

CodeClient = ActiveDocument.Paragraphs(1).Range.Words(1)

Mais ça ne fonctionne pas...
0
m@rina Messages postés 23891 Date d'inscription   Statut Contributeur Dernière intervention   11 464
 
Re...

Pourtant ton code est bon.... C'est curieux car je l'ai copié-collé (quelquefois il y a une faute qui ne saute pas au nez), et c'est le nom de la variable codeclient qui ne plait pas à Word... Bizarre...

Sinon, s'il s'agit du premier mot du document, on peut aussi faire ceci :

codeclient = ActiveDocument.Words.First


Et là, bizarrement, le nom de ta variable est acceptée !!!

m@rina
0
orionis
 
bonjour,
désolé pour le retard de la réponse, j'étais un peu bloqué par la neige vendredi!
Ca ne fonctionne malheureusement pas mieux avec le code que tu proposes...
En fait, je n'ai pas besoin du 1er mot du document complet, mais du premier de chaque section constituant les sous-fichiers.
Pour l'instant, j'ai ce code, mais la MsgBox n'affiche rien.

Application.ScreenUpdating = False
Dim SousDoc As Document
Dim R As Range
Dim S As Section
Dim DocNum
Dim NomClient
Dim myParagraph As Paragraph

For Each S In ActiveDocument.Sections
Set R = S.Range: R.End = R.End - 1
Set SousDoc = Documents.Add
NomClient = ActiveDocument.Words.First

MsgBox "nomclient->" & NomClient
ChangeFileOpenDirectory "C:\TEMP\"
With SousDoc
DocNum = DocNum + 1
.Content = R
.SaveAs FileName:="test_" & DocNum & ".doc"
.Close
End With
Next S


J'ai aussi testé ça, pour tenter de récupérer le 1er mot de chaque paragraphe, mais là non plus, aucun résultat.

Set myParagraph = ActiveDocument.Paragraphs(1)
NomClient = myparagraph.Range.Select.Range.Words(1)
0
m@rina Messages postés 23891 Date d'inscription   Statut Contributeur Dernière intervention   11 464
 
Bonjour orionis,

Ben oui, mais faut adapter... La variable nomclient ne doit pas être affectée à ActiveDocument mais au sousdoc. Ce qui donnerait :

Sub SectionsDansDocumentsSéparés2()
Application.ScreenUpdating = False
Dim SousDoc As Document
Dim R As Range
Dim S As Section
Dim DocNum


For Each S In ActiveDocument.Sections
Set R = S.Range:  R.End = R.End - 1
Set SousDoc = Documents.Add
ChangeFileOpenDirectory "C:\TEMP\"
With SousDoc
.Content = R
client = .Words.First
.saveas FileName:=client & ".doc"
.Close
End With
Next S

Set SousDoc = Nothing
Set R = Nothing
Set S = Nothing
Application.ScreenUpdating = False

End Sub


m@rina
0
orionis
 
Merci beaucoup pour ta réponse, je teste ceci et te tiendrai au courant!
0