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 :

Comment supprimer les styles perso non utilisés ?


Sujet :

VBA Word

  1. #1
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut Comment supprimer les styles perso non utilisés ?
    Bonjour,

    Dans mon document Word, j'aimerais pouvoir supprimer les Styles non prédéfinis qui ne sont pas utilisés dans le document.

    Tout naturellement j'ai utilisé les 2 conditions: MyStyle.BuiltIn = Faux et MyStyle.InUse = Faux

    Mais ... ça ne fonctionne pas (ça serait trop simple) !

    Effectivement, l'aide VBA indique :
    La propriété InUse n'indique pas forcément que le style est actuellement appliqué à du texte dans le document. Par exemple, si le texte auquel un style a été appliqué est supprimé, la propriété InUse du style conserve la valeur True. Pour les styles intégrés qui n'ont jamais été utilisés dans le document, cette propriété renvoie la valeur False.
    D'où ma question : comment faire pour supprimer les styles personnalisés (pour lesquels .BuiltIn = Faux) qui ne sont pas OU PLUS utilisés ???

  2. #2
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 479
    Points : 3 865
    Points
    3 865
    Par défaut
    Bonjour,

    Tu ne peux partir sur cette base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If MyStyle.BuiltIn Then ...
    If Not MyStyle.BuiltIn Then ...

  3. #3
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Citation Envoyé par QuestVba Voir le message
    Bonjour,

    Tu ne peux partir sur cette base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If MyStyle.BuiltIn Then ...
    If Not MyStyle.BuiltIn Then ...
    Merci, mais comme je l'ai dit plus haut, tester MyStyle.BuiltIn = False And MyStyle.InUse = False ne suffit pas pour supprimer les styles persos qui ne sont plus utilisés !!!

    Quelqu'un a-t il une astuce ?

  4. #4
    Membre éclairé Avatar de Souriane
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2009
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2009
    Messages : 541
    Points : 758
    Points
    758
    Par défaut
    Bonsoir Golard,

    Voici ce que je ferais :

    Fermer Word
    Faire une sauvegarde de mon Normal.dotm
    Ouvrir mon Normal.dotm
    Déclencher cette macro ci-dessous.
    Sauvegarder et fermer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub EffacerStylesPersonnels()
        Dim oMesStyles As Style
            For Each oMesStyles In ActiveDocument.Styles
                    If oMesStyles.BuiltIn = False Then
                        With ActiveDocument.Content.Find
                         .ClearFormatting
                         .Style = oMesStyles.NameLocal
                         .Execute FindText:="", Format:=True
                         If .Found = False Then oMesStyles.delete
                        End With
                    End If
            Next oMesStyles
    End Sub
    Bonne chance!

    Souriane

  5. #5
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Merci, c'est tout à fait ce que je cherchais !

    Je flag "Résolu"

    Après tests approfondis, AÏE ça ne marche pas !

    Tout est ok pour les styles qui incluent le retour à la ligne (donc le caractère de paragraphe).

    Si tout un paragraphe est dans le style "PersoA", et qu'un seul mot au milieu du paragraphe est dans le style "PersoB", alors le style du mot en PersoB n'est pas détecté et le style "PersoB" est supprimé alors qu'il est utilisé !!!

    Je ne vois pas comment modifier le code pour qu'il fonctionne...

    Bonne journée

  6. #6
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Bonsoir !

    Je relance cette discussion car elle n'est toujours pas résolue.

    Le code proposé par Souriane fonctionne ... mais pas entièrement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub EffacerStylesPersonnels()
        Dim oMesStyles As Style
            For Each oMesStyles In ActiveDocument.Styles
                    If oMesStyles.BuiltIn = False Then
                        With ActiveDocument.Content.Find
                         .ClearFormatting
                         .Style = oMesStyles.NameLocal
                         .Execute FindText:="", Format:=True
                         If .Found = False Then oMesStyles.delete
                        End With
                    End If
            Next oMesStyles
    End Sub
    Je m'explique:

    Imaginez un paragraphe au style "MonStyle1", et un deuxième paragraphe au style "MonStyle2".
    Dans le 1er paragraphe, il y a un mot qui est au style "MonStyle2", et un autre mot au style "MonStyle3".

    On a donc les 3 styles "MonStyle1", "MonStyle2" et "MonStyle3" qui sont utilisés.
    Mais seulement les 2 premiers sont appliqués à un paragraphe entier.

    Dans ce cas, le code de Souriane va supprimer le style "MonStyle3" car il n'est pas détecté.
    Seuls les styles appliqués aux paragraphes sont détectés par son code.

    Que faut-il modifier pour que les styles soient recherchés dans tous les mots et pas seulement dans tous les paragraphes ?

    merci d'avance

  7. #7
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Golard,

    Le mieux est de faire une recherche sur tout caractère avec le style concerné, si tu n'as pas de résultat c'est que tu ne l'utilises pas dans CE document et donc tu peux supprimer. Il y a 2 tutoriels sur les rechercher/remplacer un avec l'interface (clique ici pour y accéder) et un avec VBA (clique ici pour y accéder).

    @+

  8. #8
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Rebonjour Sepia et merci pour ta réponse,

    J'ai étudié ton lien et j'ai réussi à rechercher le style mot par mot dans tout le document... mais ça ne change rien.

    Je joins un fichier docx tout simple si quelqu'un veut bien essayer de m'aider: TestDetectionDeStyles.docx
    Ce fichier utilise les 2 styles Word "Normal" et "Titre du livre" et les 2 styles persos "Mon normal" et "Mon titre du livre".

    Son contenu est le suivant
    Ma 1ère phrase en style « Normal », mais on a appliqué le style « Titre du livre » aux mots en majuscules qui suivent : MOTS AU FORMAT TITRE DU LIVRE, puis la phrase se termine au style « Normal ».
    Ma 2nde phrase en style personnalisé « Mon normal », mais on a appliqué le style « Mon titre du livre » aux mots en majuscules qui suivent : MOTS AU FORMAT TITRE DU LIVRE, puis la phrase se termine au style « Mon normal ».
    En faisant tourner le code ci-dessous, on détecte bien les Styles de Word "Normal" et "Titre du livre" (de .Type caractère = 2), ainsi que le style personnalisé "Mon normal", mais pas le style "Mon titre du livre" (tous les deux de .Type = 1).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub EffacerStylesPersonnelsNonUtilises()
        Dim oMesStyles As Style
            For Each oMesStyles In ActiveDocument.Styles
                    If oMesStyles.BuiltIn = False Then
                        With ActiveDocument.Content.Find
                         .ClearFormatting
                         .Style = oMesStyles.NameLocal
                         .Execute FindText:="", Format:=True
                         If .Found = True Then Debug.Print "Style détecté: " & oMesStyles.NameLocal
                        End With
                    End If
            Next oMesStyles
    End Sub
    Celui qui arrive à modifier le code pour détecter le style "Mon titre du livre" gagne le gros lot !
    Et surtout me sauve la vie...

  9. #9
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Golard,

    Celui qui arrive à modifier le code pour détecter le style "Mon titre du livre" gagne le gros lot !
    Et surtout me sauve la vie...
    Bon tu as la vie sauve donc et c'est quoi ce gros lot
    En fait tu n'étais pas loin mais tu n'as pas défini de critère de recherche (en fait il faut rechercher au moins un caractère avec le style, s'il n'y en a pas alors le style n'est pas utilisé) ==>

    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
    Sub EffacerStylesPersonnelsNonUtilises()
        Dim oMesStyles As Style
            For Each oMesStyles In ActiveDocument.Styles
                    If oMesStyles.BuiltIn = False Then
                        With ActiveDocument.Content.Find
                         .ClearFormatting
                         .Style = oMesStyles.NameLocal
                         .Execute FindText:="^?", Format:=True
                         If .Found = False Then
                            MsgBox "Style non utilisé: " & oMesStyles.NameLocal
                         End If
                        End With
                    End If
            Next oMesStyles
    End Sub
    Teste ce code (et envoie le gros lot) à DVP.com)

    @+

  10. #10
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Merci Sepia pour tes efforts !

    J'avoue que j'y ai cru ... j'étais presque en route pour Nicolas acheter du Champagne !!!

    Mais ça ne marche pas.

    Essaye ce code (ah oui, désolé, il faut remplacer les "Print #1," par des "Debug.Print"):

    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
    Private Sub DebugStyles(ByVal myDocument As Word.Document)
     
    Dim myStyle As Word.Style
    'Dim myDocRange As Word.Range
    'Dim myTextRange As Word.Range
    Dim lngCompteur As Long
     
        'TYPE DES STYLES:
        'wdStyleTypeCharacter = 2
        'wdStyleTypeLinked = 6
        'wdStyleTypeList = 4
        'wdStyleTypeParagraph = 1
        'wdStyleTypeParagraphOnly = 5
        'wdStyleTypeTable = 3
     
        'Styles personnalisés
        Print #1, "------------------------------------"
        Print #1, "---> DebugStyles - Styles BuiltOut - " & VBA.DateTime.Time
        Print #1, "------------------------------------"
        lngCompteur = 0
        Print #1, "Les styles personnalisés sont :"
        For Each myStyle In myDocument.Styles
            If Not myStyle.BuiltIn Then
                lngCompteur = lngCompteur + 1
                Print #1, myStyle.NameLocal & Chr(9) & myStyle.Description
                Print #1, "              BuiltIn-Type    = " & myStyle.BuiltIn & " - " & myStyle.Type
                Print #1, "              Locked-Priority = " & myStyle.Locked & " - " & myStyle.Priority
                Print #1, "              InUse           = " & myStyle.InUse
                'Attention ERREUR pour les type 2
                'Print #1, "DebugStyles  " _
                        & " FirstLineIndent " & myStyle.ParagraphFormat.FirstLineIndent _
                        & " LeftIndent " & myStyle.ParagraphFormat.LeftIndent _
                        & " RightIndent " & myStyle.ParagraphFormat.RightIndent
                'Attention ERREUR pour les type 2
                'Print #1, "              Linked = " & myStyle.Linked
     
            End If
        Next myStyle
        Print #1, "Total = " & myDocument.Styles.Count & " styles dont " & VBA.Conversion.CStr(lngCompteur) & " styles BuiltOut"
     
        lngCompteur = 0
        Print #1, "Les styles personnalisés utilisés sont (attention! Styles personnalisés de Type 1 non détectés dans le texte):"
        For Each myStyle In myDocument.Styles
            If Not myStyle.BuiltIn Then
                With myDocument.Content
                    .Find.ClearFormatting
                    .Find.Style = myDocument.Styles(myStyle)
                    .Find.Text = "^?"
                    .Find.Format = True
                    If .Find.Execute() Then
                        lngCompteur = lngCompteur + 1
                        Print #1, "BuiltIn " & myStyle.BuiltIn & " Type " & myStyle.Type & " Style utilisé: " & myStyle.NameLocal
                    End If
                End With
            End If
        Next myStyle
        Print #1, "Total = " & VBA.Conversion.CStr(lngCompteur) & " styles utilisés (attention! Styles personnalisés de Type 1 non détectés dans le texte)"
    '
    '    lngCompteur = 0
    '    Print #1, "Les styles appliqués aux mots sont :"
    '    For Each myStyle In myDocument.Styles
    '        myDocument.Select
    '        Selection.HomeKey unit:=wdStory
    '        With Selection.Find
    '            .ClearFormatting
    '            .Style = myDocument.Styles(myStyle)
    '            .Forward = True
    '            .Format = True
    '            .Text = ""  'Use an empty string ("") to search for formatting only
    '            If .Execute() Then
    '                lngCompteur = lngCompteur + 1
    '                Print #1, "BuiltIn " & myStyle.BuiltIn & " Style appliqué à un mot: " & myStyle.NameLocal
    '            End If
    '        End With
    '    Next myStyle
    '    Print #1, "Total = " & VBA.Conversion.CStr(lngCompteur) & " styles appliqués aux mots"
     
    '    lngCompteur = 0
    '    Print #1, "Les styles appliqués aux mots sont :"
    '    For Each myStyle In myDocument.Styles
    '        'If Not myStyle.BuiltIn Then
    '            Set myDocRange = myDocument.Range(Start:=0, End:=Selection.End)
    '            myDocRange.WholeStory
    '            For Each myTextRange In myDocRange.Words
    '                With myTextRange.Find
    '                    .ClearFormatting
    '                    .Style = myDocument.Styles(myStyle)
    '                    .Format = True
    '                    .Text = ""  'Use an empty string ("") to search for formatting only
    '                    If .Execute() Then
    '                        lngCompteur = lngCompteur + 1
    '                        Print #1, "BuiltIn " & myStyle.BuiltIn & " Style appliqué à un mot: " & myStyle.NameLocal
    '                        Exit For
    '                    End If
    '                End With
    '            Next myTextRange
    '        'End If
    '    Next myStyle
    '    Print #1, "Total = " & VBA.Conversion.CStr(lngCompteur) & " styles appliqués aux mots"
     
    '    lngCompteur = 0
    '    Print #1, "Les styles appliqués aux mots sont (2):"
    '    For Each myStyle In myDocument.Styles
    '        myDocument.Select
    '        Selection.HomeKey unit:=wdStory
    '        With Selection.Find
    '            .ClearFormatting
    '            .Style = myDocument.Styles(myStyle)
    '            .Forward = True
    '            .Format = True
    '            .Text = ""
    '            If .Execute() Then
    '                lngCompteur = lngCompteur + 1
    '                Print #1, "BuiltIn " & myStyle.BuiltIn & " Style appliqué à un mot: " & myStyle.NameLocal
    '            End If
    '        End With
    '    Next myStyle
    '    Print #1, "Total = " & VBA.Conversion.CStr(lngCompteur) & " styles appliqués aux mots"
    '
    'Dim myR As Range
    '
    'Set myR = ActiveDocument.StoryRanges(wdMainTextStory)
    'myR.Find.Execute FindText:="moi"
     
        'Libération mémoire
    '    Set myTextRange = Nothing
    '    Set myDocRange = Nothing
        Set myStyle = Nothing
     
        Print #1, "DebugStyles - Fin de traitement."
     
    End Sub
    Tu verras l'affichage debug suivant:

    ------------------------------------
    ---> DebugStyles - Styles BuiltOut - 13:23:54
    ------------------------------------
    Les styles personnalisés sont :
    Mon normal Couleur de police*: Texte 2, Style*: Lié, Style rapide, Sur base de*: Normal
    BuiltIn-Type = Faux - 1
    Locked-Priority = Faux - 1
    InUse = Vrai
    Mon titre du livre Police*:Gras, Couleur de police*: Texte 2, Petites majuscules, Style*: Lié, Style rapide, Sur base de*: Normal
    BuiltIn-Type = Faux - 1
    Locked-Priority = Faux - 1
    InUse = Vrai
    Total = 266 styles dont 2 styles BuiltOut
    Les styles personnalisés utilisés sont (attention! Styles personnalisés de Type 1 non détectés dans le texte):
    BuiltIn Faux Type 1 Style utilisé: Mon normal
    Total = 1 styles utilisés (attention! Styles personnalisés de Type 1 non détectés dans le texte)
    DebugStyles - Fin de traitement.
    Donc le style "Mon titre du livre" n'a toujours été détecté comme utilisé...

    J'ai testé sur Windows XP / Office 2007 et Windows Seven / Office 2007.

    J'ai hâte de savoir quel affichage debug tu obtiens avec le même code !

    @ bientôt

  11. #11
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Golard,

    Argh, lors de la reprise de mon code , tu n 'as pas recopié correctement le code que je t'ai fourni, tu as écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ligne 50:                If .Find.Execute() Then
    alors que tu aurais dû écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ligne 50:                .Find.Execute
    ligne 51:                If Not .Find.Found() Then
    Hum, j'entends de nouveau le bruit du bouchon de champagne qui m'appelle au loin

    @+

  12. #12
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Bonjour Sepia !

    Alors voici mon nouveau code qui reprend scrupuleusement le tien:

    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
        lngCompteur = 0
        Print #1, "Les styles personnalisés utilisés sont:"
        For Each myStyle In myDocument.Styles
            If myStyle.BuiltIn = False Then
                With myDocument.Content.Find
                    .ClearFormatting
                    .Style = myStyle.NameLocal
                    .Execute FindText:="^?", Format:=True
                    If .Found = True Then
                       lngCompteur = lngCompteur + 1
                       Print #1, "BuiltIn " & myStyle.BuiltIn & " Type " & myStyle.Type & " Style utilisé: " & myStyle.NameLocal
                    End If
                End With
            End If
        Next myStyle
        Print #1, "Total = " & VBA.Conversion.CStr(lngCompteur) & " styles utilisés"
    En remplaçant les " Print #1," par des "Debug.Print", j'obtiens ceci:

    ------------------------------------
    ---> DebugStyles - Styles BuiltOut - 08:18:39
    ------------------------------------
    Les styles personnalisés sont :
    Mon normal Couleur de police*: Texte 2, Style*: Lié, Style rapide, Sur base de*: Normal
    BuiltIn-Type = Faux - 1
    Locked-Priority = Faux - 1
    InUse = Vrai
    Mon titre du livre Police*:Gras, Couleur de police*: Texte 2, Petites majuscules, Style*: Lié, Style rapide, Sur base de*: Normal
    BuiltIn-Type = Faux - 1
    Locked-Priority = Faux - 1
    InUse = Vrai
    Total = 266 styles dont 2 styles BuiltOut
    Les styles personnalisés utilisés sont:
    BuiltIn Faux Type 1 Style utilisé: Mon normal
    Total = 1 styles utilisés
    DebugStyles - Fin de traitement.
    Tu y lis "Les styles personnalisés sont : Mon normal & Mon titre du livre" et "Les styles personnalisés utilisés sont: Mon normal".

    Toujours pas de champagne...

  13. #13
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Golard,

    Tu y lis "Les styles personnalisés sont : Mon normal & Mon titre du livre" et "Les styles personnalisés utilisés sont: Mon normal".
    Donc je résume, le code détecte 2 styles dont 1 utilisé ("Mon normal") et donc 1 inutilisé ("Mon titre du livre"). Tu peux directement tester les inutilisés en inversant ton test (comme je te l'ai envoyé "NOT Find.Found").

    C'est bien ce que tu voulais (ou j'ai perdu le fil au cours des posts et des heures )

    @+

  14. #14
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Effectivement, on s'embrouille, reprenons depuis le début

    1. Le fichier contient un paragraphe dans le style "Mon normal" dont certains mots dans le style "Mon titre du livre". DONC les2 styles sont utilisés !
    2. Le code détecte bien les 2 styles comme présents dans le document
    3. Le code se trompe car pour lui "Mon normal" est utilisé et "Mon titre du livre" n'est pas utilisé, CE QUI EST FAUX !


    Voilà, j'espère avoir bien résumé le problème.

  15. #15
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Points : 10 166
    Points
    10 166
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Ouvre ton aide de VBA-Word à la rubrique de l'objet Style, et lit tout ce qui se rapporte à la propriété inuse. Il y a des cas où inuse retourne True, même si le style n'est pas utilisé.

    Tu peux aussi utiliser la fonction de recherche de Word, pour retrouver un style dans ton document. Juste à faire une recherche avancée avec un clic sur Plus... puis sur Format. Même que l'enregistreur de macros peut te mâcher le travail.

  16. #16
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Citation Envoyé par clementmarcotte Voir le message
    Bonjour,

    Ouvre ton aide de VBA-Word à la rubrique de l'objet Style, et lit tout ce qui se rapporte à la propriété inuse. Il y a des cas où inuse retourne True, même si le style n'est pas utilisé.

    Tu peux aussi utiliser la fonction de recherche de Word, pour retrouver un style dans ton document. Juste à faire une recherche avancée avec un clic sur Plus... puis sur Format. Même que l'enregistreur de macros peut te mâcher le travail.
    Bonjour clementmarcotte,

    As-tu essayé avec le fichier que j'ai fourni plus haut en exemple ???

    Je le joins à nouveau...

    Peux-tu faire ta manipulation de recherche et rechercher le style "Mon titre du livre" ?
    Chez moi ça ne fonctionne pas.
    Fichiers attachés Fichiers attachés

  17. #17
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Golard,

    Je me suis repenché sur ton problème (en partant du début et avec ton exemple).

    Je détecte que "Mon titre du livre" est utilisé car je n'avais pas vu que Word ruse (ce con) alors que personne ne lui demande rien. Lorsqu'un style est de type caractères (depuis quelques versions de Word, a priori 2007), Word ajoute " car" au libellé (parfois) du style. J'ai vu ça en refaisant à la main la détection. Le code que je t'ai fourni marchait (jusqu'à disons Word 2007) mais maintenant il faut tenir compte de ce petit " car" dans le nom du style ==> nouvelle macro (basée sur la précédente)
    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
    Sub EffacerStylesPersonnelsNonUtilisesAvecBugWordSurLeLibelleDuStyle()
        Dim oMesStyles As Style
        For Each oMesStyles In ActiveDocument.Styles
                If oMesStyles.BuiltIn = False Then
                    With ActiveDocument.Content.Find
                        .ClearFormatting
                        .Style = oMesStyles.NameLocal
                        .Forward = True
                        .Execute FindText:="^?", Format:=True
                        If .Found = False Then
                            .Style = oMesStyles.NameLocal + " car"
                            .Execute FindText:="^?", Format:=True
                            If .Found = False Then
                                MsgBox "Style non utilisé: " & oMesStyles.NameLocal
                            End If
                        End If
                    End With
                End If
        Next oMesStyles
    End Sub
    Sur ton exemple, je détecte que "Mon titre de livre" est utilisé et si je le supprimes du 2nd paragraphe, la macro détecte que le style est inutilisé.

    Peux-tu essayer, STP d'abord cette macro puis seulement après ta version et nous tenir au courant (et tenir le champagne au frais).

    @+

  18. #18
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Tadaaaaa "Suppression des styles inutilisés" ... le retour !

    Tout d'abord, merci Sepia de te pencher avec ton sérieux sur ce problème!

    Alors: oui ! Il y a du mieux : tu as REUSSI à détecter le style "Mon titre du livre" !!! Grâce au fait d'avoir rajouté " car" au nom du style pour la recherche ... Mais comment as-tu trouvé ça ??? Pourquoi Microsoft a laissé coder ce bricolage dans un logiciel à usage planétaire ??? En fait je ne veux pas polémiquer, mais je me demande si il existent D'AUTRES SUFFIXES ? Y-a-t'il d'autres style qui ne seront pas détectés parce que leur nom sera encore différent?

    Si tu as des réponses ou quelques précisions sur cette "verrue mal géree de Microsoft", elles seront le bienvenue

    En attendant, revenons à ta réussite Oui il serait peut-être temps d'ouvrir le champagne ...

    ... MAIS ...

    ...comme ce n'est pas encore l'heure de l'apéro, je me demande si ton code pourrait devenir 100% fonctionnel, car actuellement la détection n'est pas encore parfaite. Voici un nouveau fichier (le même avec quelques styles en plus):


    Ce qui marche:

    Dans ce fichier, on retrouve les styles utilisés "Mon normal" et "Mon titre du livre" que tu détectes.
    J'ai ajouté le style "a_titre_table" appliqué juste à un mot et tu le détectes bien comme utilisé.
    Le style "a-theme" n'est pas utilisé et tu le détectes bien comme non utilisé.

    Par contre, ce qui ne marche pas:

    Le style "Pied de page Num" est utilisé en pied de page et tu ne le détectes pas...
    Le style "a_vertical" est utilisé dans une forme en pied de page et tu ne le détectes pas...
    et inversement:
    Le style "TableTest" qui est un style de tableau personnalisé n'est pas utilisé et tu le détectes utilisé...

    Penses-tu qu'on va finir par y arriver ?

    Amicalement,
    Fichiers attachés Fichiers attachés

  19. #19
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Golard,


    Tout d'abord, merci Sepia de te pencher avec ton sérieux sur ce problème!
    Non merci à toi pour ta patience et ta bonne humeur. Mais comme tu l'as constaté on n'a pas la science infuse et surtout celle des bugs dans Word. Donc on essaye de trouver un truc (si tu veux frimer devant ton chef ou un(e) collègue bien gaulé(e) dit un "workaround super de la mort qui tue").

    Alors: oui ! Il y a du mieux : tu as REUSSI à détecter le style "Mon titre du livre" !!! Grâce au fait d'avoir rajouté " car" au nom du style pour la recherche ... Mais comment as-tu trouvé ça ??? Pourquoi Microsoft a laissé coder ce bricolage dans un logiciel à usage planétaire ??? En fait je ne veux pas polémiquer, mais je me demande si il existent D'AUTRES SUFFIXES ? Y-a-t'il d'autres style qui ne seront pas détectés parce que leur nom sera encore différent?

    Si tu as des réponses ou quelques précisions sur cette "verrue mal géree de Microsoft", elles seront le bienvenue
    Ben je ne crois pas car il s'agit comme tu le dis il s'agit bien d'un bug. Attention, ne porte pas plainte tout de suite contre M$ car chez eux, cela s'appelle une fonctionnalité (on est mdr), comme quoi le marketing peut tout faire.

    En attendant, revenons à ta réussite Oui il serait peut-être temps d'ouvrir le champagne...
    Ouais, c'est vrai il commence à faire soif quand même

    ... MAIS ...
    Arrgh, il y a toujours un MAIS

    ...comme ce n'est pas encore l'heure de l'apéro, je me demande si ton code pourrait devenir 100% fonctionnel, car actuellement la détection n'est pas encore parfaite. Voici un nouveau fichier (le même avec quelques styles en plus):


    Ce qui marche:

    Dans ce fichier, on retrouve les styles utilisés "Mon normal" et "Mon titre du livre" que tu détectes.
    J'ai ajouté le style "a_titre_table" appliqué juste à un mot et tu le détectes bien comme utilisé.
    Le style "a-theme" n'est pas utilisé et tu le détectes bien comme non utilisé.

    Par contre, ce qui ne marche pas:

    Le style "Pied de page Num" est utilisé en pied de page et tu ne le détectes pas...
    Le style "a_vertical" est utilisé dans une forme en pied de page et tu ne le détectes pas...
    et inversement:
    Le style "TableTest" qui est un style de tableau personnalisé n'est pas utilisé et tu le détectes utilisé...

    Penses-tu qu'on va finir par y arriver ?
    Oui, car je recherche sur le corps du texte pas sur tout le document (entêtes...) donc on va essayer d'améliorer pour ces cas tout en détectant les précédents aussi (oui, quand même).

    Amicalement,
    Tout pareil

  20. #20
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Golard,

    On progresse. J'arrive à détecter "Pied de page Num" mais je ne trouve pas dans ton doc le style "TableTest" (mais je ne le vois pas non plus par l'interface) donc de ce côté ça semble cohérent. En revanche, pour les Shapes, je n'y arrive pas dans les entêtes/pieds de page car la collection Shapes n'existe pas dans tous les Story (Word appelle ça parfois des articles) ==> erreur à l’exécution si tu les utilises. Pour ce soir, j'abandonne par "Paupières trop lourdes" (et comme j'ai une grosse réunion demain, je préfère dormir un peu) mais je n'abandonne pas complètement.

    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
     
    Sub EffacerStylesPersonnelsNonUtilisesSurToutLeDocAvecBugWordSurLeLibelleDuStyle()
        ReDim aMesStyles(0 To 0) As String
     
        aNbStylesNonUtilises = -1
        Dim oMesStyles As Style
        For Each oMesStyles In ActiveDocument.Styles
                If oMesStyles.BuiltIn = False Then
                    With ActiveDocument.Content.Find
                        .ClearFormatting
                        .Style = oMesStyles.NameLocal
                        .Forward = wdFindContinue
                        .Format = True
                        .Execute FindText:="^?"
                        If Not (.Found) Then
                            .Style = oMesStyles.NameLocal & " car"
                            .Execute FindText:="^?", Format:=True
                            If Not (.Found) Then
                                aNbStylesNonUtilises = aNbStylesNonUtilises + 1
                                ReDim Preserve aMesStyles(0 To aNbStylesNonUtilises) As String
                                aMesStyles(aNbStylesNonUtilises) = oMesStyles.NameLocal
                            End If
                        End If
                    End With
                End If
        Next oMesStyles
     
        '// On teste si le style n'est pas utilisé dans des Shapes
        For aI = 1 To ActiveDocument.Shapes.Count
            For aJ = LBound(aMesStyles) To UBound(aMesStyles)
                If aMesStyles(aJ) <> "" Then
                    With ActiveDocument.Shapes(aI).TextFrame.TextRange.Find
                        .ClearFormatting
                        .Style = aMesStyles(aJ)
                        .Forward = wdFindContinue
                        .Format = True
                        .Execute FindText:="^?"
                        If .Found Then
                            aMesStyles(aJ) = ""
                        End If
                    End With
                End If
            Next
        Next
     
     
        '// On teste si le style n'est pas utilisé dans d'autres Story
        For Each myStoryRange In ActiveDocument.StoryRanges
            For aJ = LBound(aMesStyles) To UBound(aMesStyles)
                If aMesStyles(aJ) <> "" Then
                    With myStoryRange.Find
                        .ClearFormatting
                        .Style = aMesStyles(aJ)
                        .Forward = wdFindContinue
                        .Format = True
                        .Execute FindText:="^?"
                        If .Found Then
                            aMesStyles(aJ) = ""
                        End If
                    End With
                End If
            Next
        Next myStoryRange
     
     
        '// Liste des styles non utilisés
        MsgBox "Liste des styles non utilisés (dans les story demandées)"
        For aJ = LBound(aMesStyles) To UBound(aMesStyles)
            If aMesStyles(aJ) <> "" Then
                MsgBox "***" + aMesStyles(aJ) + "***"
            End If
        Next
    End Sub
    @+

Discussions similaires

  1. Comment supprimer les doublons
    Par djelloulc dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 17/09/2013, 15h30
  2. Comment supprimer les doublons?
    Par Dnx dans le forum Langage SQL
    Réponses: 3
    Dernier message: 24/11/2005, 17h35
  3. Comment supprimer les tags RTF
    Par Dnx dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/09/2005, 15h55
  4. [String] Comment supprimer les accents
    Par iuz dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 08/03/2004, 03h58
  5. Comment utiliser les styles XP avec Dev-C++?
    Par abraxas dans le forum Dev-C++
    Réponses: 3
    Dernier message: 05/10/2003, 20h47

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