Subdiviser un gros fichier Word

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. merci m@rina, je vais tenter ça.
    0
    1. 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
      1. Modérateur
        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
        1. Ah oui, rien à voir avec mon code, quand même... :o)
          Merci beaucoup, j'essaie ça.
          0
          1. 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
            1. 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
              1. Modérateur
                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
                1. Ah oui, ça fonctionne tout de suite beaucoup mieux! :o)
                  Merci beaucoup pour ton aide.
                  0
                  1. 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
                    1. Modérateur
                      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
                      1. 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
                        1. Modérateur
                          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
                          1. Merci beaucoup pour ta réponse, je teste ceci et te tiendrai au courant!
                            0