[Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer)

Pierre F.

XLDnaute Nouveau
Bonjour à toutes et tous.
Je suis entrain de tenter de créer un petit jeu de vocabulaire.
B4:B17 : des définitions
E4:E17 : 14 mots (les réponses)
K4:K17 : vides mais il faut les compléter (trouver les mots)
P4:p29 : une liste de 25 mots dont tous ceux de la colonne E mais pas dans le même ordre (colonne qui sera cachée)
B21: les mêmes mots qu'en colonne P, mais sur une ligne et séparés par des virgules.

Je souhaite que chaque fois qu'on entre un mot en colonne K, il soit testé
a) pour voir si c'est le bon (je sais faire)
b) pour voir s'il appartient à la colonne P; si c'est le cas, j'aimerais qu'il soit supprimé de la colonne P et que la liste de B21 soit "mise à jour"

J'ai fait une macro dans un module:
Sub checkliste()
for I=4 to 17
test=cells(i,11)
for j= 4 to 29
if cells(j,16)=test then cells(j,16)=""
next j
next i

Suit une autre macro qui trie la colonne P et qui la concatène pour la replacer en B21 (celle-là fonctionne)

End sub


Cette macro ne fonctionne pas si je la mets dans le code de la feuille, ou plutôt, elle ralentit tout le travail.

Merci de m'aider un peu (petit fichier en pj)
Pierre F.
 

Pièces jointes

  • TestAppliLexique.xls
    23.5 KB · Affichages: 73
Dernière édition:

Modeste

XLDnaute Barbatruc
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

Bonjour,

Ouvrir un second fil n'était pas une bonne idée. Tu serais aimable pour ceux qui risquent de chercher d'y faire le lien avec ce fil-ci.

A quel niveau faut-il tenir compte de la casse? Dans la comparaison entre les valeurs des colonnes K et E? Ou alors faut-il aussi veiller à ne supprimer le terme, en colonne P que si la casse est identique?

Je présume que c'est plutôt le second cas, puisque "Target = Target.Offset(0, -6)" vérifie déjà la correspondance exacte entre les deux termes. Si c'est bien le second cas de figure, alors Papou-net a donné une piste avec son
Code:
Set Test = Range("P:P").Find(Cel.Value, LookIn:=xlValues, lookat:=xlWhole)
... auquel il suffit d'ajouter un MatchCase:=True

Teste donc avec
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub 'on sort si plusieurs cellules modifiées
    If Not Intersect(Target, [K4:K17]) Is Nothing Then
        If Target = vbNullString Then Exit Sub
        If Target = Target.Offset(0, -6) Then
            Set Test = Range("P:P").Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=True)
            If Not Test Is Nothing Then Test.ClearContents
        End If
    End If
 End Sub

Pas eu le temps de tester tous les cas de figure, il y aura peut-être des modifs à faire, en fonction de ce que tu observeras!?
 

Pierre F.

XLDnaute Nouveau
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

Bonjour,

Ouvrir un second fil n'était pas une bonne idée...

Oui... mais :) J'ai, dans un premier temps, allongé ce fil. Puis, je me suis dit que ma question n'avait plus la tête du fil comme objet et que le sujet était très différent.
Mais promis, j'le referai plus.


A quel niveau faut-il tenir compte de la casse? Dans la comparaison entre les valeurs des colonnes K et E? Ou alors faut-il aussi veiller à ne supprimer le terme, en colonne P que si la casse est identique?

En fait, je viens de tester le code (ancienne et nouvelle version) et constate qu'il ne tient pas du tout compte de la casse.
Target = Target.Offset(0, -6)" ne teste pas la correspondance "exacte" (SDF = sdf; Tente = tente) entre les deux termes.
Les accents passent bien, c'est juste les majuscules.

Merci de rejeter un coup d’œil.

Pierre F.
 

Si...

XLDnaute Barbatruc
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

salut

