Macro Word - Recherche Texte ayant un format défini

Macro Word - Recherche Texte ayant un format défini - VB/VBA/VBS - Programmation

Marsh Posté le 13-10-2010 à 22:28:55    

Bonjour,  
 
dans un document Word, j'ai du texte qui est mis sous un format bien particulier.  
 
J'aimerais avoir une macro qui permette de rechercher ce texte au fur et à mesure et de le mettre automatiquement dans un tableau (une ligne pour chaque chaine de caractère trouvée ayant ce format).
 
Merci beaucoup pour vos idées.
Cdlt,
 
ps: je suis une bille en prog mais avec des exemples je pourrai peut-être compiler un truc... :-) MERCI.

Reply

Marsh Posté le 13-10-2010 à 22:28:55   

Reply

Marsh Posté le 14-10-2010 à 18:11:29    

Et c'est quoi le format particulier ?


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 19-10-2010 à 10:03:15    

SuppotDeSaTante a écrit :

Et c'est quoi le format particulier ?


 
le Format est un Format de type "Titre2" sauf que dans mon cas il a été crée spécialement pour des besoins internes.  
 
En fait les différentes étapes seraient:
 
- selectionner tout le texte du document
- chercher le "style" ou "format" de type "Titre2" (par exemple)
- copier le texte de ce type
- creer un tableau
- coller le texte dans un tableau (ligne après ligne)
 
Et recommencer.  
 
Merci pour vos conseils, je ne suis pas à l'aise avec les objets dans Word.
 
Voici mon code pour l'instant:
 
Sub Macro2()
 
Dim slt, form As String
Set slt = Selection.Find
 
If slt.Style = ActiveDocument.Styles("Titre 7;constats (AVEC sous-processus)" ) Then
       Selection.Copy
       Documents.Add DocumentType:=wdNewBlankDocument
       Windows(2).Activate
       ActiveDocument.Selection.PasteAndFormat (wdPasteDefault)
   
    End If
End Sub
 
Le problème est que en fait il me copie tout le texte selectionné et non le texte ayant le Style ("Titre7...." ).


Message édité par ephene le 19-10-2010 à 10:25:49
Reply

Marsh Posté le 19-10-2010 à 11:18:48    

je connais pas trop le VBA Word, il y a surement d'autres moyens plus simples d'y parvenir mais j'ai peut-être un début de solution :
 
 
dim texteTemp as string
 
Selection.WholeStory
For i = 1 To Selection.Characters.Count
 
if Selection.Characters(i).Style = "Titre 2" ' Attention a noter la valeur exact du style, utilise un débug.print sur un texte de test pour vérifier la valeur du style
texteTemp = texteTemp & Selection.Characters(i).Text
end if
 
Next i
 
textetemp comprendra toute la partie de ton document ou le texte aura un style "Titre 2". Bon bien sûr c'est tout collé a la suite dans cet exemple, tu peux modifier le code comme ca t'arrange et tu peux meme utiliser Selection.Words si tu veux traiter mots par mots.

Message cité 1 fois
Message édité par Arwon le 19-10-2010 à 11:20:38
Reply

Marsh Posté le 19-10-2010 à 11:53:47    

Arwon a écrit :

je connais pas trop le VBA Word, il y a surement d'autres moyens plus simples d'y parvenir mais j'ai peut-être un début de solution :
 
 
dim texteTemp as string
 
Selection.WholeStory
For i = 1 To Selection.Characters.Count
 
if Selection.Characters(i).Style = "Titre 2" ' Attention a noter la valeur exact du style, utilise un débug.print sur un texte de test pour vérifier la valeur du style
texteTemp = texteTemp & Selection.Characters(i).Text
end if
 
Next i
 
textetemp comprendra toute la partie de ton document ou le texte aura un style "Titre 2". Bon bien sûr c'est tout collé a la suite dans cet exemple, tu peux modifier le code comme ca t'arrange et tu peux meme utiliser Selection.Words si tu veux traiter mots par mots.


 
Merci pour ta réponse mais ça ne fonctionne pas. En fait, je n'arrive pas à récupérer caractère par caractère et à les copier en fin de document par exemple.
 
Peux-tu affiner ta proposition car tu as l'air de bien maitriser.
 
Merci d'avance.

Reply

Marsh Posté le 19-10-2010 à 13:05:16    

Hello
 
Je pense que vous vous prenez la tete pour pas grand chose.
Word permet, nativement, de faire une recherche sur le style.
Rechercher, Format, Style, et on selectionne le style en question.
 
Donc a partir de la, recuperer tous les textes (mots, phrases etc.) est un "jeu d'enfant"
 
De plus, dans l'aide de Word, tout est noté :

Citation :

Cet exemple montre comment insérer « Tip : » au début de chacun des paragraphes dotés du style de titre Heading 3 dans le document actif. L'instruction Do...Loop est utilisée pour répéter une série d'actions chaque fois que ce style est trouvé.
 
With ActiveDocument.Content.Find
    .ClearFormatting
    .Style = wdStyleHeading3
    Do While .Execute(FindText:="", Forward:=True, _
            Format:=True) = True
        With .Parent
            .StartOf Unit:=wdParagraph, Extend:=wdMove
            .InsertAfter "Tip: "
            .Move Unit:=wdParagraph, Count:=1
        End With
    Loop
End With


 
Donc on peut en deduire le code suivant :

Code :
  1. Sub ephene()
  2. 'On se met au debut du doc
  3.    Selection.Start = ActiveDocument.Content.Start
  4.    Selection.End = ActiveDocument.Content.Start
  5.  
  6. 'On recherche notre style
  7.    With Selection.Find
  8.        .ClearFormatting
  9.        .Style = "Titre 2"
  10. 'tant qu'on le trouve on stocke le texte trouvé avec ce style dans une variable
  11.        While .Execute
  12.            Valeur = Valeur & Selection.Text
  13. 'On se met a la suite pour poursuivre la recherce
  14.            Selection.Start = Selection.End + 1
  15.            Selection.End = Selection.Start
  16.        Wend
  17.    End With
  18.  
  19. 'On créé un nouveau document pour mettre le tableau
  20.    Documents.Add Template:="Normal", NewTemplate:=False, DocumentType:=0
  21. 'on tape notre texte contenant tout nos mots du style cherché
  22.    Selection.TypeText (Valeur)
  23. 'on selectionne tout dans le doc
  24.    Selection.WholeStory
  25. 'et on utilise cette fonction bien pratique qui va convertir chaque retour a la ligne par une ligne de tableau
  26.    Selection.ConvertToTable
  27. End Sub


 
 
La preuve en image :
http://dje69r.free.fr/ephene.jpg
 
 
EnJoY :jap:


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 19-10-2010 à 13:46:42    

Merci beaucoup pour ce message très efficace et très clair dans les explications.
 
Cela fonctionne très bien sauf que les puces qui précèdent le texte ne sont pas prises en compte. En effet, en regardant le style qui leur est appliqué est lié au texte et non pas directement à la puce...
 
As-tu une solution magique pour que les puces soient aussi prises en compte?
 
Merci pour ton aide.

Reply

Marsh Posté le 19-10-2010 à 14:33:03    

La puce fait elle parti du style "Titre 2" ?
 
Edit : quel type de puce d'ailleurs ?

Message cité 1 fois
Message édité par SuppotDeSaTante le 19-10-2010 à 14:34:03

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 19-10-2010 à 14:56:08    

SuppotDeSaTante a écrit :

La puce fait elle parti du style "Titre 2" ?
 
Edit : quel type de puce d'ailleurs ?


 
 
La puce est personalisée et on lui applique le "Titre 2" donc quand on applique le style, elle apparait automatiquement.
 
C'est une puce de hierarchisation...
 
Est-ce assez clair?
 
Aussi, j'aimerais pouvoir rechercher 2 styles à la fois par exemple Titre 1 et Titre 2 en même temps... avec OR ça ne fonctionne pas...


Message édité par ephene le 19-10-2010 à 15:16:48
Reply

