Subdiviser un gros fichier Word
orionis
Messages postés
8
Date d'inscription
Statut
Membre
Dernière intervention
-
orionis -
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!
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:
- Subdiviser un gros fichier Word
- Fichier bin - Guide
- Word 2013 - Télécharger - Traitement de texte
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
14 réponses
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
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
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
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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...
'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...
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?
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?
Bonjour,
Non pas bizarre... J'ai été un peu rapide sur ce coup là !! ;)
Essaie ça :
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
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...
j'ai essayé d'utiliser
CodeClient = ActiveDocument.Paragraphs(1).Range.Words(1)
Mais ça ne fonctionne pas...
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 :
Et là, bizarrement, le nom de ta variable est acceptée !!!
m@rina
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
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)
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)
Bonjour orionis,
Ben oui, mais faut adapter... La variable nomclient ne doit pas être affectée à ActiveDocument mais au sousdoc. Ce qui donnerait :
m@rina
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