[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:

Papou-net

XLDnaute Barbatruc
Re : Macro événementielle pour trouver doublons (sans forcément les supprimer)

Bonjour Pierre F, et bienvenue à toi ami suisse,

Si j'ai bien compris ta demande, voici une proposition qui devrait y répondre :

Code:
Sub checkliste()
Dim Cel As Range, Test As Range
' La boucle balaie les cellules de la plage K4:K17 qui contiennent des données
For Each Cel In Range("K" & 4 & ":K" & 17).SpecialCells(xlCellTypeConstants)
  ' Recherche de la valeur de la cellule en colonne P
  Set Test = Range("P:P").Find(Cel.Value, LookIn:=xlValues, lookat:=xlWhole)
  ' Si la valeur est trouvée
  If Not Test Is Nothing Then
  ' Si B21 ne contient pas la valeur, on l'ajoute
    If InStr(Range("B21"), Test) = 0 Then Range("B21") = Range("B21") & ", " & Test
    ' Efface la cellule
    Range("P" & Test.Row) = ""
  End If
Next
End Sub
Ne reste plus qu'à y intégrer le tri des cellules.

Cordialement.
 

Pièces jointes

  • Copie de TestAppliLexique.xls
    30.5 KB · Affichages: 60

Modeste

XLDnaute Barbatruc
Re : Macro événementielle pour trouver doublons (sans forcément les supprimer)

Bonjour Pierre F. et bienvenue à toi,

Si j'ai bien compris, essaie le code ci-dessous dans le module de la feuil1:
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [K4:K17]) Is Nothing Then
    If Target = vbNullString Then Exit Sub
    If Application.CountIf([P:P], Target) Then Cells(Application.Match(Target, [P:P], 0), 16).ClearContents
End If
End Sub
... et dis-nous ...

Ouille! salut Papou-net :) pas rafraîchi j'en suis simultanément confus et ravi ;)
 

Pierre F.

XLDnaute Nouveau
Re : Macro événementielle pour trouver doublons (sans forcément les supprimer)

Ouah!!! Du premier coup!
"' La boucle balaie les cellules de la plage K4:K17 ". Ça c'est du balayage!! :)
Mille mercis ça fonctionne parfaitement.

En testant, j'ai constaté qu'une condition supplémentaire doit être posée avant d'effacer la cellule de P. Il faudrait que l'effacement se fasse seulement si la réponse de la colonne K se trouve dans la liste de la colonne E; en fait il faut que le mot tapé dans K réponde à 2 conditions: être dans P et dans E pour valider son effacement de P.
Comment libeller cela?

Autre question: la cellule B21 n'est que la copie finale de la colonne P mise bout à bout. Pourquoi la tester?

Cordialement,
Pierre F.
 

Pierre F.

XLDnaute Nouveau
Re : Macro événementielle pour trouver doublons (sans forcément les supprimer)

PS:
Précision: il faut que l'appartenance à la colonne E soit non seulement avérée, mais sur la même ligne, sinon quand on entre la réponse de la question 1 à la place de la question 5, elle appartient bien aux 2 plages mais ne doit pas être effacée puisque erronée.
Merci.

Pierre F.
 

Modeste

XLDnaute Barbatruc
Re : Macro événementielle pour trouver doublons (sans forcément les supprimer)

Re,

@Papou-net: j'ai dit "ouille" parce que tu es toujours là, planté au milieu du chemin, les mains sur les hanches et moi, ne regardant pas où je mettais les pieds, je me suis pris le coin de ton carquois dans l'oeil :p

@Pierre F: on dit ici que les Suisses prennent leur temps, mais quatre messages en moins de 30 minutes ... ça décoiffe! (... au point que je crains de n'avoir pas tout compris, en dehors du fait que les 3 premiers s'adressaient au papou de Seine-St-Denis :confused:)
Et puis, pour éviter d'autres télescopages (on finirait par nous soupçonner d'y prendre trop de plaisir!), il vaudrait mieux que tu détermines le "canevas" qui te convient le mieux.
 

Pierre F.

XLDnaute Nouveau
Re : Macro événementielle pour trouver doublons (sans forcément les supprimer)

Effectivement, c'est assez confus, désolé.

