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 18/11/2007, 16h57   #1
Invité de passage
 
Inscription : novembre 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 27
Points : 4
Points : 4
Par défaut Déterminer si un document Word contient une liste de mots

Bonjour,

Je planche depuis un certain nombre de jours sur le problème suivant sans savoir par quel bout le prendre.

Je voudrais pouvoir déterminer si un document Word contient une liste de mots sans avoir moi-même à rechercher chacun de ces mots manuellement à l'aide de la fonction Rechercher de Word.

Dans mon esprit, je dois d'abord présenter cette liste de mots dans un tableau Word dans un premier document que j'appellerai par exemple Document1.

Dans le fichier Document1.doc, j'ai donc un tableau de deux colonnes. La première colonne contient :

Papa
Maman
Pierre
Paul

La deuxième colonne est vide pour l'instant.

Si j'ouvre un fichier Document2.doc, je voudrais que la macro m'indique automatiquement si mon document contient "Papa", "Maman", "Pierre" et/ou "Paul". L'idéal serait que le programme fasse apparaître une croix à droite de chaque chaîne trouvée.

J'ai une idée de la structure générale du programme mais je n'ai pas encore trouvé comment la formaliser :

Tant que la fin du tableau de Document1 n'est pas atteinte :
Dans Document1, sélectionner le contenu de la cellule de gauche de la première ligne, le copier, passer dans Document2 et rechercher ce contenu dans l'ensemble du document.

Si ce contenu est trouvé dans Document, insérer "X" dans la colonne de droite.

Sinon, passer à la ligne suivante et recommencer.

J'imagine que je n'ai pas pris en compte tous les paramètres, mais si quelqu'un pouvait m'aider, ce serait formidable.

Merci.
3dfroggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2007, 17h45   #2
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Déjà, tu dois créer ton tableau dans ton document. Le premier tableau, ou Table(), a le N° 1.
Dans la macro tu crées le tableau des mots ("TableauDesMots") à rechercher.
Ensuite, tu crées une boucle, dans cette boucle, tu sélectionnes la table, puis tu lances la recherche pour chaque index du "TableauDesMots".
Pour chaque mot trouvé, tu te déplaces dans la cellule suivante et tu insère 1.
Le code simpliste pour faire ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub ChercherTrouver()
Dim TableauDesMots, ok As Boolean, i As Integer
    tableau = Array("papa", "maman", "tonton", "tata")
    For i = 0 To UBound(TableauDesMots)
        Selection.Tables(1).Select
        With Selection.Find
            .Text = TableauDesMots(i)
            ok = .Execute = True
            If ok Then
                Selection.MoveRight Unit:=wdCell
                Selection.TypeText Text:="1"
            End If
        End With
    Next
End Sub
Au lieu de passer dans la cellule suivante pour insérer "1", tu peux utiliser le N° de ligne et de colonne pour te déplacer mais commence par là.
A+
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2007, 10h05   #3
Invité de passage
 
Inscription : novembre 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 27
Points : 4
Points : 4
Bonjour,

Merci beaucoup ! Je vais tester ça dès aujourd'hui. En fait (pardon si je n'ai pas été clair au départ), le document que je veux tester n'est pas un tableau mais un document Word quel qu'il soit.

Si le document Word contient un paragraphe du type :

"Papa est parti avec maman et tonton", je veux que la macro indique un signe à côté de "Papa", "Maman" et "Tonton" (même si la casse est différente), les mots à rechercher étant bel et bien dans un tableau.

Je crois que je vois comment m'y prendre à partir de ta piste et je te remercie vivement.

Bien cordialement,

3dfroggy
3dfroggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2007, 11h32   #4
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Si tu n'as qu'une fois chaque mot, tu n'as pas grand chose à modifier
Code :
1
2
3
4
5
6
7
8
9
10
    For i = 0 To UBound(TableauDesMots)
        With Selection.Find
            .Text = TableauDesMots(i)
            ok = .Execute = True
            If ok Then
                Selection.MoveRight Unit:=wdCharacter
                Selection.TypeText Text:="_1_" 'tu règles les espaces comme tu le souhaites
            End If
        End With
    Next
