Subdiviser un gros fichier Word

orionis Messages postés 8 Date d'inscription   Statut Membre -  
 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!
Configuration: Windows XP
Firefox 3.5.6

14 réponses

  1. orionis Messages postés 8 Date d'inscription   Statut Membre
     
    merci m@rina, je vais tenter ça.
    0
  2. orionis Messages postés 8 Date d'inscription   Statut Membre
     
    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
  3. m@rina Messages postés 27741 Date d'inscription   Statut Modérateur Dernière intervention   11 568
     
    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
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. orionis Messages postés 8 Date d'inscription   Statut Membre
     
    Ah oui, rien à voir avec mon code, quand même... :o)
    Merci beaucoup, j'essaie ça.
    0
  6. orionis Messages postés 8 Date d'inscription   Statut Membre
     
    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
  7. orionis Messages postés 8 Date d'inscription   Statut Membre
     
    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
  8. m@rina Messages postés 27741 Date d'inscription   Statut Modérateur Dernière intervention   11 568
     
    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
  9. orionis Messages postés 8 Date d'inscription   Statut Membre
     
    Ah oui, ça fonctionne tout de suite beaucoup mieux! :o)
    Merci beaucoup pour ton aide.
    0
  10. orionis Messages postés 8 Date d'inscription   Statut Membre
     
    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
  11. m@rina Messages postés 27741 Date d'inscription   Statut Modérateur Dernière intervention   11 568
     
    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
  12. 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
  13. m@rina Messages postés 27741 Date d'inscription   Statut Modérateur Dernière intervention   11 568
     
    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
  14. orionis
     
    Merci beaucoup pour ta réponse, je teste ceci et te tiendrai au courant!
    0