Oui... mais :)
Target = Target.Offset(0, -6)" ne teste pas la correspondance "exacte" (SDF = sdf; Tente = tente) entre les deux termes.
:confused:
Autre proposition
Code:
Private Sub Worksheet_Change(ByVal R As Range)
  If R.Count > 1 Then Exit Sub
  If Intersect(R, [K4:K17]) Is Nothing Or R = "" Then Exit Sub
  Dim Test As Range
  If R = R(1, -5) Then
    Set Test = Columns(16).Find(R, , , MatchCase:=True)
    If Test Is Nothing Then Exit Sub
    Test.ClearContents
    Columns(16).Sort [P4], 1
    [B21] = Replace([B21], ", " & R, "")
  End If
End Sub
 

Pièces jointes

  • Si...FindCoupe.xls
    28.5 KB · Affichages: 51

Papou-net

XLDnaute Barbatruc
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

Bonsoir Pierre T., bonsoir Modeste,

Peut-être comme ceci :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Count > 1 Then Exit Sub 'on sort si plusieurs cellules modifiées
  If Not Intersect(Target, [K4:K17]) Is Nothing Then
    If Target = vbNullString Then Exit Sub
    Application.EnableEvents = False
    If UCase(Target) = UCase(Target.Offset(0, -6)) Then
      Target = Target.Offset(0, -6)
      Set Test = Range("P:P").Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole)
      If Not Test Is Nothing Then Test.ClearContents
    End If
    Application.EnableEvents = False
  End If
 End Sub

Cordialement.

Edit : bonsoir à toi aussi, Si...
 

Modeste

XLDnaute Barbatruc
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

Bonsoir,

J'aurais tendance à dire "Grrrr!"
En fait, je viens de tester le code (ancienne et nouvelle version) et constate qu'il ne tient pas du tout compte de la casse.
Target = Target.Offset(0, -6)" ne teste pas la correspondance "exacte" (SDF = sdf; Tente = tente) entre les deux termes.
J'aurais tendance à dire "Grrrr!" Je viens de re-tester, moi aussi, sur ton fichier de départ et avec le dernier code fourni:
- si j'indique "Allonge" en K5, rien ne se passe puisque K5 est différent de E5 ... correct?
- si j'encode "Blousées" (avec première en majuscule!) en K5, rien ne se passe non plus, puisque l'extrait de code que tu cites teste bien la correspondance exacte (sur ma machine, en tout cas!)
- si je saisis "blousées" dans la même cellule, Excel détecte bien la correspondance des 2 termes! Si la colonne P contient "blouSées", il n'est pas effacé. Si "blousées" est bien présent en colonne P, le mot est effacé!

Qu'ai-je donc loupé, dans l'histoire!? :eek:

Bonsoir à vous deux, Si... et Papou-net :) je vais prendre une petite douche :)
 

Pierre F.

XLDnaute Nouveau
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

J'aurais tendance à dire "Grrrr!"J'aurais tendance à dire "Grrrr!"

Je comprends tout à fait; pour ma part, je me suis frappé le front et je me suis dit: "Quel c..!" (en toutes lettres :).
Le dernier code fonctionne parfaitement et correspond à ce que j'ai souhaité avec même en cadeau la mise à jour de la cellule B21

- si j'indique "Allonge" en K5, rien ne se passe puisque K5 est différent de E5 ... correct?
- si j'encode "Blousées" (avec première en majuscule!) en K5, rien ne se passe non plus, puisque l'extrait de code que tu cites teste bien la correspondance exacte (sur ma machine, en tout cas!)
- si je saisis "blousées" dans la même cellule, Excel détecte bien la correspondance des 2 termes! Si la colonne P contient "blouSées", il n'est pas effacé. Si "blousées" est bien présent en colonne P, le mot est effacé!

Je fais les mêmes constats et je m'en excuse. J'ai foiré.

Qu'ai-je donc loupé, dans l'histoire!? :eek:

Rien du tout.
Mais... :)
J'ai quand même trouvé pourquoi j'avais l'impression que ça ne fonctionnait pas tout à fait bien.
Sur mon fichier démo du début du fil, on peut voir que lorsqu'une réponse est juste, la case de la colonne K passe au vert. Les réponses fausses ou absentes restent ocre. Dans mon fichier "final" j'ai même des points qui s'affichent dans la colonne L.
Et je voyais les bonnes réponses s'éliminer de P et la cases passer au vert, tout était pour le mieux dans le meilleur des mondes.
Jusqu'au coup de la majuscule; je l'ai tapée en minuscules... et la case a passé au vert, le point s'est affiché en L... et le mot est resté dans la liste!! --> ça va pas, faut revoir, qu'est-ce qui se passe...
Si les cases passent au vert, c'est une MFC qui fait ça simplement en comparant les cellules de K et de E; le point qui s'affiche ou pas est simplement : =si (E4=K4;"1";"--").
C'est donc la MFC et le teste basique qui ne tiennent pas compte des majuscules!!!! Eurêka et désolé de vous avoir fait turbiner pour rien...