Maintenant, si l'occurence du mot cherché peut être rencontrée plusieurs fois, tu vas devoir faire une boucle de recherche. Pour ça, regarde là http://www.developpez.net/forums/sho...d.php?t=411051, tu supprimes la sélection de la ligne et l'insertion du signet et tu remplaces LeMot par TableauDesMots(i). Enfin, tu mets le tout dans la boucle For i = 0 To UBound(TableauDesMots)
A +
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2007, 12h26   #5
Invité de passage
 
Inscription : novembre 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 27
Points : 4
Points : 4
Rebonjour,

Merci encore de ton aide. Je viens de tester et ça marche, mais mon souci, c'est que je voudrais avoir ça dans deux documents différents.

Je t'explique.

J'ai un document MotsRecherches.doc qui contient un tableau de deux colonnes (pour l'instant, ce n'est pas un tableau au sens de la programmation ; c'est juste un tableau Word, dans lequel je veux pouvoir ajouter et supprimer des éléments ; par exemple supprimer "Papa" ou ajouter "Mamie", sans avoir à modifier le code si possible).


Fichier MotsRecherches.doc :

---------------
Papa |
Maman |
Tonton |
Tata |

Ensuite, j'ai un fichier DocumentATester. doc, qui est une lettre qui contient les phrases suivantes :

DocumentATester.doc :

Hier, j’ai vu papa. Il m'a emmené au cinéma et ça m'a beaucoup plus.

Ca faisait longtemps que je n'étais pas allé au cinéma et papa m'a bien fait plaisir.
Le cinéma, c’est vraiment chouette.
Ensuite, je suis allé voir maman et ensemble, nous sommes partis chez tonton.


A partir du fichier DocumentATester, j'aimerais que ma macro interagisse avec MotsRecherches.doc et affiche :

---------------
Papa | X
Maman | X
Tonton | X
Tata |

