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

Word Discussion :

Creation d'index automatiquement


Sujet :

Word

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 21
    Points : 7
    Points
    7
    Par défaut Creation d'index automatiquement
    Bonjour
    une question surement triviale pour vous mais je débute totalement en VBA et mes notions de programmation datent beaucoup.
    Le problème est le suivant : j'ai un document avec beaucoup de paramètes textuels de la forme "par_trk_xxx_yy_zzzz_u" (pas de taille fixe, pas de délimiteur précis, mais la chaine n'est composée que de lettres minuscules et de underscore).

    Je souhaiterais indexer tous ces tous ces paramètres dans une table d'index et ce automatiquement.
    J'ai regardé sur tous les forums et pour la creation de l'index et de la table d'index, ca ne devrait pas me poser de probleme, mais j'aimerais avec le code pour récuperer toute la chaine "par_trk_xxx_yy_zzzz_u". Une recherche sur "par_trk_" ok mais aprés, comment récupérer le reste du "mot" ??

    Merci

  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,

    Voilà une piste :

    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
    Dim stTemp As String
        Selection.Find.ClearFormatting
        With Selection.Find
            .Text = "par_trk_"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
        End With
        Selection.Find.Execute
     
        Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
        stTemp = Selection.Range.Text
        ActiveWindow.ActivePane.View.ShowAll = True
        ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=stTemp, _
             EntryAutoText:=stTemp
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Merci pour cette réponse rapide...mais le probleme du "Moveright" avec comme pas "word" ne marche pas...un "_" est considéré comme un mot...donc en fait cette sélection s'arréte à par_trk_xxx

    De plus comme le nombre de "mots" aprés "par_trk_" n'est pas fixe, je ne peux malheureusement pas utilisé ce mécanisme

    En fait, il me faudrait l'instruction qui permettrait de compter le nombre de caractères à droite qui sont des lettres ou "_" ?
    Ensuite le MoveRight avec un pas wdCharacter et avec le nombre correct de caractères, ca devrait le faire

  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
    Pour compter le nombre de caractères, il faudrait utiliser la fonction split. Et mesurer les résultats.
    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
    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 : 60
    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 Récupérer un mot composé d'éléments séparés par "_"
    Salut,

    Vu que ton mot commence par "par_trk_", tu peux le rechercher via une recherche mais vu que le "_" est considéré comme séparateur de mots et que tu ne connais pas le nombre d'éléments, tu dois utiliser une boucle qui "enrichit" le mot courante de façon incrémentale, élément par élément, jusqu'à ce que tu l'ai lu entièrement.

    Donc tu commences comme le dit Heureux-oli, puis tu boucles jusqu'à trouver autre chose que "_"

    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
    Sub DeveloppezLectureD1MotElementParElement()
        Selection.Find.ClearFormatting
        With Selection.Find
            .Text = "par_trk"    'Attention, avant on recherchait "par_trk_"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
        End With
        Selection.Find.Execute
        
        If Selection.Find.Found Then
            aMotRecherche = Selection.Range.Text
            Selection.MoveRight Unit:=wdCharacter, Count:=1
            Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
            While Selection.Range.Text = "_"
              Selection.MoveRight Unit:=wdCharacter, Count:=1
              Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
              aMotRecherche = aMotRecherche + "_" + Selection.Range.Text
        
              Selection.MoveRight Unit:=wdCharacter, Count:=1
              Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
           Wend
       End If
    
        ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=aMotRecherche, EntryAutoText:=aMotRecherche
    End Sub
    A+

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Merci, c'est cool comme réponse...j'avais écrit un truc qui marchait mais bcp plus crade

    Par contre il me reste un probleme pour changer TOUS les parametres du fichier : comment faire le changement pour TOUS les parametres du fichier et être sur que je m'arrête bien à la fin du fichier ??
    PS :

    j'avais ecrit ca (ajout du booléen foundParameter pour déterminer quand on ne trouve plus aucun parametre)
    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
    Sub DeveloppezLectureD1MotElementParElement(ByRef foundParameter As Boolean)
        Selection.Find.ClearFormatting
        With Selection.Find
            .Text = "par_trk"    'Attention, avant on recherchait "par_trk_"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
        End With
        Selection.Find.Execute
     
        If Selection.Find.Found Then
            aMotRecherche = Selection.Range.Text
            Selection.MoveRight Unit:=wdCharacter, Count:=1
            Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
            While Selection.Range.Text = "_"
              Selection.MoveRight Unit:=wdCharacter, Count:=1
              Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
              aMotRecherche = aMotRecherche + "_" + Selection.Range.Text
     
              Selection.MoveRight Unit:=wdCharacter, Count:=1
              Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
           Wend
     
        Else
            foundParameter = False
     
       End If
     
       MsgBox foundParameter
     
        ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=aMotRecherche, EntryAutoText:=aMotRecherche
    End Sub
     
    Sub test()
    '
    '
    Dim foundParameter As Boolean
    foundParameter = True
     
        While foundParameter
     
        DeveloppezLectureD1MotElementParElement (foundParameter)
     
        Wend
     
     
    End Sub
    mais le booléen foundParameter ne passe jamais à False car la recherche reprend au début du document .
    Comment faire ??

    Merci

  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 : 60
    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 loupgarou,

    Tu y es presque en fait, c'est parce dans la gestion du found et des options de recherche que tu utilises que se trouve le problème.

    1. Dans [WO], il existe directement un attribut qui indique si la recherche a abouti ou a échoué, donc pas besoin de ta variable "foundParamater"
    2. Dans [WO], l'attribut "Wrap" de la commande "Rechercher" (Find) prends les valeurs
      • "wdFindAsk" pour qu'après la recherche, une message s'affiche pour savoir si on veut ou non continuer (ne correspond pas à note besoin dans notre cas)
      • "wdFindContinue" pour que la recherche continue lorsque la fin du document (dans notre cas) est atteinte (ne correspond pas à note besoin dans notre cas)
      • "wdFindStop" pour que la recherche continue lorsque la fin du document (dans notre cas) est atteinte (yes )

    Donc voilà le
    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
    Sub DeveloppezLectureDeTousLesMotsElementParElement()
    
        ' On va au début du document
        Selection.HomeKey Unit:=wdStory
         
        Selection.Find.ClearFormatting
        With Selection.Find
            .Text = "par_trk"    'Attention, avant on recherchait "par_trk_"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindStop
            .Format = False
        End With
        Selection.Find.Execute
        
        While Selection.Find.Found
            aMotRecherche = Selection.Range.Text
            Selection.MoveRight Unit:=wdCharacter, Count:=1
            Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
            While Selection.Range.Text = "_"
              Selection.MoveRight Unit:=wdCharacter, Count:=1
              Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
              aMotRecherche = aMotRecherche + "_" + Selection.Range.Text
        
              Selection.MoveRight Unit:=wdCharacter, Count:=1
              Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
           Wend
           
           Selection.MoveLeft Unit:=wdCharacter, Count:=1
           
           'On a trouvé donc on marque l'entrée
           ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=aMotRecherche, EntryAutoText:=aMotRecherche
           
           'Attention, en cas affichage des caractères masqués les index d'entrées sont affichés
           '  donc vont être retrouvés par la recherche ==> il faut les passer
           Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
           Selection.MoveRight Unit:=wdCharacter, Count:=1
           
           With Selection.Find
                .Text = "par_trk"    'Attention, avant on recherchait "par_trk_"
                .Replacement.Text = ""
                .Forward = True
                .Wrap = wdFindStop
                .Format = False
           End With
           Selection.Find.Execute
        Wend
    
        ' On compile alors l'index
        With ActiveDocument
            .Indexes.Add Range:=Selection.Range, HeadingSeparator:= _
                wdHeadingSeparatorNone, Type:=wdIndexIndent, RightAlignPageNumbers:= _
                True, NumberOfColumns:=2, AccentedLetters:=False
            .Indexes(1).TabLeader = wdTabLeaderDots
        End With
    End Sub
    @+

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Merci bcp à Sepia et à Oli

  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 : 60
    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
    Pas de problème.

    Reviens nous voir si tu as besoin

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Bonjour
    me revoila avec ce sujet, car j'ai un cas ou le script de Sepia ne fonctionne pas.

    Le problème est que l'index est bien rajouté pour chaque paramètre trouvé, mais lorsque ce paramètre se trouve dans une cellule de tableau SANS aucun caractère derrière le script boucle sans fin, rajoutant chaque fois une entrée à l'entrée précédente.
    Dans ce cas là, la solution de décaler la sélection d'un caractère vers la droite ne marche pas puisqu'il n'y a pas de caractère suivant.

    En piece jointe le fichier (une partie plutot) sur lequel il y a le probleme
    Fichiers attachés Fichiers attachés

  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 : 60
    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 Cas non pris en compte
    Salut

    En effet, Loupgarou si une cellule d'un tableau se termine l'un des mots recherchés, la macro boucle. Ce qui prouve que pour traiter un sujet dans tous les cas, il faut que vous nous les exposiez.

    Donc pour la cas du tableau, il faut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
              Selection.MoveLeft Unit:=wdCharacter, Count:=1
    de sélection du mot par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
           'Lorsque l'on dans une table dont l'entrée est le mot recherché, Word sélectionne la cellule complète et donc
           '  le mot que l'on vient d'indexer ==> ça boucle
           If (Selection.Range.Tables.Count > 0) And (InStr(Selection.Text, aMotRecherche) > 0) Then
              Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
           Else
              Selection.MoveLeft Unit:=wdCharacter, Count:=1
           End If
    donc la macro complète est
    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
    Sub DeveloppezLectureDeTousLesMotsElementParElement()
    
        ' On va au début du document
        Selection.HomeKey Unit:=wdStory
         
        Selection.Find.ClearFormatting
        With Selection.Find
            .Text = "par_trk"    'Attention, avant on recherchait "par_trk_"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindStop
            .Format = False
        End With
        Selection.Find.Execute
        
        While Selection.Find.Found
            aMotRecherche = Selection.Range.Text
            Selection.MoveRight Unit:=wdCharacter, Count:=1
            Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
            While Selection.Range.Text = "_"
              Selection.MoveRight Unit:=wdCharacter, Count:=1
              Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
              aMotRecherche = aMotRecherche + "_" + Selection.Range.Text
        
              Selection.MoveRight Unit:=wdCharacter, Count:=1
              Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
           Wend
           
           'Lorsque l'on dans une table dont l'entrée est le mot recherché, Word sélectionne la cellule complète et donc
           '  le mot que l'on vient d'indexer ==> ça boucle
           If (Selection.Range.Tables.Count > 0) And (InStr(Selection.Text, aMotRecherche) > 0) Then
              Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
           Else
              Selection.MoveLeft Unit:=wdCharacter, Count:=1
           End If
           
           'On a trouvé donc on marque l'entrée
           ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=aMotRecherche, EntryAutoText:=aMotRecherche
           
           'Attention, en cas affichage des caractères masqués les index d'entrées sont affichés
           '  donc vont être retrouvés par la recherche ==> il faut les passer
           Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
           Selection.MoveRight Unit:=wdCharacter, Count:=1
           
           With Selection.Find
                .Text = "par_trk"    'Attention, avant on recherchait "par_trk_"
                .Replacement.Text = ""
                .Forward = True
                .Wrap = wdFindStop
                .Format = False
           End With
           Selection.Find.Execute
        Wend
    
        ' On compile alors l'index
        With ActiveDocument
            .Indexes.Add Range:=Selection.Range, HeadingSeparator:= _
                wdHeadingSeparatorNone, Type:=wdIndexIndent, RightAlignPageNumbers:= _
                True, NumberOfColumns:=2, AccentedLetters:=False
            .Indexes(1).TabLeader = wdTabLeaderDots
        End With
    End Sub

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Merci Sepia

  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 : 60
    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
    Nous sommes là pour ça

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

Discussions similaires

  1. creation d'index dans une table déja remplie
    Par khalux dans le forum Requêtes
    Réponses: 4
    Dernier message: 22/01/2007, 16h24
  2. Indexation automatique en LaTeX
    Par gilloutte dans le forum Mise en forme
    Réponses: 1
    Dernier message: 03/11/2006, 09h01
  3. [debutant]creation d'index ?
    Par christophebmx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/01/2005, 09h40
  4. creation d'alias automatique
    Par Shnoof dans le forum Bases de données
    Réponses: 5
    Dernier message: 10/03/2004, 14h27
  5. [PostgreSQL][Index] automatique
    Par elrik dans le forum Requêtes
    Réponses: 4
    Dernier message: 30/05/2003, 14h08

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