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 :

redémarrage de listes énumérées après un titre


Sujet :

VBA Word

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2019
    Messages : 4
    Par défaut redémarrage de listes énumérées après un titre
    Bonjour,

    Je suis nouveau sur le forum. Je souhaite solliciter votre aide sur le sujet suivant.
    Nous avons un outil qui nous génère des documents Word en fonction du contenu d'une base de donnée. Celui-ci formatte les paragraphe avec des noms de styles. Un template dont les styles ont été définis. Cependant la génération est un peu foireuse quand il s'agit de l'utilisation de style.

    Les styles se présentent de la manière suivante:
    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
     
    1. Titre 1
    (1) Enumeration level 1
    (2) Enumeration level 1
         - Enumeration level 2
         a. Enumeration level 3
         b. Enumeration level 3
            - Enumeration level 4
            - Enumeration level 4
    (3) Enumeration level 1
    (4) Enumeration level 1
         - Enumeration level 2
         a. Enumeration level 3
            i. Enumeration level 5
               - Enumeration level 6
                 a) Enumeration level 7
                 - Enumeration level 8
                   - Enumeration level 9
    1.1. Titre 2
    (1) Enumeration level 1
         a. Enumeration level 3
         b. Enumeration level 3
    (2) Enumeration level 1
     
    Annex A Annexe level 1
    A.1 Annexe level 2
    (1) Enumeration level 1
         - Enumeration level 2
         - Enumeration level 2
         - Enumeration level 2
     
    etc...
    Cependant la génération a tendance a créé des document en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    1. Titre 1
    (1) Enumeration level 1
    (2) Enumeration level 1
         a. Enumeration level 3
         b. Enumeration level 3
    (3) Enumeration level 1
    (4) Enumeration level 1
         a. Enumeration level 3
         b. Enumeration level 3
    2. Titre 1
    (5) Enumeration level 1
         a. Enumeration level 3
         b. Enumeration level 3
    (6) Enumeration level 1
    Il ne me semble pas qu'il y ait des problemes dans la définitions des styles et énumération dans le document modele/receptacle.
    Sachant que les document sont composés de milliers d'énumération et des dizaines de chapitres, il est compliqué de faire le re-démarrage manuellement.

    J'ai créé un code en VBA pensant redémarrer les énumération a 1 apres chaque niveau de chapitre ou d'annexe
    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
    Public Const Enum_Lvl_1_name As String = "Enum_Lvl_1"
    Public Const Enum_Lvl_2_name As String = "Enum_Lvl_2"
    Public Const Enum_Lvl_3_name As String = "Enum_Lvl_3"
    Public Const Enum_Lvl_4_name As String = "Enum_Lvl_4"
    Public Const Enum_Lvl_5_name As String = "Enum_Lvl_5"
    Public Const Enum_Lvl_6_name As String = "Enum_Lvl_6"
    Public Const Enum_Lvl_7_name As String = "Enum_Lvl_7"
    Public Const Enum_Lvl_8_name As String = "Enum_Lvl_8"
    Public Const Enum_Lvl_9_name As String = "Enum_Lvl_9"
     
    Public Const Annex_Lvl_1_name As String = "Annex_Lvl_1"
    Public Const Annex_Lvl_2_name As String = "Annex_Lvl_2"
    Public Const Annex_Lvl_3_name As String = "Annex_Lvl_3"
    Public Const Annex_Lvl_4_name As String = "Annex_Lvl_4"
    Public Const Annex_Lvl_5_name As String = "Annex_Lvl_5"
    Public Const Annex_Lvl_6_name As String = "Annex_Lvl_6"
    Public Const Annex_Lvl_7_name As String = "Annex_Lvl_7"
    Public Const Annex_Lvl_8_name As String = "Annex_Lvl_8"
    Public Const Annex_Lvl_9_name As String = "Annex_Lvl_9"
     
    Public Const LIST_ENUM As String = "ENUM_LIST"
     
    Sub Main_FixEnum_v4()
     
    Dim oDoc As Word.Document
    Dim oPara As Paragraph
    Dim oParaCurrent As Paragraph
    Dim oParaPrevious As Paragraph
     
    Dim Response As Integer
    Dim FlagTrackChange As Boolean
     
    Set oDoc = ActiveDocument
    Set oParaCurrent = Nothing
    Set oParaPrevious = Nothing
     
    'Optimize execution
    FlagTrackChange = oDoc.TrackRevisions
    oDoc.TrackRevisions = False
    Options.CheckGrammarAsYouType = False
    Options.CheckSpellingAsYouType = False
    Options.Pagination = False
    Application.ScreenUpdating = False
     
    ParagraphCount = oDoc.Paragraphs.Count
    ParagraphProgress = 0
    For Each oPara In oDoc.Paragraphs
        Set oParaPrevious = oParaCurrent
        Set oParaCurrent = oPara
     
        If oParaPrevious Is Nothing Then 'Management of first paragraph without a previous paragraph
            ' Nothing
        Else
            If isHeading(oParaPrevious.Style.NameLocal, oDoc) = True And oParaCurrent.Style = Enum_Lvl_1_name Then
                oPara.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:=ListGalleries(wdOutlineNumberGallery).ListTemplates(1), ContinuePreviousList:=False, ApplyTo:=wdListApplyToWholeList
            Else
                'Nothing
            End If
        End If
    Next oPara
     
    Options.CheckGrammarAsYouType = False
    Options.CheckSpellingAsYouType = False
    Options.Pagination = True
    oDoc.TrackRevisions = FlagTrackChange
    Application.ScreenUpdating = True
     
    Set oPara = Nothing
    Set oParaCurrent = Nothing
    Set oParaPrevious = Nothing
    Set oDoc = Nothing
    Response = MsgBox("Complete !", vbOKOnly)
    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
    Private Function isHeading(ByRef sParaStyle As String, ByRef oDoc As Word.Document) As Boolean
    'Retrieve the local name of Style ( avoid the case where French / English style name are different)
     
        If sParaStyle = oDoc.Styles(wdStyleHeading1).NameLocal Then
            isHeading = True
        ElseIf sParaStyle = oDoc.Styles(wdStyleHeading2).NameLocal Then
            isHeading = True
        ElseIf sParaStyle = oDoc.Styles(wdStyleHeading3).NameLocal Then
            isHeading = True
        ElseIf sParaStyle = oDoc.Styles(wdStyleHeading4).NameLocal Then
            isHeading = True
        ElseIf sParaStyle = oDoc.Styles(wdStyleHeading5).NameLocal Then
            isHeading = True
        ElseIf sParaStyle = oDoc.Styles(wdStyleHeading6).NameLocal Then
            isHeading = True
        ElseIf sParaStyle = oDoc.Styles(wdStyleHeading7).NameLocal Then
            isHeading = True
        ElseIf sParaStyle = oDoc.Styles(wdStyleHeading8).NameLocal Then
            isHeading = True
        ElseIf sParaStyle = oDoc.Styles(wdStyleHeading9).NameLocal Then
            isHeading = True
        ElseIf sParaStyle = Annex_Lvl_1_name Then
            isHeading = True
        ElseIf sParaStyle = Annex_Lvl_2_name Then
            isHeading = True
        ElseIf sParaStyle = Annex_Lvl_3_name Then
            isHeading = True
        ElseIf sParaStyle = Annex_Lvl_4_name Then
            isHeading = True
        ElseIf sParaStyle = Annex_Lvl_5_name Then
            isHeading = True
        ElseIf sParaStyle = Annex_Lvl_6_name Then
            isHeading = True
        ElseIf sParaStyle = Annex_Lvl_7_name Then
            isHeading = True
        ElseIf sParaStyle = Annex_Lvl_8_name Then
            isHeading = True
        ElseIf sParaStyle = Annex_Lvl_9_name Then
            isHeading = True
        Else
            isHeading = False
        End If
    End Function
    Cependant le résultat donne quelque chose comme:
    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
    1. Titre 1
    (1) Enumeration level 1
    (2) Enumeration level 1
         a. Enumeration level 3
         b. Enumeration level 3
    (3) Enumeration level 1
    (4) Enumeration level 1
         a. Enumeration level 3
         b. Enumeration level 3
    1.1 Titre 2
    (1) Enumeration level 1
         a. Enumeration level 3
         b. Enumeration level 3
    (5) Enumeration level 1
    1.2. Titre 2
    (1) Enumeration level 1
         a. Enumeration level 3
         b. Enumeration level 3
    (6) Enumeration level 1
    Je ne vois pas comment continuer la liste apres le titre pour avoir le résultat escomptés...
    En cliquant sur la puce numérotée j'ai l'impression que cela a créé "3 listes" une bleu, une rouge et une verte. Cependant, je ne vois pas comment dire que la liste bleu se trouve entre deux titre, la liste verte entre deux titres, etc..

    Est ce que vous auriez une piste ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Fumble-x Voir le message
    Bonjour,

    Pas sur que je puisse vous aider, mais je ne comprends pas cette partie de code :

    • Vous instanciez oParaPrevious avant oParaCurrent qui lui même correspond au paragraphe en cours oPara.
    • Quelle est la différence entre ces trois variables ? Je ne vois pas ce qui les distingue plus loin dans votre code.

    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
     
    ParagraphCount = oDoc.Paragraphs.Count
    ParagraphProgress = 0
    For Each oPara In oDoc.Paragraphs
        Set oParaPrevious = oParaCurrent
        Set oParaCurrent = oPara
     
        If oParaPrevious Is Nothing Then 'Management of first paragraph without a previous paragraph
            ' Nothing
        Else
            If isHeading(oParaPrevious.Style.NameLocal, oDoc) = True And oParaCurrent.Style = Enum_Lvl_1_name Then
                oPara.Range.ListFormat.ApplyListTemplateWithLevel ListTemplate:=ListGalleries(wdOutlineNumberGallery).ListTemplates(1), ContinuePreviousList:=False, ApplyTo:=wdListApplyToWholeList
            Else
                'Nothing
            End If
        End If
    Next oPara
    Sinon, avez vous essayé de commencer par la fin pour voir si le résultat pouvait être différent ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For ParagraphProgress  =  oDoc.Paragraphs.Count to 1 Step -1
        ....
        Set oParaCurrent = oDoc.Paragraphs(ParagraphProgress)
    Next

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2019
    Messages : 4
    Par défaut
    Merci pour votre réponse.
    L'idée de cette partie de code était la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set oParaPrevious = oParaCurrent
    Set oParaCurrent = oPara
    Je parcours l'ensemble des paragraphes de mon document. Durant le parcours, je garde "l'image" du paragraphe précédent et l'image du paragraphe "courant".
    Cela me permet de pouvoir faire une comparaison et de trouver le cas ou,
    J'ai un paragraphe de type "titre de chapitre" ou un paragraphe "titre d'annexe" et juste après une paragraphe type énumération. Dans ce cas précis je sais que je dois procéder a un redémarrage d'énumération

    Je ne sais pas si c'est le meilleurs "algorithme" au niveau performance ou efficacité

    Je vais voir si en résonnant par le bas si j'arrive a quelque chose

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Fumble-x Voir le message
    Je n'ai sans doute rien compris, mais ces deux variables prennent la valeur du paragraphe en cours à chaque paragraphe du document.
    Peut-être devriez vous travailler par indice comme indiqué dans mon 1er message en se calant sur les valeurs ParagraphProgress + 1 ou ParagraphProgress -1 dans la mesure où elles peuvent exister.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Fumble-x Voir le message
    Je vais voir si en résonnant par le bas si j'arrive a quelque chose
    Précision : Commencer par la fin n'a d'intérêt que si les items d'une collection peuvent changer. C'est le cas lorsque vous supprimez un item par exemple. A la relecture de votre code, je n'ai pas vu ce cas.

    Autre question : J'ai compris que votre document était établi à partir d'un modèle contenant vos styles. A la création de votre document, comment le lien se fait entre le style et le paragraphe ?

Discussions similaires

  1. [WD-2010] Renuméroté une liste de paragraphe apres un titre
    Par Delivrance dans le forum VBA Word
    Réponses: 0
    Dernier message: 17/02/2019, 22h57
  2. Réponses: 4
    Dernier message: 09/08/2006, 10h41
  3. afficher une liste deroulante après une selection
    Par zana74 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 04/08/2006, 17h18
  4. création d'une liste d'après un fichier en c
    Par ghislain118 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 21/12/2005, 10h56
  5. liste énumérée de const. perso comme paramètre de fonction
    Par batou22003 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/12/2005, 20h37

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