Je n'ai pas besoin de savoir s'il y a une ou plusieurs occurrences de telle ou telle chaîne : juste de savoir si oui ou non le terme est là (dans mon exemple, il y a avant 2 occurrences de "papa", 1 occurrence de "maman" et 1 de "tonton". (Je précise quand même que je suis capable de remplacer le "1" par un "X" ! Déjà que que j'ai l'impression d'être complètement assisté...)

Merci encore de ton aide précieuse.

3dfroggy
3dfroggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2007, 13h20   #6
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
En fait, ce qui te manque c'est
1 - créer un tableau de mots pris dans un document
2 - passer dans un autre document pour aller y chercher chaque mot du tableau
C'est bien ça ?

Edit
Comme je dois bientôt partir, je te mets déjà comment passer d'un doc à l'autre
Code :
1
2
3
    Documents("Classeur1.doc").Activate
'...
    Documents("Classeur2.doc").Activate
Pour sélectionner le tableau, je t'ai mis le code. Pour créer un tableauDeMots de ton tableau Word
Code :
1
2
3
4
5
DerLigne = ActiveDocument.Tables(1).Rows.count
Redim Preserve TableauDeMots(DerLigne)
For NoLigne = 1 to DerLigne
    TableauDeMots(NoLigne) = ActiveDocument.Tables(1).Cell(NoLigne, 1)
Next
Mais je dois "y aller"
Bon après-midi
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2007, 15h15   #7
Invité de passage
 
Inscription : novembre 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 27
Points : 4
Points : 4
Re- bonjour,

Merci encore de ta disponibilité.

Oui, c'est exactement ça.

Au départ, mon fichier MotsRecherches.doc est fermé et mon fichier DocumentATester.doc est ouvert.

A partir de mon fichier DocumentATester.doc, je veux que la macro fasse ceci :

Ouvrir le fichier MotsRecherches.doc
TANT QUE la fin de la liste de mots du fichier MotsRecherches.doc n'est pas atteinte

Sélectionner le mot de la cellule de gauche
Copier le mot dans le Presse-Papiers

Basculer vers le fichier DocumentATester.doc
Rechercher le mot

Revenir dans le document MotsRecherches.doc
Aller dans la cellule de droite
Si le mot a été trouvé dans DocumentATester.doc, mettre une croix (X) dans cette cellule
Sinon, ne rien mettre du tout (ou mettre un N, ça m'est égal).

Passer à laligne du dessous et recommencer.

FIN DU TANT QUE


Si tu veux te représenter les choses, tu images que tu es instituteur. Tu as demandé aux écoliers de faire une rédaction mais tu leur as interdit formellement d'utiliser les mots "Papa, Mama, Tonton, Tata".

Tu veux donc un moyen rapide de déterminer, avant même d'avoir commencé à corriger une copie, si la rédaction contient l'un de ces mots (si elle contient l'un de ces mots, tu refuses de corriger la copie de l'élève, qui doit s'arranger pour faire disparaître ces mots pour que tu acceptes de corriger).

Je pense que ce que tu viens de m'expliquer va bien m'aider.

Bonne continuation.

Lionel
3dfroggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2007, 19h26   #8
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Me rev'là.
Il serait mieux de créer d'abord ton tableau() des mots à rechercher en lisant la colonne 1 du Tableau Word (mon code - non testé, je n'avais pas le tps...)
Ça éviterait d'avoir à passer d'un doc dans l'autre pour chaque mot.
Pour éviter les mouvements de pages, en début de macro, place l'instruction
Code :
Application.ScreenUpdating = False
et, avant End Sub
Code :
Application.ScreenUpdating = True
A+
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2007, 22h19   #9
Invité de passage
 
Inscription : novembre 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 27
Points : 4
Points : 4
Bonjour,

Merci de ces précisions !

Je viens de mettre à jour mon code, qui se présente sous la forme suivante :

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
Sub ChercherTrouver()
 
'Désactiver la mise à jour de l'application pour éviter les mouvements de pages
Application.ScreenUpdating = False
 
Dim TableauDesMots, ok As Boolean, i As Integer
 
    'Créer un tableau
    tableau = Array("papa", "maman", "tonton", "tata")
    DerLigne = ActiveDocument.Tables(1).Rows.Count
    ReDim Preserve TableauDesMots(DerLigne)
    For NoLigne = 1 To DerLigne
 
 
    TableauDesMots(NoLigne) = ActiveDocument.Tables(1).Cell(NoLigne, 1)
Next
 
    For i = 0 To UBound(TableauDesMots)
        Selection.Tables(1).Select
        With Selection.Find
            .Text = TableauDesMots(i)
            ok = .Execute = True
            If ok Then
                Selection.MoveRight Unit:=wdCell
                Selection.TypeText Text:="1"
            End If
        End With
 
 
    Next
'Réactiver la mise à jour de l'application
Application.ScreenUpdating = True
End Sub

Par contre, le débogueur de VBA bloque sur la ligne

ReDim Preserve TableauDesMots(DerLigne)

pour laquelle il indique "TableauDesMots(derLigne)=incompatibilité de type".

J'espère avoir mis la section
'Créer un tableau

au bon endroit dans le code.

Je suis en train de mettre une capture d'écran sur http://co2mat.free.fr/chercherTrouver (j'espère que c'est autorisé).

Merci encore de ton aide.

Bien cordialement,

Lionel
3dfroggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2007, 23h11   #10
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Oui, bien sûr mais l'erreur m'est imputable. Dans mes explications je n'ai pas repris depuis le début
Si tu mets
Code :
   tableau = Array("papa", "maman", "tonton", "tata")
Tableau doit être déclaré
Code :
Dim Tableau ' as variant
Mais si le tableau doit être redimensionné, la déclaration doit être
Code :
Dim TableauDesMots() as string 'dans cet exemple
Ensuite, puisque tu vas chercher les mots dans un tableau Word -> Tables(1), Tableau n'est plus nécessaire. Ce qui devrait donner :
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
Sub ChercherTrouver() 
'Désactiver la mise à jour de l'application pour éviter les mouvements de pages
Application.ScreenUpdating = False
 
Dim TableauDesMots() as string, ok As Boolean, i As Integer
 
    DerLigne = ActiveDocument.Tables(1).Rows.Count
    ReDim Preserve TableauDesMots(DerLigne)
    For NoLigne = 1 To DerLigne
        TableauDesMots(NoLigne) = ActiveDocument.Tables(1).Cell(NoLigne, 1)
    Next
 
    For i = 0 To UBound(TableauDesMots)
        Selection.Tables(1).Select
        With Selection.Find
            .Text = TableauDesMots(i)
            ok = .Execute = True
            If ok Then
                Selection.MoveRight Unit:=wdCell
                Selection.TypeText Text:="1"
            End If
        End With
    Next
 
'Réactiver la mise à jour de l'application
Application.ScreenUpdating = True
End Sub
J'espère que ce sera "ok" ce coup-ci
Tu nous dis
A+
NB - Je n'ai pas vérifié le reste du code
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2007, 09h55   #11
Invité de passage
 
Inscription : novembre 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 27
Points : 4
Points : 4
Bonjour,

Merci une nouvelle fois de ton aide et pour l'explication concernant la suppression de "Tableau" (en fait, je ne comprenais plus pourquoi il y avait plusieurs tableaux).

Par contre, j'ai toujours mon erreur de compatibilité de type sur :

Code :
1
2
TableauDesMots(NoLigne) =
(suivi de ActiveDocument.Tables(1).Cell(NoLigne, 1)
J'espère que ça ne vient pas de la manière dont j'ai structuré mon document.

Merci encore de ta patience et bonne journée.

Lionel
3dfroggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2007, 11h43   #12
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Là, je ne vois pas d'où je suis... tu pourrais nous joindre le zip de ton fichier "anonymé" ?
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2007, 11h49   #13
Invité de passage
 
Inscription : novembre 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 27
Points : 4
Points : 4
Re-bonjour,

En fait, j'ai mis un exemple anonyme de mon fichier là :

http://co2mat.free.fr/chercherTrouve...ichiertest.doc

Je vais juste refaire une capture d'écran avec le code que tu m'as mis ce matin (le code de la capture était celui d'hier).

Une fois encore, mille mercis !

Lionel
3dfroggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2007, 11h54   #14
Invité de passage
 
Inscription : novembre 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 27
Points : 4
Points : 4
Je viens de mettre la nouvelle capture en ligne là :

http://co2mat.free.fr/chercherTrouve...reur211107.jpg

Merci encore.

Lionel
3dfroggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2007, 13h58   #15
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Ok, j'ai vu. Ton problème vient de ce que ton tableau est dans le même document que le texte. Ce que je t'ai passé ne peut pas fonctionner.
Si j'ai une idée, et le tps d'ici moins quart, je regarde
L'idéal serait que tu sépares ton tableau du texte (Documents ou sections différentes)
A+

Voilà, vite fait... Je t'ai mis le code pour insérer un saut de section entre ton tableau de mots et le texte. A n'utiliser qu'une fois (...). Mais tu peux le faire manuellement.
Le code
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
Sub ChercherTrouver()
'Désactiver la mise à jour de l'application pour éviter les mouvements de pages
Application.ScreenUpdating = False
 
Dim TableauDesMots(), ok As Boolean, i As Integer
 
    DerLigne = ActiveDocument.Tables(1).Rows.Count
    ReDim Preserve TableauDesMots(DerLigne)
    For NoLigne = 1 To DerLigne
        TableauDesMots(NoLigne) = ActiveDocument.Tables(1).Cell(NoLigne, 1)
        TableauDesMots(NoLigne) = Trim(Left(TableauDesMots(NoLigne), Len(TableauDesMots(NoLigne)) - 2))
    Next
 
    For i = 0 To UBound(TableauDesMots)
        Selection.GoTo What:=wdGoToSection, Which:=wdGoToFirst, Count:=2, Name:=""
        Selection.EndKey Unit:=wdStory, Extend:=wdExtend
        DoEvents
        With Selection.Find
            .Text = TableauDesMots(i)
            ok = .Execute = True
            If ok Then
                Selection.MoveRight Unit:=wdCharacter
                Selection.TypeText Text:="1"
                DoEvents
            End If
        End With
    Next
 
'Réactiver la mise à jour de l'application
Application.ScreenUpdating = True
End Sub
 
Sub insererSautDeSection()
    Selection.GoTo What:=wdGoToTable, Which:=wdGoToFirst, Count:=1, Name:=""
    Selection.Tables(1).Select
    Selection.MoveDown Unit:=wdLine, Count:=1
    Selection.InsertBreak Type:=wdSectionBreakNextPage
End Sub
On peut sans doute simplifier mais là je n'ai plus le tps. Bye.
A+
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2007, 14h07   #16
Invité de passage
 
Inscription : novembre 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 27
Points : 4
Points : 4
Merci de ta réponse.

Ca ne me dérange pas du tout de séparer le tableau du reste du texte par une section, par exemple. En fait, comme je te l'avais dit, au départ, je pensais faire ça avec deux documents distincts, mais le hic, c'est que je ne vois pas comment passer de l'un à l'autre en boucle.

A partir du code que tu m'avais donné, je m'étais dit que je conserverais le TableauDesMots dans un document séparé et que je demanderais à la macro de :
ouvrir le fichier contenant TableauDesMots
Sélectionner TableauDesMots, le copier et le coller au tout début de FichierATester.

Une fois les mots recherchés et le tableau rempli grâce à ton code, opération inverse : je sélectionner TableauDesMots, je le coupe et je le recolle dans un autre document.

Ca, je sais faire avec l'enregistreur de macros. Habituellement, je me débrouille en tâtonnant grâce à l'enregistreur de macros. Je procède "par l'exemple", je récupère le code et je l'adapte, mais là, je suis largué et je pense que j'ai mal analysé mon problème au départ.

Il n'y a aucune urgence concernant la réponse, si tu es encore motivé pour m'aider.

Cet outil me sera très utile quand il sera opérationnel mais je n'ai AUCUN IMPERATIF de délai, donc gère tes priorités à TOI. C'est déjà bien appréciable
d'avoir un interlocuteur si serviable.

MERCI encore et bon après-midi.

Lionel

FichierA
3dfroggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2007, 18h22   #17
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Je te l'ai finalement mis, le code, t'as pas vu ? Et en plus je me suis mis en retard
Ce n'est pas grave, avec la pluie "tout le monde" était en retard...
Mais regarde ce que je t'ai mis, ça devrait aller.
A+

Edit
Tu as bien dit que, s'il y avait plusieurs fois le même mot, ça n'avait pas d'importance ? Parce que sinon, il faudrait faire une boucle de recherche... Et là le code existe dans Contribuez, soit en comptant le nombre de fois et en mémorisant le N° de page (par SilkyRoad) soit plus simplement pour insérer un signet... et on n'est pas loin de l'insersion d'une balise.
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2007, 18h59   #18
Invité de passage
 
Inscription : novembre 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 27
Points : 4
Points : 4
Bonsoir,

Ben non, je n'avais pas vu que nous étions déjà passés à la page 2 !!!! :-(
Désolé de t'avoir mis en retard. La prochaine fois, prends ton temps !

Concernant le code, maintenant, je n'ai plus d'erreur mais une fois le saut de section créé (à l'aide de ton code), quand j'exécute la macro, le texte situé juste après le saut de section est sélectionné et il ne se passe rien d'autre
(je ne vois pas de 1 dans la colonne de droite du tableau).

J'ai essayé de désactiver la ligne

Application.ScreenUpdating = False

au cas où, mais ça ne change rien.

J'ai mis une capture d'écran là :

http://co2mat.free.fr/chercherTrouve...eur211107b.jpg

Merci de ta patience !

Bonne soirée.

Lionel
3dfroggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2007, 22h24   #19
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
La croix doit être dans le tableau ? Fallait le dire tout de suite Bon, quand j'ai répondu "entre la poire et le fromage" je crois que j'ai "un peu" oublier ta demande.
Dans ce cas, une fois la donnée trouvée, il faut retourner sur le tableau pour baliser la donnée.
Tu as deux possibilités mais il y en a une qui me paraît plus sympa.
Quand la procédure lit le tableau de mots, on lui affecte un signet dont le nom est le mot.
Quand la procédure examine ton texte et trouve un mot, elle retourne sur le signet correspondant, place une croix dans la cellule mitoyenne et retourne chercher le mot suivant.
Pour ça, le mieux est d'utiliser deux procédures. Une fois le tableau des mots renseigné, la recherche est lancée dans une procédure paramétrée. On pourrait faire ça avec un Gosub mais c'est mieux de séparer les deux.
Je regarde et je te rappelle

Voilà.
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
Sub ChercherTrouver()
'Désactiver la mise à jour de l'application pour éviter les mouvements de pages
Application.ScreenUpdating = False
 
Dim TableauDesMots(), ok As Boolean, i As Integer
Dim DerLigne As Byte
    DerLigne = ActiveDocument.Tables(1).Rows.Count
    ReDim Preserve TableauDesMots(DerLigne)
    For NoLigne = 1 To DerLigne
        TableauDesMots(NoLigne) = ActiveDocument.Tables(1).Cell(NoLigne, 1)
        TableauDesMots(NoLigne) = Trim(Left(TableauDesMots(NoLigne), Len(TableauDesMots(NoLigne)) - 2))
        ActiveDocument.Bookmarks _
            .Add Range:=ActiveDocument.Tables(1).Cell(NoLigne, 1), Name:=TableauDesMots(NoLigne)
    Next
 
    For i = 0 To UBound(TableauDesMots)
        ok = recherche(TableauDesMots(i))
        If ok Then
            Selection.GoTo What:=wdGoToBookmark, Name:=TableauDesMots(i)
            Selection.MoveRight Unit:=wdCell
            Selection.TypeText Text:="X"
        End If
    Next
 
'Réactiver la mise à jour de l'application
Application.ScreenUpdating = True
End Sub
 
Function recherche(LeMot) As Boolean
        Selection.GoTo What:=wdGoToSection, Which:=wdGoToFirst, Count:=2, Name:=""
        Selection.EndKey Unit:=wdStory, Extend:=wdExtend
        DoEvents
        With Selection.Find
            .Text = LeMot
            recherche = .Execute = True
        End With
End Function
Il doit y avoir moyen d'écrire directement dans la colonne 2 de la ligne du signet mais la syntaxe ne me vient pas. Si j'ai une idée, je te mets ça, ça simplifiera le code.
Là, tout de suite, je retourne à Stanley Kubrick sur Arte
Bonne soirée
A+

Sans signet, c'est possible... Est-ce mieux ? Oui, c'est probablement plus rapide si tu as beaucoup de mots dans ton tableau. A toi le choix.
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
Sub ChercherTrouver()
'Désactiver la mise à jour de l'application pour éviter les mouvements de pages
Application.ScreenUpdating = False
 
Dim TableauDesMots(), ok As Boolean, i As Integer
Dim DerLigne As Byte
    DerLigne = ActiveDocument.Tables(1).Rows.Count
    ReDim Preserve TableauDesMots(DerLigne)
    For NoLigne = 1 To DerLigne
        TableauDesMots(NoLigne) = ActiveDocument.Tables(1).Cell(NoLigne, 1)
        'Suppression de vbcrlf en fin de cellule et ajout du No de ligne
        TableauDesMots(NoLigne) = Trim(Left(TableauDesMots(NoLigne), _
        Len(TableauDesMots(NoLigne)) - 2)) & Right("0000" & NoLigne, 4)
    Next
 
    For i = 1 To UBound(TableauDesMots)
        ok = recherche(Left(TableauDesMots(i), Len(TableauDesMots(i)) - 4))
        If ok Then
            'récup du No de ligne dans le tableau
            NoLigne = Val(Right(TableauDesMots(i), 4))
            ActiveDocument.Tables(1).Cell(NoLigne, 2).Range.Text = "X"
        End If
    Next
 
'Réactiver la mise à jour de l'application
Application.ScreenUpdating = True
End Sub
 
Function recherche(LeMot) As Boolean
        Selection.GoTo What:=wdGoToSection, Which:=wdGoToFirst, Count:=2, Name:=""
        Selection.EndKey Unit:=wdStory, Extend:=wdExtend
        DoEvents
        With Selection.Find
            .Text = LeMot
            recherche = .Execute = True
        End With
End Function
Maintenant, si je peux me permettre, je te proposerais une autre phrase dans laquelle effectuer ta recherche...
Citation:
"Si la tata de mon tonton est ma mémé c'est parce que la maman de mon papa s'est remariée avec mon pépé qui était le papa de mon tonton."
Ce coup-ci, bonne nuit.
A+

PS - J'ai oublié de te dire que tu seras limité à 9999 mots dans ton tableau. Tu vas pouvoir faire le tour de la famille
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2007, 10h07   #20
Invité de passage
 
Inscription : novembre 2007
Messages : 27
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 27
Points : 4
Points : 4
Bonjour,

Mort de rire Ben oui, mais je ne plagie pas Bénureau, moââââââ :o))))) (C'est bien tiré d'une chanson de Bénureau, non ?)

Blague à part :
1) Oui, j'avais besoin que la croix apparaisse dans la colonne de droite.
2) Je viens de tester (avec la deuxième version) et ça marche à la PERFECTION.

Je te remercie vivement de ton aide. Ce programme va m'être EXTRÊMEMENT UTILE, et la limite de 9999 entrées n'en sera pas une pour moi, car je n'aurai jamais plus d'une cinquantaine de termes à traiter.

J'espère que tous les utilisateurs de ce forum auront la chance de tomber sur un membre aussi serviable et efficace.

Une fois encore, mille merci.

Bien cordialement,

Lionel
3dfroggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h03.


 
 
 
 
Partenaires

Hébergement Web