IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Word Discussion :

headers et shapes : comment identifier l'entête où est utilisée une image? [WD-2013]


Sujet :

VBA Word

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 84
    Points : 60
    Points
    60
    Par défaut headers et shapes : comment identifier l'entête où est utilisée une image?
    Bonjour à tous,

    contexte :
    Je doit réaliser un outils pour remplacer automatiquement les logos et pied de pages (des images dans les deux cas) sur des 'modèles' de documents.
    ces modèles ont été réalisés par les utilisateurs.

    J'aimerai réaliser un algo du type :
    si l'entête 1ère page (pour l'exemple) est activé et a une image alors : Je remplace l'image

    Pour la 1ère condition pas de problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If doc.Sections(1).Headers(wdHeaderFooterFirstPage).Exists = True Then
    ...
    Par contre je n'arrive pas à identifier dans la collection shapes (partagés par tous les headers) l'image utilisé dans le header spécifié.

    exemple : Dans un document de test avec les 3 headers activé et 1 image dans chaqu'un, mon code suivante renvoi la même liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Sub testMoi()
        Dim i As Integer
        Dim doc As Word.Document
        Dim collShp As Shapes
        Dim shp As Shape
     
        Set doc = ActiveDocument
     
        Debug.Print "wdHeaderFooterEvenPages : "
        For Each shp In doc.Sections(1).Headers(wdHeaderFooterEvenPages).Shapes
            Debug.Print shp.name
        Next
     
        Debug.Print "wdHeaderFooterFirstPage : "
        For Each shp In doc.Sections(1).Headers(wdHeaderFooterFirstPage).Shapes
            Debug.Print shp.name
        Next
     
        Debug.Print "wdHeaderFooterPrimary : "
        For Each shp In doc.Sections(1).Headers(wdHeaderFooterPrimary).Shapes
            Debug.Print shp.name
        Next
     
    End Sub


    Quelqu'un aurais une idées sur la marche à suivre ?

    Merci d'avance pour votre lecture et pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Si tu fais un count, combien de shapes sont comptés ?
    Si c'est 0, essaie avec des InLineShapes

    Perso, je pense que c'est plus simple d'avoir des Templates qui sont remplis avec des images et mettre le texte sur des signets ensuite que de devoir créer le document de toute pièce.

    Pour le choix du modèle, c'est assez simple, juste un UserForm avec le choix.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 84
    Points : 60
    Points
    60
    Par défaut
    Heureux-oli,

    Dans mon document de test/exemple, les trois Headers ont shapes.count = 3.

    Pour information, les inLineShapes sont déjà pris en compte par un autre scripte.
    un .range.inLineChape sur chaque headers et je connais leur emplacement.

    Pour plus d'information sur ce document :
    l'entête de la 1ère page > un logo (nom = "LOGO_A")
    le pied le page de la 1ère page > une autre image (nom = "PIED")
    l'entête des pages impaire > un logo (identique à la 1ère page nom = "LOGO_B")

    Je suis d'accord avec toi que l'utilisation de templates prédéfinis pour tous le monde aurai été une solution si elle avait été mise en place du départ.
    Mais cela ne s'applique pas dans mon cas. Les documents que je dois traiter ont des structures hétérogènes (et pas qu'au niveau du paramètrage des entêtes/pieds de pages). Je dois faire sans.
    Mon but est de conserver leur structure mais remplacer les images par des nouvelles.

    Pour en revenir à mon document de test et mon script en cours de création :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Public Sub remplacerImg(ByRef wdoc As Word.Document)
        Dim tmpSec As Word.Section
        Dim tmpHeader As Word.HeaderFooter
        Dim lstDelete As String
        Dim i As Integer
     
        For Each tmpSec In wdoc.Sections
            For Each tmpHeader In tmpSec.Headers
     
                For i = tmpHeader.Shapes.Count To 1 Step -1
                    If estLogo(tmpHeader.Shapes(i)) Then
                        Call ajouterNewLogo(tmpHeader.Shapes)
                        'TODO : supprimer les anciens logos
                    End If
                    If estPied(tmpHeader.Shapes(i)) Then
                        Call ajouterNewPied(tmpHeader.Shapes)
                        'TODO : supprimer les anciens Pied
                    End If
                Next i
            Next tmpHeader
        Next tmpSec
     
    End Sub
    Quand je lance cette fonction sur mon document, j'obtiens les deux logos et l'image du pied de pages sur toutes les pages en plusieurs fois.

    Dans mes rèves les plus fou, j'aimerai créer une fonction du type :
    function shpEstPresent( byref shp as Word.Shape, byref entete as Word.HeaderFooter) as boolean


    Merci pour ta réponse

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 84
    Points : 60
    Points
    60
    Par défaut
    Bonjour à tous,

    Je viens de trouver la solution à mon problème d'identification des images contenue dans les entêtes et pied de page.

    Je m'obstinai à identifier les images dans la collection :
    ActiveDocument.Sections(1).headers(wdHeaderFooterFirstPage).Shapes
    qui comprend TOUTES les formes des headers et footers. (dans mon cas .count = 3 toutes les images de mon documents)

    Alors que : ActiveDocument.Sections(i).headers(wdHeaderFooterFirstPage).Range.ShapeRange ne comporte que les formes contenu dans l'entête spécifiée. (.count = 1)

    Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/03/2007, 09h04
  2. Comment récupérer les coordonnées d’un clique sur une image ?
    Par da_sys dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/11/2006, 12h34
  3. comment mettre un son au survol d'une image?
    Par mussara dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/07/2006, 18h55
  4. Réponses: 1
    Dernier message: 17/05/2006, 09h19
  5. comment afficher cursor: hand sous FF pour une image?
    Par Death83 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/09/2005, 08h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo