Macro Word - Recherche Texte ayant un format défini - VB/VBA/VBS - Programmation
Marsh Posté le 14-10-2010 à 18:11:29
ReplyMarsh 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...." ).
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.
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 : |
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.
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é. |
Donc on peut en deduire le code suivant :
Code :
|
La preuve en image :
EnJoY
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.
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 ?
Marsh Posté le 19-10-2010 à 14:56:08
SuppotDeSaTante a écrit : La puce fait elle parti du style "Titre 2" ? |
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...
Marsh Posté le 19-10-2010 à 15:13:21
Non
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
Marsh Posté le 19-10-2010 à 15:18:31
SuppotDeSaTante a écrit : Non |
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?
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
EDIT : rassures moi, tu ne veux pas faire une table des matieres la ??
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 |
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.
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
Marsh Posté le 19-10-2010 à 16:23:59
pour l'histoire des deux styles cherchés :
Code :
|
Parcontre pour la puce... Chaud chaud
Marsh Posté le 19-10-2010 à 17:08:15
SuppotDeSaTante a écrit : pour l'histoire des deux styles cherchés :
|
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.
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
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
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
Marsh Posté le 19-10-2010 à 17:19:56
SuppotDeSaTante a écrit : En image : |
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
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
Marsh Posté le 20-10-2010 à 16:27:56
Je suppose que c'est ok.
Cloturage du topic pour ma part
Marsh Posté le 20-10-2010 à 16:38:51
SuppotDeSaTante a écrit : Je suppose que c'est ok. |
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é! :-)
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.