En fait, ta macro m'a bluffé, tout comme celle de Modeste; elles fonctionnent bien en tenant compte des éléments donnés dans mon premier message.
Mais, y'a toujours un mais :)

En testant différents cas de réponses, j'ai constaté des possibilités d'erreurs qui amènent à la suppression d'un mot de la colonne P alors qu'il ne le devrait pas: si je mets la bonne réponse de la question No 1 dans la case de la réponse de la question 2, cette réponse va être effacée de la liste de P, ce qui n'est pas souhaitable puisque même si le mot appartient bien à la liste, il n'est pas au bon endroit (voir pj en validant la cellule K5).

Ce que je souhaite : avant l'effacement dans la colonne P, voire avant que la macro événementielle ne s'exécute (ou au tout début), les cellules complétées de la plage K soient validées comme étant les mêmes que celles de la plage E (même mot à la même ligne); dans ce cas seulement, les mots de K peuvent être effacés de la liste de P.
En résumé: pour qu'un mot tapé dans K soit effacé de la colonne P, il faut :
1) qu'il appartienne à la plage E4:E14 ET... 2) qu'il soit sur bonne ligne (la même que dans E).

Voilà; je crois que c'est plus clair. Désolé pour le "chenit* " d'avant.

Merci.
Pierre F.

* vaudoiserie plus sympa que "bordel"... mais néanmoins équivalente :))
 

Modeste

XLDnaute Barbatruc
Re : Macro événementielle pour trouver doublons (sans forcément les supprimer)

Re²,

ta macro m'a bluffé, tout comme celle de Modeste
J'ai toujours un peu de mal à comprendre à qui tu t'adresses ;) mais voyons si j'ai compris ... puis s'il y a d'autres cas de figure imprévus:
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 Application.CountIf([P:P], Target) And Target = Target.Offset(0, -6) Then Cells(Application.Match(Target, [P:P], 0), 16).ClearContents
    End If
 End Sub

... et puis tu auras soin de vérifier si je n'ai rien omis?

Bonne soirée à tous ceux qui habitent à l'est ou à l'ouest de la ligne Lausanne - Seine-St-Denis - Belgique!
 

Pierre F.

XLDnaute Nouveau
Re : Macro événementielle pour trouver doublons (sans forcément les supprimer)

Re²,

J'ai toujours un peu de mal à comprendre à qui tu t'adresses ;)

Moi z'aussi :)) !!
Je suis nostalgique des l'ancien forum (usenet) qui permettait une mise en page hiérarchisée via Thunderbird. Mais bon, on se fait à peu près à tout même s'il faut parfois un peu de temps (ah la lenteur de l'Helvète:eek:!).

Ceci dit, j'ai rapidement effectué quelques tests et ces 7 lignes m'époustouflent. C'est nickel même si je ne comprends pas exactement comment chaque ligne fonctionne.
Petite question: le "Target.Offset(0,-6)", c'est la référence à la colonne E (0 --> K, K-6 --> E) ?

Merci.

Re²,
mais voyons si j'ai compris ... puis s'il y a d'autres cas de figure imprévus

Oui, 20/20 en compréhension et c'était pas facile :)

Re²,
... et puis tu auras soin de vérifier si je n'ai rien omis?

Faudra que je teste encore à plus grande échelle (10000 mots), mais jusque là tout va très bien.

Mille mercis encore; je constate que l'esprit et l'efficacité de ce forum sont dignes de celui que je fréquentais jadis.
Je reviendrai un peu plus tard pour confirmer le "Résolu".

Cordialement,
Pierre F.
 

Pierre F.

XLDnaute Nouveau
Re : Macro événementielle pour trouver doublons (sans forcément les supprimer)

Hello;

J'avais bien dit que je reviendrai :)

Petite question au niveau du code que tu m'as donné et qui fonctionne bien:

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 Application.CountIf([P:p], Target) And Target = Target.Offset(0, -6) Then Cells(Application.Match(Target, [P:p], 0), 16).ClearContents
End If
End Sub

Serait-il possible que le contrôle tienne compte de la casse (Majuscules/minuscules) ??

Merci.

Pierre F.
 

Discussions similaires

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

Membres actuellement en ligne

Statistiques des forums

Discussions
312 196
Messages
2 086 101
Membres
103 116
dernier inscrit
kutobi87