Mais j'ai quand même une question :)
Comment faire respecter la casse à une formule MFC ?
Question subsidiaire: même questions pour =si (E4=K4;"1";"--").

Merci encore pour vos compétences immenses et la patience que vous avez à supporter des "bracaillons" * comme moi.

Pierre F.

* bracaillon (franpitan) - Le mot du jour - Forum Babel
 

Modeste

XLDnaute Barbatruc
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

Bonjour,

"bracaillon", je ne sais pas, mais ce qui est certainement une bonne idée, c'est de prendre le temps de vérifier et ne pas "sauter aux conclusions" trop vite (surtout si plusieurs personnes s'y mettent le même jour :eek:)

Merci encore pour vos compétences immenses et la patience que vous avez à supporter
Je présume que le 'vos' et le 'vous' englobent -dans les remerciements- le "retour" Papou-net et le passage de Si... (tu noteras au passage que chacun d'eux a proposé des pistes pour la gestion des valeurs concaténées en B21)

Pour ta MFC sur la plage K4:K17, tu peux modifier la règle de la MFC en utilisant une formule:
Code:
=EXACT($E4;$K4)
pour le vert

Code:
=NON(EXACT($E4;$K4))
... pour les autres
 

Pierre F.

XLDnaute Nouveau
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

Autre proposition
Code:
Private Sub Worksheet_Change(ByVal R As Range)
  If R.Count > 1 Then Exit Sub
  If Intersect(R, [K4:K17]) Is Nothing Or R = "" Then Exit Sub
  Dim Test As Range
  If R = R(1, -5) Then
    Set Test = Columns(16).Find(R, , , MatchCase:=True)
    If Test Is Nothing Then Exit Sub
    Test.ClearContents
    Columns(16).Sort [P4], 1
    [B21] = Replace([B21], ", " & R, "")
  End If
End Sub


Bonjour et merci pour cette version. J'aime bien le fait que B21 soit géré dans le même temps que P.
Questions:
Au départ, le premier mot de P est en P4; dès la première réponse donnée, toute la liste P remonte vers P1; c'est du détail mais est-il possible laisser toujours le 1er mot en P4
2e détail: le premier mot de liste de B21, s'il est une bonne réponse, ne s'efface pas en B21, mais en P seulement. (voir la pj)

Merci.
Pierre F.
 

Pierre F.

XLDnaute Nouveau
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

Je présume que le 'vos' et le 'vous' englobent -dans les remerciements- le "retour" Papou-net et le passage de Si... (tu noteras au passage que chacun d'eux a proposé des pistes pour la gestion des valeurs concaténées en B21)

Tu présumes très bien:)
La version de Si... gérant B21 me plaît effectivement beaucoup.

Merci pour les deux petits codes.

Pierre F.
 

Si...

XLDnaute Barbatruc
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

salut

...
J'aurais tendance à dire "Grrrr!"
... je vais prendre une petite douche

@ Modeste ;): lapsus calami(té !) ? Serait-ce « Mdr » ou « Brrr » (pour l’eau froide de la douche) ?

Pour aller plus vite j’ai traité la colonne P en entier. Si… tu veux rester en 4 avec B21 mieux traitée* , remplace le code par

Code:
Private Sub Worksheet_Change(ByVal R As Range)
  If R.Count > 1 Then Exit Sub
  If Intersect(R, [K4:K17]) Is Nothing Or R = "" Then Exit Sub
  Dim Test As Range, T, St As String
  If R = R(1, -5) Then
    Set Test = Columns(16).Find(R, , , MatchCase:=True)
    If Test Is Nothing Then Exit Sub
    Test.ClearContents
    Range("P4", [P65536].End(xlUp)).Sort [P4], 1
    T = Split([B1], ",")
    If UBound(T) = -1 Then St = R & ", " Else St = ", " & R
    [B21] = Replace([B21], St, "")
    'supprimer la ligne suivante Si... pas nécessaire 
     Application.EnableEvents = False: R = "": Application.EnableEvents = True
   End If