Marsh Posté le 19-10-2010 à 15:13:21    

Non :whistle:
 
Ma question etait plus : est-ce une puce qui s'incremente ?
1-2-3-etc.
a-b-c-etc.
 
Si non, tu selectionnes le tableau créé a la fin et tu appliques le style "titre2"
Tu auras tes puces dans le tableau

Message cité 1 fois
Message édité par SuppotDeSaTante le 19-10-2010 à 15:14:03

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 19-10-2010 à 15:13:21   

Reply

Marsh Posté le 19-10-2010 à 15:18:31    

SuppotDeSaTante a écrit :

Non :whistle:
 
Ma question etait plus : est-ce une puce qui s'incremente ?
1-2-3-etc.
a-b-c-etc.
 
Si non, tu selectionnes le tableau créé a la fin et tu appliques le style "titre2"
Tu auras tes puces dans le tableau


 
 
Oui se sont des puces qui s'incrementent... en fait il faut que la valeur de la puce soit renvoyée dans le tableau à la fin...
 
au fait j'aimerais pouvoir faire une recherche non pas d'un titre mais de deux cf. Message précédent... tu as une idée?

Reply

Marsh Posté le 19-10-2010 à 15:32:21    

Non tu seras obligé de faire plusieurs passage pour ca... On peut pas faire deux recherches en meme temps sur le meme critere
 
Pour les puces qui s'incrementent, pas de solutions non plus directement. On peut savoir quelle ligne est pucée, mais pas recuperer sa valeur.
Du moins moi en tout cas, ca je ne sais pas faire, mais je ne pense pas que ca soit faisable du moins directement.
 
On peut "bidouiller".
- Si le 1er style trouvé a la puce n°1 et le Xème stylé trouvé a la puce X
- Exporter le fichier en rtf et recuperer les balises <ol>
 
Pour la seconde partie il faudrait savoir quel type de puce tu as, d'ou mes questions :D
 
 
EDIT : rassures moi, tu ne veux pas faire une table des matieres la ??

Message cité 1 fois
Message édité par SuppotDeSaTante le 19-10-2010 à 15:36:51

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 19-10-2010 à 15:46:43    

SuppotDeSaTante a écrit :

Non tu seras obligé de faire plusieurs passage pour ca... On peut pas faire deux recherches en meme temps sur le meme critere
 
Pour les puces qui s'incrementent, pas de solutions non plus directement. On peut savoir quelle ligne est pucée, mais pas recuperer sa valeur.
Du moins moi en tout cas, ca je ne sais pas faire, mais je ne pense pas que ca soit faisable du moins directement.
 
On peut "bidouiller".
- Si le 1er style trouvé a la puce n°1 et le Xème stylé trouvé a la puce X
- Exporter le fichier en rtf et recuperer les balises <ol>
 
Pour la seconde partie il faudrait savoir quel type de puce tu as, d'ou mes questions :D
 
 
EDIT : rassures moi, tu ne veux pas faire une table des matieres la ??


 
Non pas vraiment, je veux simplement regrouper dans un tableau des infos ayant le même format (titre 2 ou Titre 3) et les numeros de puces afférents....
 
Ensuite ce tableau sera suivi et par des personnes mais étant donné que les données sont extraites de gros rapport, cela évite de se taper à la mano tout le tableau...!
 
Tu es certain que l'on ne peut pas bidouiller pour faire une recherche de deux styles en même temps...? ce point est vraiment important!
 
Merci en tout cas pour ton retour.

Reply

Marsh Posté le 19-10-2010 à 15:53:07    

En meme temps non
A la suite, oui
 
Tu peux chercher d'abord les titres1, ensuite les titres2
 
Ou tu peux "bidouiller"
Comme tu peux recuperer a quel emplacement dans le doc ils sont, tu peux en deduire lequel vient avant lequel etc.
Tu ecris dans la variable un pointeur plus le numéo de caractere, tu tries ensuite par ce numéro
 
Mais ce n'est plus le meme boulot la ;)


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 19-10-2010 à 16:23:59    

