none
[VBA-WORD2007] Comment insérer une shape dans chaque en-tête pair ? RRS feed

  • Question

  • Bonjour,

    J'ai paramétré mon document pour des en-têtes différents pages impaires et paires

    PageSetup.OddAndEvenPagesHeaderFooter = True

    J'arrive aussi à préciser un en-tête différent en utilisant pour les pages impaires

    Sections(1).Headers(wdHeaderFooterPrimary)

    et pour les pages paires

    Sections(1).Headers(wdHeaderFooterEvenPages)

    MAIS je n'arrive pas à ajouter une shape à mon entête qui n'apparaisse QUE sur les pages paires ???

    Un expert de ce forum peut-il me venir en aide ?

    Merci d'avance...

    mardi 22 octobre 2013 09:30

Réponses

  • Re Bonjour,

    Après quelques tentatives, je propose une solution de contournement :

    Sub ShapeOnEvenPage()
        
        ' Macro proposée par Mehdi HAMMADI le 23/10/2013
        ' Solution de contournement à se qui semble être un bug sous la version 2007
        ' Ajouter une forme automatique à un en-tête de page paire
        
        ActiveDocument.PageSetup.OddAndEvenPagesHeaderFooter = True
        
        With ActiveDocument.ActiveWindow.View
            .Type = wdPrintView
            .SeekView = wdSeekEvenPagesHeader
                Selection.HeaderFooter.Shapes.AddShape _
                msoShapeIsoscelesTriangle, 72#, 28.5, 88.5, 109.5
            .SeekView = wdSeekMainDocument
        End With
    
    End Sub

    Je conviens que la solution n'est pas conventionnelle et qu'il reste à gérer la section à laquelle il faut ajouter la forme mais je pense que c'est un bon début.

    Bonne continuation


    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users


    • Modifié Mehdi HAMMADI mercredi 23 octobre 2013 15:09
    • Marqué comme réponse Golard77 lundi 9 juin 2014 11:25
    mercredi 23 octobre 2013 15:08

