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 :

Modification des pied de pages en fonction d'une comboBox - Plante avec le positionnement de la Shape [WD-2013]


Sujet :

VBA Word

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Modification des pied de pages en fonction d'une comboBox - Plante avec le positionnement de la Shape
    Bonjour à toutes et tous,

    Je viens vous voir car je rencontre un problème dans la programmation d'une macro Word/Excel 2013 et VB 7.1 et je tourne en rond sans comprendre où se situe mon problème...

    La macro que je développe permet de sélectionner une société via une combo-box et en fonction du choix, change le pied de page du document en cour.

    TOUS mes pieds de pages sont Composés de 3 shapes chacun:
    - 1 . Une image avec un logo
    - 2 . Une zone de texte avec le nom de la société et l'adresse
    - 3 . Une zone de texte avec le trigramme de la société et le numéro de révision du document

    Uniquement la première page contient la zone de texte avec le nom de la société et l'adresse, les autres pages ont à la place le nom de la société et le slogant.

    Cette macro doit être applicable à des documents Word et à des documents Excel


    J'ai réussi à faire le gros du boulot sans trop de problème malgré que je débute en VBA (j'ai commencé le 2 Novembre) mais les choses se corsent quand je souhaite dimensionner et positionner mes Shapes.
    Et oui, ces petits malins du service Qualité ont eus la bonne idée de mettre certaines parties de certains documents en Paysage ou Portrait en fonction du besoin.

    Donc, j'éxecute le script qui fonctionne correctement une première fois, puis une deuxième fois et lors de la troisième exécution :

    - l'image se trouvant en arrière plan est déplacé vers le bas, à la hauteur de ma Zone de texte contenant le texte du pied de page

    et:
    - ERREUR D'EXECUTION : 4605 - " La méthode ou propriété RelativeVerticalPosition n’est pas disponible à cause de l'opération de dessin ne peut pas être appliquée à la sélection actuelle

    Autre chose que j'ai remarqué en essayant de débugger...
    - Lorsque je place des points d'arrêt dans mon code, et bien il n'y a AUCUN PROBLEMES, tout fonctionne correctement.
    - Lorsque je retire les points d'arrêt dans mon code, et bien les problèmes mentionné ci-dessus reviennent.
    - Lorsque je commente toute la partie concernant la ### DEFINITION APPARENCE DU TEXTE ### (voir plus bas) le script vas ENORMEMENT plus vite ne plante pas et fait tout comme il faut
    (mais du coup ne place pas automatiquement les shapes en fonction de si la page est en portrait ou paysage.. )

    Trêve de bavardage, passons aux choses sérieuses
    Voila un bout de mon code, je passe la partie déclaration des variables et ouverture de fichier pour récupérer les infos pour remplir ma combobox, cette partie fonctionne très bien.

    Plus bas je vous indique l'endroit ou ça plante.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    
    Private Sub Changement_Wrd()
        
        For Each MaSection In ActiveDocument.Sections
        
           'Debug.Print ("######### SECTION " & MaSection.Index & " #########")
            
            If (MaSection.PageSetup.Orientation = wdOrientPortrait) Then
            
               'Debug.Print ("######### ORIENTATION: wdOrientPortrait = " & MaSection.PageSetup.Orientation)
                PiedDePage_PosX = CentimetersToPoints(3.05)
                PiedDePage_PosY = CentimetersToPoints(27.06)
                Trigramme_PosX = CentimetersToPoints(11.11)
                Trigramme_PosY = CentimetersToPoints(28)
                
            ElseIf (MaSection.PageSetup.Orientation = wdOrientLandscape) Then
                
               'Debug.Print ("######### ORIENTATION: wdOrientLandscape = " & MaSection.PageSetup.Orientation)
                PiedDePage_PosX = CentimetersToPoints(7.38)
                PiedDePage_PosY = CentimetersToPoints(18.32)
                Trigramme_PosX = CentimetersToPoints(15.5)
                Trigramme_PosY = CentimetersToPoints(19.14)
                
            End If
            
    
            For Each MonFooter In MaSection.Footers
                If MonFooter.Exists Then
                  'Debug.Print ("######### FOOTER INDEX " & MonFooter.Index & " ######### IL Y A " & MonFooter.Range.ShapeRange.Count & " SHAPES")
                    
                    ' SELECTIONNE UNIQUEMENT LES SHAPES SE TROUVANT DANS LE PIED DE PAGE EN COUR:
                    ' SI ON UTILISE PAS LE ShapeRange, ON AURA POUR CHAQUE FOOTER, LA TOTALITÉ DES SHAPES DANS LA TOTALITÉ DES FOOTER DE LA TOTALITÉ DES SECTIONS DU DOCUMENT..... toutes les shapes de tous les footer quoi.
                    For Each MaShape In MonFooter.Range.ShapeRange
                    
                       'Debug.Print ("___________________________________________")
                       Debug.Print ("##    MaShape.Name : " & MaShape.Name)
                        
                        ' SI LA SHAPE EN COURS CONTIENT BIEN UNE ZONE DE TEXTE:
                        If MaShape.TextFrame.HasText Then
                            
                            MaShape.Select ' je pense pas que ce select est utile...
                            Debug.Print ("MaShape.Name : " & MaShape.Name)
                            
                            Dim TypeDeShape As String
                            
                            ' DetectionType() est une fonction qui me renvoi un String "TRIGRAMME" OU "PIED_DE_PAGE_2ND" OU "PIED_DE_PAGE" 
                            ' dans cette fonction je test le contenu textuel de la shape en cour pour en determiner la nature (trigramme ou pied de page 1 ou 2)
                            TypeDeShape = DetectionType(MaShape)
    
                           
                           'Debug.Print ("      TypeDeShape : " & TypeDeShape)
                           'Debug.Print ("      Contient le texte : " & MaShape.TextFrame.TextRange.Text)
                            
                            ' ###### DEFINITION APPARENCE DU TEXTE ####################################################
                            ' Ici je défini l'apparence de mon texte (police, taille, couleur, alignement, espacement des lignes, etc)
                            MaShape.TextFrame.TextRange.Font.Size = FontSize
                            MaShape.TextFrame.TextRange.Font.Name = FontName
                            MaShape.TextFrame.TextRange.Font.ColorIndex = wdBlack
                            
                            If TypeDeShape = "TRIGRAMME" Then
                                MaShape.TextFrame.TextRange.Paragraphs.Alignment = wdAlignParagraphRight
                            Else
                                MaShape.TextFrame.TextRange.Paragraphs.Alignment = wdAlignParagraphLeft
                            End If
                            
                            MaShape.TextFrame.TextRange.Paragraphs.LineSpacingRule = wdLineSpaceAtLeast
                            MaShape.TextFrame.TextRange.Paragraphs.LineSpacing = 1
                            MaShape.TextFrame.TextRange.Paragraphs.SpaceAfter = False
                            MaShape.TextFrame.TextRange.Paragraphs.SpaceBefore = False
                                 
    
                            Debug.Print ("////////////////////////////////////")
                            Debug.Print (MaShape.Name)
                            Debug.Print (MaShape.Name)
                            
                            MaShape.RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
    
                            ' ############################################################
                            ' VBA ME MET UNE ERREUR A CE NIVEAU !!!!!!!!!!!
                            MaShape.RelativeVerticalPosition = wdRelativeVerticalPositionPage
                            ' ############################################################
    
                            If TypeDeShape = "TRIGRAMME" Then
                                MaShape.Width = Trigramme_W
                                MaShape.Height = Trigramme_H
                                MaShape.Left = Trigramme_PosX
                                MaShape.Top = Trigramme_PosY
                                
                            ElseIf ((TypeDeShape = "PIED_DE_PAGE_2ND") Or (TypeDeShape = "PIED_DE_PAGE")) Then
                                MaShape.Width = PiedDePage_W
                                MaShape.Height = PiedDePage_H
                                MaShape.Left = PiedDePage_PosX
                                MaShape.Top = PiedDePage_PosY
                            Else
                                
                            End If
    
                            ' ###### FIN DEFINITION APPARENCE DU TEXTE ####################################################
                            
                            Select Case TypeDeShape
                                Case "TRIGRAMME"
                                    
                                       'Debug.Print ("######### CHANGEMENT DU TRIGRAMME #########")
                                       'Debug.Print ("######### NOM DE LA SHAPE : " & MaShape.Name)
                                       ' Config_Trigramme MaShape   'une fonction que j'avais fait pour dimensionner et positionner le Trigramme
                                        
                                        MaShape.TextFrame.TextRange.Select
                                       'Debug.Print ("TEXTE DU TRIGRAMMES A CHANGER : " & Selection.Text)
                                        
                                        Selection.Font.Bold = True
                                        If (pos_TRIGRAMME > 0) Then
                                           'Debug.Print ("Renplacement de 'TRIGRAMME_MACRO' par : " & TrigrammeSociete)
                                            Selection.Text = Replace(Selection.Text, "_TRIGRAMME_MACRO_", "_" & TrigrammeSociete & "_")
                                        ElseIf (TrigrammeDansZDT <> "") Then
                                           'Debug.Print ("Renplacement de " & TrigrammeDansZDT & " par : " & TrigrammeSociete)
                                            Selection.Text = Replace(Selection.Text, "_" & TrigrammeDansZDT & "_", "_" & TrigrammeSociete & "_")
                                        End If
                                    
                                    
                                Case "PIED_DE_PAGE_2ND"
                                
                                       'Debug.Print ("######### CHANGEMENT DU PIED DE PAGE 02 #########")
                                       'Debug.Print ("######### NOM DE LA SHAPE " & MaShape.Name)
                                        'Config_PDP MaShape  'une fonction que j'avais fait pour dimensionner et positionner le Pied de page 02
                                        
                                        MaShape.TextFrame.TextRange.Select
                                       'Debug.Print ("TEXTE A CHANGER : " & Selection.Text)
                                        
                                        
                                        Selection.Font.Bold = True
                                        Selection.TypeText Text:=RetourLigne & NomSociete
                                        
                                        Selection.Font.Bold = False
                                        Selection.TypeText Text:=" - Le gros slogan de la Société"
                                        
                                        
                                Case "PIED_DE_PAGE"
                                
                                       'Debug.Print ("######### CHANGEMENT DU PIED DE PAGE 01 #########")
                                        'Config_PDP MaShape 'une fonction que j'avais fait pour dimensionner et positionner le Pied de page
                                        
                                        MaShape.TextFrame.TextRange.Select
                                       'Debug.Print ("TEXTE A CHANGER : " & Selection.Text)
                                        
                                        
                                        Selection.Font.Bold = True
                                        ' RetourLigne = Chr(13)
                                        Selection.TypeText Text:=RetourLigne & NomSociete & " "
                                        Selection.Font.Bold = False
    
                                        ' Ligne1 à Ligne 5 sont des STRING
                                        Selection.TypeText Text:=Ligne1 & Ligne2 & Ligne3 & Ligne4 & Ligne5
                            End Select
                            
                        Else
                           Debug.Print ("##    Script non applicable.")
                        End If
    
                    Next MaShape
                End If
               'Debug.Print (" ")
               'Debug.Print (" ")
            Next MonFooter
        Next MaSection
        
        ' UNE FOIS LE SCRIPT TERMINÉ ON RETMET LE CURSEUR SUR LA PAGE AU DÉBUT DU DOCUMENT
        Selection.EscapeKey
        Selection.Collapse
        If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
            ActiveWindow.Panes(2).Close
        End If
        If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _
            ActivePane.View.Type = wdOutlineView Then
            ActiveWindow.ActivePane.View.Type = wdPrintView
        End If
        'ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
        Selection.EscapeKey
        Selection.HomeKey Unit:=wdStory
        
    End Sub
    Comme dirait Lilou Dallas: " Pleeaaaaaase help"

    Merci de m'avoir lu, vous pouvez répondre ou reprendre une activité normale.
    Bonne journée à vous.
    Seb

  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,

    Pas beaucoup d'idée, mais une seule.

    Essaie de mettre un DoEvent dans ton code là où ça bloque.
    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
    Candidat au Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Hey hey hey
    Merci Heureux-oli d'avoir pris le temps de creuser la question et de m'avoir répondu,

    Je ne connais pas la fonction DoEvent, je vais tester et reviens sur le forum pour poster si ça marche ou non.


    ---
    Edit:
    Bon, bah ça marche pas

    J'aurais plutôt pensé à un problème au niveau de ma sélection, peut être que, lors de la ré-exécution de la macro, le programme conserve une ancienne sélection en mémoire ou quelque chose de ce genre.. mais je ne vois pas quoi
    Je filtre les shapes avec un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        "If MaShape.TextFrame.HasText Then"
    pour justement n'avoir que des shape contenant du texte, et après je contrôle avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       "Debug.Print ("MaShape.Name : " & MaShape.Name)" (--> me renvois "Text Box 1" ou "Text Box 12")
    que MaShape est bien une zone de texte et pas une image.

    ---
    Ré Edit:
    Autre petite choses, je ne sais pas si ça fera avancer le schmilblik, mais on ne sait jamais..
    J'ai remarqué que lorsque je réinitialise le script, puis le relance, tout fonctionne...
    Des pistes de réflexion?

    parce que moi je commence à ....

  4. #4
    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,

    Pourquoi j'ai proposé un DoEvent, c'est une "mesure d'attente".
    Parfois quand en mode pas à pas, ça fonctionne, le fait de demander au système d'attendre un peu permet de débloquer la situation.

    Maintenant, lire un code pour trouver une éventuelle erreur est fastidieux.
    Surtout que dans ton cas, c'est pas à la première exécution que ça coince.

    Mais comme tu le mentionnes, il est fort probable que la sélection n'est pas au bon endroit.

    En mode pas à pas, tu devrait pouvoir "voir" ce qui est sélectionné dans ton document.
    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 !

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci pour tes réponses et explications,

    Je n'ai pas trouvé la solution au problème mais je l'ai contourné en fermant ma combo box à la fin de l’exécution du script.

    L'utilisateur devra ré-ouvrir le document pour que le script s’exécute à nouveau et mette à jour le pied de page, ce n'est pas vraiment une solution, mais au moins ça "fonctionne".
    je passe le sujet en résolu,

    Encore merci pour ton aide Heureux-oli

    @+

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

Discussions similaires

  1. [PPT-2007] Eviter Modification du pied de page
    Par macgyver44 dans le forum Powerpoint
    Réponses: 2
    Dernier message: 18/08/2011, 10h35
  2. [XL-2003] En tête et pied de page en fonction des feuilles
    Par bbcancer dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/11/2010, 09h35
  3. Afficher un pied de page en fonction d'un sous état
    Par g21designz dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 09/02/2009, 16h04

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