Subdiviser un gros fichier Word

Fermé
orionis Messages postés 8 Date d'inscription mardi 5 janvier 2010 Statut Membre Dernière intervention 7 janvier 2010 - 5 janv. 2010 à 11:35
 orionis - 11 janv. 2010 à 14:34
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 21205 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 23 décembre 2024 11 370
5 janv. 2010 à 23:31
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 mardi 5 janvier 2010 Statut Membre Dernière intervention 7 janvier 2010
6 janv. 2010 à 08:20
merci m@rina, je vais tenter ça.
0
orionis Messages postés 8 Date d'inscription mardi 5 janvier 2010 Statut Membre Dernière intervention 7 janvier 2010
6 janv. 2010 à 09:17
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 21205 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 23 décembre 2024 11 370
6 janv. 2010 à 13:21
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 mardi 5 janvier 2010 Statut Membre Dernière intervention 7 janvier 2010
6 janv. 2010 à 13:40
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 mardi 5 janvier 2010 Statut Membre Dernière intervention 7 janvier 2010
6 janv. 2010 à 14:25
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 mardi 5 janvier 2010 Statut Membre Dernière intervention 7 janvier 2010
7 janv. 2010 à 11:30
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 21205 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 23 décembre 2024 11 370
7 janv. 2010 à 12:57
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 mardi 5 janvier 2010 Statut Membre Dernière intervention 7 janvier 2010
7 janv. 2010 à 15:17
Ah oui, ça fonctionne tout de suite beaucoup mieux! :o)
Merci beaucoup pour ton aide.
0
orionis Messages postés 8 Date d'inscription mardi 5 janvier 2010 Statut Membre Dernière intervention 7 janvier 2010
7 janv. 2010 à 15:23
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 21205 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 23 décembre 2024 11 370
7 janv. 2010 à 16:35
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
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 21205 Date d'inscription mardi 12 juin 2007 Statut Contributeur Dernière intervention 23 décembre 2024 11 370
11 janv. 2010 à 14:31
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
Merci beaucoup pour ta réponse, je teste ceci et te tiendrai au courant!
0