Toutes les réponses

  • Bonjour,

    Il faut pour chaque type de page insérer le code qui permet d'ajouter votre objet même si c'est le même

    Dans l'exemple ci-dessous, j'ajoute à l'en-tête des la page impaire le paragraphe "Développement Office System" et à l'en-tête des pages paires le paragraphe "VBA - Word".

    Sub EnTetePagePaireEtImpaireDif()
    '
    ' Macro modifiée par Mehdi HAMMADI le 22/10/2013
    ' Afficher une en-tête de page paire et impaire différent
    ' Source : http://msdn.microsoft.com/fr-fr/library/ff194465.aspx
    
        With ActiveDocument
            .PageSetup.OddAndEvenPagesHeaderFooter = True
            .Sections(1).Headers(wdHeaderFooterPrimary).Range.InsertBefore "Développement Office System"
            .Sections(1).Headers(wdHeaderFooterEvenPages).Range.InsertBefore "VBA - Word"
        End With
    
    End Sub
    

    Donc dans mon cas cela fonctionne correctement.

    Bonne continuation.


    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users

    mardi 22 octobre 2013 10:49
  • Merci MehdiH,

    Effectivement ton code fonctionne pour ajouter du texte dans les en-tête.

    Par contre, la forme que je veux ajouter sur les pages paires apparait les pages impairs...grrrrrr

    Merci si tu peux trouver pourquoi ???

    Voici ton code complété qui insère la Shape dans les mauvais entête:

        With ActiveDocument
            .PageSetup.OddAndEvenPagesHeaderFooter = True
            .Sections(1).Headers(wdHeaderFooterPrimary).Range.InsertBefore "Développement Office System (IMPAIRE)"
            .Sections(1).Headers(wdHeaderFooterEvenPages).Range.InsertBefore "VBA - Word (PAIRE)"
            .Sections(1).Headers(wdHeaderFooterEvenPages).Shapes.AddShape Type:=msoShapeIsoscelesTriangle, _
                    Left:=CentimetersToPoints(0.54), _
                    Top:=CentimetersToPoints(-3.5), _
                    Width:=CentimetersToPoints(2.27), _
                    Height:=CentimetersToPoints(9.5)
        End With

    J'ai pourtant bien précisé wdHeaderFooterEvenPages...

    Merci d'avance


    mercredi 23 octobre 2013 09:25
  • Bonjour,

    Comme je l'ai indiqué plus haut, il faut pour chaque sections et pour chaque type de page (paire|impaire)écrire le code indiquant ce qui doit y être afficher.

    Si tu veux ajouter la même forme aux deux types, il faudra saisir le code deux fois comme ci-dessous:

        With ActiveDocument
            .PageSetup.OddAndEvenPagesHeaderFooter = True
            .Sections(1).Headers(wdHeaderFooterPrimary).Range.InsertBefore "Développement Office System (IMPAIRE)"
            .Sections(1).Headers(wdHeaderFooterPrimary).Shapes.AddShape Type:=msoShapeIsoscelesTriangle, _
                    Left:=CentimetersToPoints(0.54), _
                    Top:=CentimetersToPoints(-3.5), _
                    Width:=CentimetersToPoints(2.27), _
                    Height:=CentimetersToPoints(9.5)
            .Sections(1).Headers(wdHeaderFooterEvenPages).Range.InsertBefore "VBA - Word (PAIRE)"
            .Sections(1).Headers(wdHeaderFooterEvenPages).Shapes.AddShape Type:=msoShapeIsoscelesTriangle, _
                    Left:=CentimetersToPoints(0.54), _
                    Top:=CentimetersToPoints(-3.5), _
                    Width:=CentimetersToPoints(2.27), _
                    Height:=CentimetersToPoints(9.5)
        End With
    

    Bien cordialement,

    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users

    mercredi 23 octobre 2013 09:40
  • Merci pour ta réponse,

    Mais non je ne veux pas ajouter la même forme aux deux types !!! Je veux justement que la forme n'apparaisse QUE sur les pages paires.

    Or le code que j'ai donné plus haut ne fonctionne pas.

    Ton code ne fonctionne pas non plus. Les 2 formes sont ajoutées sur les pages impaires.

         With ActiveDocument
            .PageSetup.OddAndEvenPagesHeaderFooter = True
            .Sections(1).Headers(wdHeaderFooterPrimary).Range.InsertBefore "Développement Office System (IMPAIRE)"
            .Sections(1).Headers(wdHeaderFooterPrimary).Shapes.AddShape Type:=msoShapeIsoscelesTriangle, _
                    Left:=CentimetersToPoints(1.54), _
                    Top:=CentimetersToPoints(-3.5), _
                    Width:=CentimetersToPoints(2.27), _
                    Height:=CentimetersToPoints(9.5)
            .Sections(1).Headers(wdHeaderFooterEvenPages).Range.InsertBefore "VBA - Word (PAIRE)"
            .Sections(1).Headers(wdHeaderFooterEvenPages).Shapes.AddShape Type:=msoShapeIsoscelesTriangle, _
                    Left:=CentimetersToPoints(0.54), _
                    Top:=CentimetersToPoints(-3.5), _
                    Width:=CentimetersToPoints(2.27), _
                    Height:=CentimetersToPoints(9.5)
        End With
    

    Il suffit de modifier la position Left d'une des 2 formes, comme je l'ai fait ci-dessus, pour s'en rendre compte.

    Petite précision: je suis en Word 2007. Le code fonctionne-t'il chez toi ???

    mercredi 23 octobre 2013 11:34
  • Bonjour,

    Désolé j'avais mal lu ton problème.

    Toutefois, dans mon cas, version 20132 de Word, les deux codes fonctionnent correctement, le premier que tu as proposé affiche bien sur une page paire uniquement et le dernier sur une page paire et impaire.

    Je vais essayer de tester cela sur une version 2007 de Word et je reviens dès que possible.


    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users

    mercredi 23 octobre 2013 12:02
  • Merci d'avance, j'ai hâte de te lire car je m'arrache les cheveux !!!
    mercredi 23 octobre 2013 12:05
  • Bonjour,

    Je viens de faire différents tentatives et je retrouve exactement le même problème que vous; Il semble qu'il y aie un bug lorsque l'on ajoute des formes au en-têtes en utilisant VBA sous la version 2007 de Word quand il y a différence entre les pages paires et impaires.

    Désolé pas de solution dans l'immédiat.


    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users

    mercredi 23 octobre 2013 14:12
  • Re Bonjour,

    Après quelques tentatives, je propose une solution de contournement :

    Sub ShapeOnEvenPage()
        
        ' Macro proposée par Mehdi HAMMADI le 23/10/2013
        ' Solution de contournement à se qui semble être un bug sous la version 2007
        ' Ajouter une forme automatique à un en-tête de page paire
        
        ActiveDocument.PageSetup.OddAndEvenPagesHeaderFooter = True
        
        With ActiveDocument.ActiveWindow.View
            .Type = wdPrintView
            .SeekView = wdSeekEvenPagesHeader
                Selection.HeaderFooter.Shapes.AddShape _
                msoShapeIsoscelesTriangle, 72#, 28.5, 88.5, 109.5
            .SeekView = wdSeekMainDocument
        End With
    
    End Sub

    Je conviens que la solution n'est pas conventionnelle et qu'il reste à gérer la section à laquelle il faut ajouter la forme mais je pense que c'est un bon début.

    Bonne continuation


    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users


    • Modifié Mehdi HAMMADI mercredi 23 octobre 2013 15:09
    • Marqué comme réponse Golard77 lundi 9 juin 2014 11:25
    mercredi 23 octobre 2013 15:08
  • Effectivement, ce n'est pas "conventionnel" de devoir passer par l'aperçu d'impression.

    J'essaye aussi toujours d'éviter au maximum l'objet Selection, car j'ai toujours peur que la "Selection" change sur des clics inopportuns de l'utilisateur...

    Ceci dit bravo à toi pour ce contournement de bug, car ça fonctionne ! J'ai mis un vote +1 à ta réponse, mais je ne la marque pas encore comme solution à cause du problème des sections.

    Je vais avoir des documents avec de nombreuses sections (passage de 2 colonnes à 1 colonne, puis inversement, puis inversement, ...etc). As-tu une idée pour avoir toujours la forme sur les pages paires avec ces changements de sections et avec ta méthode .SeekView ?


    [EDIT:] Finalement cette solution est bien applicable avec plusieurs sections, il suffit de sélectionner à chaque fois la section avant de passer en Seekview page paires, puis repasser en Seekview MainDocument avant de passer à la section suivante. Dommage qu'il n'y ait pas de correctif de la part de Microsoft pour des bugs aussi bien identifiés... La solution de contournement est surement moins rapide et moins fiable que si le bug n'existait pas, mais elle a le mérite de fonctionner (merci encore MehdiH). Je marque le post résolu.
    • Modifié Golard77 lundi 9 juin 2014 11:25
    mercredi 23 octobre 2013 16:06