Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/04/2011, 17h52   #1
Invité de passage
 
Homme
Inscription : avril 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2011
Messages : 8
Points : 0
Points : 0
Par défaut Recherche de la Xième itération d'un mot particulier et sélection des lignes jusqu'à la X+1 ème itération

Bonjour à tous,

Je suis novice et je cherche à faire une macro qui doit être relativement simple.

J'aimerais que ma macro fasse les deux choses suivantes:

Sachant que X est une variable (entier) que j'initialise au début de la macro.

-Qu'elle recherche la X ième occurence d'un mot qui commence par "RSK" ET qui a un style particulier :"Enum1 Titre"
(il y a d'autres mots commençant par "RSK" mais avec un autre style et je ne veux pas qu'ils soient pris en compte).

-Qu'elle sélectionne la ligne où ce mot a été repéré ainsi que toutes les lignes suivantes jusqu'à l'occurence du X+1 ème mot qui commence par "RSK" ET qui a le style "Enum1 Titre".
S'il n'y a plus de X+1 ème mot il faut qu'elle sélectionne toutes les lignes jusqu'à un signet qui existe dans mon document qu'on appellera SIGNET.

Grand merci d'avance à ceux qui se pencheront sur mon problème .
HelioM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 18h32   #2
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour,

Regardes du côté de la fonction find pour chercher une occurence, quelque chose du genre do while .execute(findtext:="RSK", style:="Enum titre1", forward=True) = True
Et incrémenter un compteur dans la boucle pour compter les occurences puis comparer dans cette boucle le compteur à X auquel cas, on mémorise la position.
Recherche d'une X +1ème occurence. Si trouvée, mémorisation position puis fin de boucle sinon recherche de l'emplacement du signet.

J'ai pas trop le temps là mais je te posterai un code demain soir si t'as pas réussi.

Pour t'aider, tu peux regarder cette partie de la FAQ.ici
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 11h39   #3
Invité de passage
 
Homme
Inscription : avril 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2011
Messages : 8
Points : 0
Points : 0
Merci pour ta réponse rapide Christophe.

Voici ce que j'ai fait jusqu'à maintenant :

Code :
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
 
Sub selectivite()
 
counter = 0
x = 1
 
With ActiveDocument.Content.Find
 
    Do While .Execute(FindText:="RSK", Forward:=True, Format:="Enum1") = True
 
 
    counter = counter + 1
 
        If counter = x Then pos1 = Find.Found.Select
 
        If counter = x + 1 Then pos2 = Find.Found.Select
        If counter = x + 1 Then GoTo suite
 
        Loop
 
    pos2 = ActiveDocument.Bookmarks("Finito").Range
 
suite:
 
End With
 
ActiveDocument.Range(pos1.End, pos2.Start).Select
 
 
End Sub

J'ai plusieurs problèmes :
-Il y a une erreur de type (erreur 13) à la ligne du "do while", je pense que c'est à cause du paramètre Format...
-J'arrive pas à enregistrer les valeurs trouvées dans pos1 et pos2, l'erreur est du type "objet requis".
-sans compter tous les problèmes que je ne vois pas encore du fait de mon niveau d'archi débutant !

Je continue de chercher...
Si as un peu de temps pour m'aider, je suis toujours preneur !
HelioM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 13h54   #4
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour,

Il faut utiliser style pas format
Code :
style:="Enum1" à la place de format
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 14h36   #5
Invité de passage
 
Homme
Inscription : avril 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2011
Messages : 8
Points : 0
Points : 0
Bonjour,

Oui j'avais déjà essayé "style" mais ça n'a pas marché. Mon paramètre de style n'est pas reconnu...

Mais mon vrai souci est au niveau du stockage ou de la sélection des données trouvées par "find",
au niveau des lignes du genre
Code :
 pos1 = Find.Found.Select
.
Je pense que ce n'est pas le bon moyen de coder le stockage...

Et ma boucle doit pas être bien faite car en mettant des msgbox j'ai l'impression qu'elle ne prend que le dernier "RSK" du document...
HelioM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 14h51   #6
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour,

Oui effectivement, c'est un objet pour stocker les positions dans le document.
Code :
1
2
3
4
5
6
7
8
9
 
dim pos1 as range, pos2 as range
 
Set fin = ActiveDocument.Range
With fin.Document.Content.Find
Do while (...)
 
set pos1 = fin.range
set pos2 = fin.range
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 15h30   #7
Invité de passage
 