End Sub
salut Papou-net :)
* sans garantie : je ne sais pas comment et par quoi cette cellule est alimentée !
 

Pierre F.

XLDnaute Nouveau
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

Pour aller plus vite j’ai traité la colonne P en entier. Si… tu veux rester en 4 avec B21 mieux traitée* , remplace le code par..

Merci; J'ai testé cette nouvelle version et ça fonctionne comme je le souhaite, c'est magnifique (j'ai supprimé la dernière ligne). Je vais encore la tester ce soir, cette nuit et demain :) pour être sûr de ne pas trouver un cas qui coince.

* sans garantie : je ne sais pas comment et par quoi cette cellule est alimentée !

Pour P, c'est juste une liste mots copiée (valeur seulement) d'une autre feuille
Pour B21, c'est la concaténation des cellules non vides de P avec:

For i = 4 To HauteurColP
If (Cells(i, 16) <> "") Then reponses = reponses + ", " + Cells(i, 16)
Next i

Mille mercis.

Cordialement,
Pierre F.
 

Pierre F.

XLDnaute Nouveau
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

Hello!

J'ai donc testé et retesté... et, surtout implanté ta procédure dans mon projet.
Je ne comprends pas:
Dans l'exemple que tu m'as envoyé hier, tout fonctionne à la perfection.
Dès que je l'implante dans mon projet, je retrouve un petit défaut, à savoir: le premier mot de la liste de B21 ne s'élimine pas lorsqu'il devrait(Ecris dans la colonne K et juste; il s'élimine bien de la colonne P, mais reste obstinément en B21)

Quel élément dans ma feuille ou de mes macros (c'est une usine à gaz :) pourrait gêner ton code ??

Merci.

Autre question: est-il possible d'intégrer dans ta procédure un compteur qui s'incrémenterait à chaque tentative de réponse?
Si oui, comment?
Si non, tant pis

Merci.

Cordialement,
Pierre F.

PS: je joins une version allégée de mon projet (3.8 Mo!!) http://cjoint.com/?0BCp6TrS9Vl
 

Si...

XLDnaute Barbatruc
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

salut

avec le premier fichier, j’avais déjà un problème que j’avais contourné (inhabituellement) par
If UBound(T) = -1 Then St = R & ", " Else St = ", " & R

Dans le dernier fichier (qui doit aussi être corrompu) il y a une erreur
T = Split([B21], ",") et non T = Split([B1], ",")
Et de plus
Code:
If UBound(T) = -1 Then St = R & ", " Else St = ", " & R
doit être remplacé logiquement par
Code:
   If T(0)=R  Then St = R & ", " Else St = ", " & R

Remarque : tu as trop de .Select, tu compliques avec la sauvegarde du choix de la première liste et je ne vois pas ce qui provoque les autres erreurs amenant même le blocage l'application (je travaille avec Excel 2010) !
 

Pierre F.

XLDnaute Nouveau
Re : [Résolu]Macro événementielle pour trouver doublons (sans forcément les supprimer

doit être remplacé logiquement par
Code:
   If T(0)=R  Then St = R & ", " Else St = ", " & R

Merci pour ces corrections que j'aurais bien été incapable de trouver. Le premier élément de la liste reste toutefois "inamovible" :)

Remarque : tu as trop de .Select, tu compliques avec la sauvegarde du choix de la première liste et je ne vois pas ce qui provoque les autres erreurs amenant même le blocage l'application (je travaille avec Excel 2010) !

Oui; par quoi puis-je remplacer ces .Select ? Mon niveau Excel est rudimentaire.

Merci de t'être penché sur cette "usine à gaz" !

Cordialement,
Pierre F.
 

Discussions similaires

Réponses
16
Affichages
1 K
Réponses
0
Affichages
153

Statistiques des forums

Discussions
312 240
Messages
2 086 517
Membres
103 239
dernier inscrit
wari