pour l'histoire des deux styles cherchés :

Code :
  1. Sub ephene()
  2. 'On se met au debut du doc
  3.    Selection.Start = ActiveDocument.Content.Start
  4.    Selection.End = ActiveDocument.Content.Start
  5.    
  6.    Selection.Find.Text = ""
  7.    Selection.Find.ClearFormatting
  8.  
  9. 'On recherche notre style
  10.    With Selection.Find
  11.        .Style = "Titre 2"
  12. 'tant qu'on le trouve on stocke le texte trouvé avec ce style dans une variable
  13.        While .Execute
  14. 'ici je triche. Je met le numéro du caractere suivi de VBHFR en vue de par la suite trier par numerique
  15. 'VBHFR c'est juste une chaine a la con qui permettra, une fois trié d'enlever les infos, le numéro et VBHFR
  16. 'c'est qu'un pointeur de recherche
  17.            Valeur = Valeur & Selection.Start & "VBHFR" & Selection.Text
  18. 'On se met a la suite pour poursuivre la recherce
  19.            Debug.Print Valeur
  20.            Selection.Start = Selection.End + 1
  21.            Selection.End = Selection.Start
  22.        Wend
  23.    End With
  24. '**************************
  25. 'obligé de relancer une recherche, idem au dessus sauf le style
  26. '**************************
  27.  
  28. 'On se met au debut du doc
  29.    Selection.Start = ActiveDocument.Content.Start
  30.    Selection.End = ActiveDocument.Content.Start
  31.    
  32.    Selection.Find.Text = ""
  33.    Selection.Find.ClearFormatting
  34.    
  35. 'On recherche notre style
  36.    Selection.Find.ClearFormatting
  37.    With Selection.Find
  38.        .Style = "Titre 1"
  39. 'tant qu'on le trouve on stocke le texte trouvé avec ce style dans une variable
  40.        While .Execute
  41. 'ici je triche. Je met le numéro du caractere suivi de VBHFR en vue de par la suite trier par numerique
  42. 'VBHFR c'est juste une chaine a la con qui permettra, une fois trié d'enlever les infos, le numéro et VBHFR
  43. 'c'est qu'un pointeur de recherche
  44.            Valeur = Valeur & Selection.Start & "VBHFR" & Selection.Text
  45. 'On se met a la suite pour poursuivre la recherce
  46.            Selection.Start = Selection.End + 1
  47.            Selection.End = Selection.Start
  48.        Wend
  49.    End With
  50.  
  51. 'On créé un nouveau document pour mettre le tableau
  52.    Documents.Add Template:="Normal", NewTemplate:=False, DocumentType:=0
  53. 'on tape notre texte contenant tout nos mots du style cherché
  54.    Selection.TypeText (Valeur)
  55. 'on selectionne tout dans le doc
  56.    Selection.WholeStory
  57. 'et on utilise cette fonction bien pratique qui va convertir chaque retour a la ligne par une ligne de tableau
  58.    Selection.ConvertToTable
  59. 'on range par ordre numerique grace a nos numero suivi de VBHFR
  60.    Selection.Sort FieldNumber:="Colonne 1", SortFieldType:=wdSortFieldNumeric
  61. 'on supprime tout ce qui est avant ET qui contient VBHFR
  62.    Selection.Find.ClearFormatting
  63.    Selection.Find.Replacement.ClearFormatting
  64.    With Selection.Find
  65.        .Text = "*VBHFR"
  66.        .Replacement.Text = ""
  67.        .MatchWildcards = True
  68.        .Forward = True
  69.    End With
  70.    Selection.Find.Execute Replace:=wdReplaceAll
  71.  
  72. End Sub


 
Parcontre pour la puce... Chaud chaud

Message cité 1 fois
Message édité par SuppotDeSaTante le 19-10-2010 à 16:25:52

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 19-10-2010 à 17:08:15    

SuppotDeSaTante a écrit :

pour l'histoire des deux styles cherchés :