Homme
Inscription : avril 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2011
Messages : 8
Points : 0
Points : 0
Bonjour,

Euh... je ne comprends pas trop ta réponse.

A quoi sert:
Code :
1
2
3
 
set pos1 = fin.range
set pos2 = fin.range
Et surtout pourquoi mettre la "même valeur" à pos1 et pos2 ?
HelioM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 10h33   #8
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour,

Selon l'itération, fin ne prend pas la même valeur (il n'est pas sur la même zone).
Cependant, il faut le lier par la position sur le document actif.
Code :
1
2
3
4
 
 If counter = x Then Set pos1 = ActiveDocument.Range(Start:=fin.End, End:=fin.End)
 
        If counter = x + 1 Then Set pos2 = ActiveDocument.Range(Start:=fin.Start, End:=fin.Start)
Cela devrait marcher
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 10h38   #9
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour,

Pour la gestion du style, c'est sur l'objet find.
Code :
1
2
3
 
With fin.Find
.Style = "Enum1"
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 17h27   #10
Invité de passage
 
Homme
Inscription : avril 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2011
Messages : 8
Points : 0
Points : 0
Bonjour,

Pour ceux que ca pourrait intéresser, voila un code qui marche :

Code :
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
 
Sub selection()
 
counter = 0
x = 2
 
 With ActiveDocument.Content.Find
 
     Do While .Execute(FindText:="RSK", Forward:=True) = True
              .Font.Bold = True
 
        counter = counter + 1
 
        If counter = x Then ActiveDocument.Bookmarks.Add Name:="Début", Range:=.Parent
 
             If counter = x + 1 Then ActiveDocument.Bookmarks.Add Name:="Fin", Range:=.Parent
             If counter = x + 1 Then GoTo suite
 
    Loop
 
    ActiveDocument.Bookmarks.Add Name:="Fin", Range:=ActiveDocument.Bookmarks("finito").Range
 
suite:
 
End With
 
On Error GoTo fini
ActiveDocument.Bookmarks("Début").Range.Select
ActiveDocument.Bookmarks("Fin").Range.Select
 
ActiveDocument.Range(ActiveDocument.Bookmarks("Début").Start, ActiveDocument.Bookmarks("Fin").End).Select
 
ActiveDocument.Bookmarks("Début").Delete
ActiveDocument.Bookmarks("Fin").Delete
 
MsgBox selection
 
fini:
End Sub
Par contre, il ne m'apporte pas entière satisfaction car il n'est pas vraiment optimisé et quand je l'intègre dans une macro plus globale il ne fonctionne pas comme voulu, notamment je n'arrive pas à faire en sorte que la recherche se fasse sur un mot avec un style ou une couleur précise, j'ai toujours des erreurs...donc la recherche ne se fait que sur le "texte"...

Bref, si un jour quelqu'un a un code plus propre à proposer qui répond à la question de mon premier poste je suis preneur.

En attendant, merci carden pour ton aide.

Je laisse un peu de temps au cas où d'autres réponses viendraient avant de mettre "résolu".
HelioM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 17h57   #11
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Spécialiste progiciel
Secteur : Service public

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour HelioM,

Pour le style, tu as essayé de mettre
Code :
1
2
3
With ActiveDocument.Content.Find
.style="Enum1" 
Do while .execute(FindText:="RSK", Forward:=True) = True
Logiquement, le style est lié à la fonction de recherche donc find

Par contre pourquoi tu crées des signets pour mémoriser les emplacements?
C'est pour rechercher plus facilement après?
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 18h11   #12
Invité de passage
 
Homme
Inscription : avril 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2011
Messages : 8
Points : 0
Points : 0
Par défaut [Résolu]

Bonjour carden,

Pour le style, ca ne marche pas dès que je mets le ".style" avant le "do while". En revanche ca ne donne pas d'erreur quand je le mets dans la boucle comme ça:

Code :
1
2
3
4
 
With ActiveDocument.Content.Find
Do while .execute(FindText:="RSK", Forward:=True) = True
            .style="Enum1"
mais je n'ai pas l'impression que ça le prend en compte car j'ai beau changé le style j'ai toujours le même résultat.

Pour les signets, ben en tâtonnant c'est le seul moyen qui a marché. Les autres méthodes donnaient des erreurs ou ne donnaient pas le résultat voulu...
HelioM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h40.


 
 
 
 
Partenaires

Hébergement Web