none
VBA-WD2007 Comment avoir le nombre de pages de chaque section ? RRS feed

  • Question

  • Bonjour,

    J'effectue la mise en page de mon document section par section par code VBA.

    J'ai besoin de connaitre le nombre de page de la section avant d'accéder à la vue 1er pied de page, pied de page paire ou pied de page impaire.

    Mes recherches m'ont indiqué d'utiliser

    Dim mySection As Word.Section

    For Each mySection In myDocument.Sections

    NbDePageDeMaSection = mySection.Range.Information(wdActiveEndPageNumber)

    Next mySection

    Un document d'1 seule section et d'1 page me renvoit bien NbDePageDeMaSection = 1, et pour 2 pages NbDePageDeMaSection = 2.

    Mais au delà, NbDePageDeMaSection renvoit toujours 2 ?????

    Quelqu'un a-t'il connaissance de ce problème, ou pouvez-vous m'indiquer comment utiliser correctement cette information, ou encore me donner une autre méthode?



    • Modifié Golard77 mercredi 28 mai 2014 17:46
    mercredi 28 mai 2014 17:44

Toutes les réponses

  • Bonjour

    Il y avait pas mal de bogues en version 2007, mais pour accéder aux entêtes ou pied de page d'une section, seul le numéro de section suffit normalement.

    jeudi 29 mai 2014 12:48
  • En complément : votre code donne un résultat correct en version 2010.

    jeudi 29 mai 2014 12:52
  • Bonjour et merci Geo  pour tes réponses.

    Je suis rassuré pour l'avenir de savoir que le code fonctionne correctement sous office 2010, mais malheureusement, je dois réaliser ma macro sous 2007.

    J'ai impérativement besoin du nb de page de chaque section pour la raison suivante: Je dois accéder en mode édition aux pieds de page des 3 types (1stpage, impaire, et paire).

    Le problème auquel je suis confronté est celui-ci: Si j'essaye de passer en mode édition par exemple "page impaire" et que la section n'a que 1 ou 2 page (avec le 1er pied de page différent), alors ce la provoque une erreur 5895 = la vue n'est pas disponible.

    En fait je ne dois accéder aux pied de page "page paire" que si la section a au moins 2 pages, et aux pied de page "page impaire" que si la section a au moins 3 pages.

    Je pensais utiliser mySection.Range.Information(wdActiveEndPageNumber), mais ça ne fonctionne pas, et vous me confirmez que la fonction ne fonctionne peut-être pas sous word 2007...

    Comment puis-je faire  ? As-tu une solution ? Merci d'avance
    jeudi 29 mai 2014 15:34
  • Bonsoir

    Les solutions de contournement sont souvent des bricolages.
    Vous pourriez utiliser la gestion d'erreur pour déterminer si le volet existe ou pas.
    Idem en tentant d'accéder à la page 3, s'il n'y a pas d'erreur, c'est qu'elle existe.

    Sinon, il n'est pas nécessaire d'afficher un en-tête ou un pied de page en vba pour le modifier.
    Il me semble qu'on a accès à tous les types d'en-tête et de pied de page, par exemple pour effacer l'entête principal :
    ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range.Delete
    Vous avez aussi l'en-tête de première page (de la section) et les en-têtes de page paire.
    Il y a des exemples dans l'aide.
    Il vaut mieux en général travailler avec des Range, le code est plus court et plus fiable.

    jeudi 29 mai 2014 16:22
  • Merci  pour votre réponse,

    Je connais bien la syntaxe que vous citez : ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range.Delete

    Et je vous avoue que c'est celle que je préfère de loin. J'essaye d'éviter au maximum d'utiliser l'objet Selection et j'aurais préféré ne pas ouvrir en édition les pied de page ...

    MAIS, les commandes passées aux entêtes ou pied de page Primary (impair)  et EvenPage (pair) NE FONCTIONNENT PAS EN OFFICE 2007 !!! Tandis que, étrangement,  FirstPage (première page),lui, fonctionne...

    C'est donc parce que j'utilise une solution de contournement que je dois accéder en édition à ces satanés pieds de page.

    Vu votre réponse, je vais donc devoir passer par une gestion d'erreur ... que j'aurais préféré éviter :(

    Pour la gestion d'erreur en accès à une page, c'est plus difficile que de juste vérifier si l'accès à la page 3 existe, car j'ai plusieures sections, et il faudrait que je teste si la section n couvre 1 2 ou 3 pages (comment faire ???)

    Donc au final, je vais me rabattre sur la solution qui consiste à tester les accès ... en y accédant et en générant l'erreur "la vue n'est pas disponible".

    Si quelqu'un a une meilleure idée, n'hésitez pas à me faire signe !

    jeudi 29 mai 2014 18:19
  • Bonsoir

    Vous en êtes donc à la solution de contournement de la solution de contournement :')
    On savait que 2007 a été un mauvais lot, mais à ce point je ne savais pas. Ce dont je me souviens c'est qu'on était tout heureux de l'arrivée de 2010.

    La notion de page est  utilisable dans Document.Goto mais pas dans une section, donc ça devient complexe.
    Il faut regarder page par page dans quelle section on est et en déduire la taille des sections. Pas terrible

    On peut peut-être aussi bidouiller avec les propriétés de wdinformation, par exemple wdActiveEndPageNumber et
    wdActiveEndSectionNumber
     Bon courage.

    jeudi 29 mai 2014 18:50
  • Effectivement, vous avez bien compris : c'est en écrivant du code pour éviter un bug 2007 que je tombe sur un 2ème bug 2007 !

    Bref, on retombe bien sur ma question initiale du post qui portait sur wdActiveEndPageNumber !!!

    Je suis parti sur l'écriture d'une fonction booléenne qui va tester les commandes

    .SeekView = Word.WdSeekView.wdSeekEvenPagesFooter

    et

    .SeekView = Word.WdSeekView.wdSeekPrimaryFooter

    Si une erreur est générée, je vais considérer "bêtement" que c'est parce que la section n'a pas le nombre de pages suffisantes.

    Trouvez-vous cette solution correcte ?

    vendredi 30 mai 2014 06:37
  • Bonjour

    C'était pas évident au départ, mais vu comme ça, ça me parait bon.

    vendredi 30 mai 2014 07:37