Code :
  1. Sub ephene()
  2. 'On se met au debut du doc
  3.    Selection.Start = ActiveDocument.Content.Start
  4.    Selection.End = ActiveDocument.Content.Start
  5.    
  6.    Selection.Find.Text = ""
  7.    Selection.Find.ClearFormatting
  8.  
  9. 'On recherche notre style
  10.    With Selection.Find
  11.        .Style = "Titre 2"
  12. 'tant qu'on le trouve on stocke le texte trouvé avec ce style dans une variable
  13.        While .Execute
  14. 'ici je triche. Je met le numéro du caractere suivi de VBHFR en vue de par la suite trier par numerique
  15. 'VBHFR c'est juste une chaine a la con qui permettra, une fois trié d'enlever les infos, le numéro et VBHFR
  16. 'c'est qu'un pointeur de recherche
  17.            Valeur = Valeur & Selection.Start & "VBHFR" & Selection.Text
  18. 'On se met a la suite pour poursuivre la recherce
  19.            Debug.Print Valeur
  20.            Selection.Start = Selection.End + 1
  21.            Selection.End = Selection.Start
  22.        Wend
  23.    End With
  24. '**************************
  25. 'obligé de relancer une recherche, idem au dessus sauf le style
  26. '**************************
  27.  
  28. 'On se met au debut du doc
  29.    Selection.Start = ActiveDocument.Content.Start
  30.    Selection.End = ActiveDocument.Content.Start
  31.    
  32.    Selection.Find.Text = ""
  33.    Selection.Find.ClearFormatting
  34.    
  35. 'On recherche notre style
  36.    Selection.Find.ClearFormatting
  37.    With Selection.Find
  38.        .Style = "Titre 1"
  39. 'tant qu'on le trouve on stocke le texte trouvé avec ce style dans une variable
  40.        While .Execute
  41. 'ici je triche. Je met le numéro du caractere suivi de VBHFR en vue de par la suite trier par numerique
  42. 'VBHFR c'est juste une chaine a la con qui permettra, une fois trié d'enlever les infos, le numéro et VBHFR
  43. 'c'est qu'un pointeur de recherche
  44.            Valeur = Valeur & Selection.Start & "VBHFR" & Selection.Text
  45. 'On se met a la suite pour poursuivre la recherce
  46.            Selection.Start = Selection.End + 1
  47.            Selection.End = Selection.Start
  48.        Wend
  49.    End With
  50.  
  51. 'On créé un nouveau document pour mettre le tableau
  52.    Documents.Add Template:="Normal", NewTemplate:=False, DocumentType:=0
  53. 'on tape notre texte contenant tout nos mots du style cherché
  54.    Selection.TypeText (Valeur)
  55. 'on selectionne tout dans le doc
  56.    Selection.WholeStory
  57. 'et on utilise cette fonction bien pratique qui va convertir chaque retour a la ligne par une ligne de tableau
  58.    Selection.ConvertToTable
  59. 'on range par ordre numerique grace a nos numero suivi de VBHFR
  60.    Selection.Sort FieldNumber:="Colonne 1", SortFieldType:=wdSortFieldNumeric
  61. 'on supprime tout ce qui est avant ET qui contient VBHFR
  62.    Selection.Find.ClearFormatting
  63.    Selection.Find.Replacement.ClearFormatting
  64.    With Selection.Find
  65.        .Text = "*VBHFR"
  66.        .Replacement.Text = ""
  67.        .MatchWildcards = True
  68.        .Forward = True
  69.    End With
  70.    Selection.Find.Execute Replace:=wdReplaceAll
  71.  
  72. End Sub


 
Parcontre pour la puce... Chaud chaud


 
 
Alors j'ai testé cette nouvelle variante mais ça plante... apparemment ça tourne en rond et VBA plante.  
Je n'ai pas trop compris l'histoire de la chaine de caractères car j'ai l'impression qu'il n'y a pas d'incrementation...
 
As-tu testé de ton côté?
 
Merci.

Reply

Marsh Posté le 19-10-2010 à 17:10:23    

evidemment...
 
Si ca plante, c'est qu'a la fin de ton doc il n'y a pas de retour chariot, je n'ai pas testé cette eventualité en effet.
 
Ajoute des "entree" a la fin de ton doc et ca ne devrait plus planter


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 19-10-2010 à 17:14:08    

En image :
En rouge titre2, en noir titre1
Donc j'arrive bien a l'ordre "normal" sur deux criteres
http://dje69r.free.fr/ephene2.JPG

Message cité 1 fois
Message édité par SuppotDeSaTante le 19-10-2010 à 17:15:19

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 19-10-2010 à 17:17:31    

Pour la chaine de caractere :
A chaque fois qu'il trouve "titre1" je met le numéro de caractere dans le document.
 
Si le début de ton texte qui en style "titre1" est le 925eme (c'est un exemple) caractere du document, et que le texte est "toto"
Je mets "925VBFHRtoto"
Donc derriere je n'ai plus qu'a les trier par ordre croissant, et enlever tout ce qu'il y avant "VBFHR" et "VBHFR"
 
Exemple :
 
Chapitre1 Titre1
   a) petit a Titre2
   b) petit b Titre2
Chapitre2 Titre1
   a2) petit a2 Titre2
 
Comme on peut pas faire d'un coup on est obligé de faire les recherches a la suite, donc d'abord Titre1, puis Titre2
On se retrouverait donc avec  
Chapitre1 Titre1
Chapitre2 Titre1
a) petit a Titre2
b) petit b Titre2
a2) petit a2 Titre2
 
Il faut donc un moyen de les trier. Rien de mieux que l'ordre dans lequel ils sont dans Word
 
Donc, imaginons que seul 50 caractere separent nos textes, on aurait :
Caractere 0 : Chapitre1 Titre1
Caractere 150 : Chapitre2 Titre1
Caractere 50 : a) petit a Titre2
Caractere 100 : b) petit b Titre2
Caractere 200 : a2) petit a2 Titre2
 
Donc moi je stocke :
0VBHFRChapitre1 Titre1
150VBHFRChapitre2 Titre1
50VBHFRa) petit a Titre2
100VBHFRb) petit b Titre2
200VBHFRa2) petit a2 Titre2
 
Je trie par ordre croissant :
0VBHFRChapitre1 Titre1
50VBHFRa) petit a Titre1
150VBHFRChapitre2 Titre2
100VBHFRb) petit b Titre2
200VBHFRa2) petit a2 Titre2
 
Et j'enleve *VBHFR
Chapitre1 Titre1
a) petit a Titre2
Chapitre2 Titre1
b) petit b Titre2
a2) petit a2 Titre2


Message édité par SuppotDeSaTante le 19-10-2010 à 17:28:28

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 19-10-2010 à 17:19:56    

SuppotDeSaTante a écrit :

En image :
En rouge titre2, en noir titre1
Donc j'arrive bien a l'ordre "normal" sur deux criteres
http://dje69r.free.fr/ephene2.JPG


 
De mon côté, quand les données sont transférées dans le tableau, la deuxième ligne est vide.
 
j'ai repris le même exemple que toi et rien n'y fait! :-( lol
 

Reply

Marsh Posté le 19-10-2010 à 17:26:11    

Efface tes criteres de recherche que tu as effectué dans le formulaire de recherche (Ctrl + F)
 
J'ai edité mon precedent poste pour t'expliquer la chaine de caractere


Message édité par SuppotDeSaTante le 19-10-2010 à 17:26:29

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 20-10-2010 à 16:27:56    

Je suppose que c'est ok.
 
Cloturage du topic pour ma part :jap:


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 20-10-2010 à 16:38:51    

SuppotDeSaTante a écrit :

Je suppose que c'est ok.
 
Cloturage du topic pour ma part :jap:


 
Merci pour ta contribution, pour ton info, on passe par Excel car c'est beaucoup plus facile de séprer les infos et de les travailler.
 
Merci pour les actuces et les solutions que tu as apportés car elle me seront utiles pour la suite.
 
Topic Cloturé! :-)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed