VBA - Lister sans doublon conditionnel

Bonjour à tous,

J'ai à nouveau un petit problème que je n'arrive pas à résoudre.

J'ai un onglet sur lequel j'ai 4 colonnes d'utilisées.

  • colonne A: liste avec deux choix possible (True, False)
  • colonne B: gamme de produits (ex: reactif, calibrant, controle)
  • colonne C: référence du produit
  • colonne D: nom de la molécule

Dans cet onglet je peux avoir plusieurs référence de réactifs que sont utilisables pour une molécule donnée. Je souhaiterai dans un premier temps, au niveau de la colonne A ne pas pouvoir avoir plusieurs fois la valeur "True" pour x lignes de références différentes ayant la même molécule dans la colonne D. Par contre je pourrai avoir plusieurs fois la valeur "False".

ex:

True|réactif|12345|molecule A

True|réactif|23322|molecule A

False|réactif|34322|molecule A

False|réactif|33322|molecule B

Ne doit pas être faisable.

Par contre

True|réactif|12345|molecule A

False|réactif|23322|molecule A

False|réactif|34322|molecule A

False|réactif|33322|molecule B

ou

False|réactif|12345|molecule A

False|réactif|23322|molecule A

False|réactif|34322|molecule A

False|réactif|33322|molecule B

doivent être des combinaisons faisables.

Une fois ce point résolu. Je souhaiterai lister sur un autre onglet les noms de molécules pour lesquelles on à la colonne B qui correspond à "réactif" et la colonne A à "True".

Je ne vois pas trop comment m'y prendre pour faire cela. Pour lister sur l'autre onglet, je devrai faire une boucle avec un IF en double condition mais pour la première partie de mon problème je sèche un peu.

Et bien sûr le but serait se mettre cela sur une sub workbook_Change de mon onglet pour que ce soit dynamique.

Merci pour votre aide


Dans mon fichier ci-joint, je voudrai donc:

* Pour la molécule A, ne pouvoir avoir qu'un seul TRUE de possible sur les lignes ayant "Réactif" (pas cette contraite si calibrant ou controle)

* puis lister les molécule pour lesquel on a "TRUE" et "réactif", du coup sur mon deuxième onglet ne lister que:

  • molecule A
  • molecule C
15book1.xlsm (9.02 Ko)

bonjour,

une solution possible

Private Sub Worksheet_Change(ByVal Target As Range)
'vérifie si ligne introduite n'est pas un doublon et la supprime le cas échéant
    If Target.Count > 1 Then Exit Sub
    With Target.EntireRow
        If Application.WorksheetFunction.CountBlank(.Range("A1:D1")) = 0 Then    ' lancer la macro si toutes les colonnes de la ligne sont remplies
            Application.EnableEvents = False
            If .Range("A1") = True And .Range("B1") = "réactif" Then
                For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
                    If i <> Target.Row And .Range("D1") = Cells(i, 4) And .Range("B1") = Cells(i, 2) Then .Delete shift:=xlUp: Exit For
                Next i
            End If
            Application.EnableEvents = True
        End If
    End With
    listereactif
End Sub
Sub listereactif()
'liste les reactifs avec choix =true
    Sheets("sheet2").Cells.Delete
    Cells(1, 1).Resize(1, 4).Copy Sheets("sheet2").Cells(1, 1)
    For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
        If Cells(i, 1) = True And Cells(i, 2) = "réactif" Then
            Cells(i, 1).Resize(1, 4).Copy Sheets("sheet2").Cells(Rows.Count, 1).End(xlUp).Offset(1)
        End If
    Next i
End Sub
15book1.xlsm (16.09 Ko)

Salut

C'est pas loin de ce que je veux faire mais il y a un bug: si tu essayes de passer un deuxième réactif pour la molécule A en True (pour en avoir 2 donc), cela empêche bien l'ajout du 2eme mais cela supprime une ligne du tableau...

kevlille a écrit :

Salut

C'est pas loin de ce que je veux faire mais il y a un bug: si tu essayes de passer un deuxième réactif pour la molécule A en True (pour en avoir 2 donc), cela empêche bien l'ajout du 2eme mais cela supprime une ligne du tableau...

n'est-ce pas ce que tu as demandé, ne garder qu'une seule combinaison reactif,molecule, vrai ? je n'ai donc pas compris la demande.

Bonjour à tous

Un essai à tester.

Bye !

12book1-v1.xlsm (23.98 Ko)

@gmb: cela ne fonctionne pas comme je voudrais

En fait, il ne faut pas supprimer/effacer de lignes sur le premier onglet. Il faut juste empêcher d'avoir plusieurs fois "True" pour des "reactifs" d'une même molécule. Par contre on peut avoir plusieurs "False" ou UN "True" et des "False".

En fonction de cela, il faudrait lister sur l'onglet 2, les molécules pour lesquels on a un réactif à True.

Est-ce plus clair pour vous?

bonjour,

nouvelle proposition

12book1.xlsm (17.90 Ko)

hello

merci de te pencher sur mon cas

malheureusement cela ne fonctionne pas:

  • j'ai des doublons détectés alors que ce n'est pas le cas (j'ai des doublons détecté sur du false/false)
  • et le listing sur l'onglet 2 ne fonctionne pas bien.

J'ai regardé le code vba mais je n'ai pas tout compris...

En fait:

Pour une molécule donné, si c'est une ligne "réactif", je peut mettre "True" si il n'y a pas d'autres lignes "réactif" de la même molécule sur "True". Sinon on met "False".

Les doublons/triplicate ect... sur "False" sont possibles pour des réactifs d'une même molécule, par contre on ne peut avoir qu'un seul "True" (ou aucun "True") pour chaque ligne de "réactifs" d'une même molécule.

Par contre pour des lignes "calibrant" et "contrôles" on peut faire ce que l'on veut.

kevlille a écrit :

Il faut juste empêcher d'avoir plusieurs fois "True" pour des "reactifs" d'une même molécule.

Nouvelle version à tester.

En fonction de cela, il faudrait lister sur l'onglet 2, les molécules pour lesquels on a un réactif à True.

Mais ... c'est déjà le cas ! Non ?

Bye !

17book1-v2.xlsm (25.72 Ko)

@gmb:

oui le listage sur le second onglet fonctionne bien (je rappelais juste tout ce que je voulais faire).

par contre dans ton exemple, je n'arrive pas à mettre la premiere ligne sur "False" pour ne pas lister la lister sur l'autre onglet. Il me met que cette combinaison existe déjà.... Or sur le False il n'y a pas de besoin de verif. Il faut uniquement des True uniques.

J'espère être clair...

J'ai essayer de comprendre ton code mais je patauge un peu... je ne maitrise pas les Dictionnary et leur fonctionnement par exemple

Nouvelle version

Bye !

14book1-v3.xlsm (26.96 Ko)

Tu vas commencer à me trouver lourd mais cela ne fonctionne toujours pas.

Dans ta derniere version, on peut mettre plusieurs True sur le reactif de la molécule A par exemple.... Normalement c'est 1 maxi. De plus ça plante dans ce cas sur l'onglet 2 (runtime error '9').

Pourrais-tu detailler ton code que je comprenne bien son fonctionnement?

A l'avance merci

Bon j'ai modifier Vrai/Faux par True/False et il y a du mieux.

Maintenant je ne peux mettre qu'un seul True par réactif d'une même molécule mais si je mets tout les réactifs à False, il me reste une ligne sur l'onglet 2....

Le même fichier avec macro commentée.

Le problème vient peut-être des "VRAI" et "FAUX" qui s'affichent alors qu'il y a des "True" et "False" dans la définitions des listes déroulantes.

En mettant "Vrai" et "Faux" dans les listes déroulantes, tout semble bien se passer sur mon PC.

Bye !

12book1-v4.xlsm (28.33 Ko)

hello

cela fonctionne par contre j'ai une erreur runtime '9' lorsque je mets tous les les reactifs sur "faux" (donc normalement rien de lister sur l'onglet 2) et que je clique sur cet onglet 2

ça vient de cette ligne:

.Range("A2").Resize(UBound(tabloR, 2), 4) = Application.Transpose(tabloR)

Bonjour

OK !

Nouvelle version.

Bye !

15book1-v5.xlsm (28.37 Ko)

Bonsoir,

Toujours pas lol... sur cette version l'onglet 2 ne se met pas à jour.

désolé

kevlille a écrit :

Toujours pas lol... sur cette version l'onglet 2 ne se met pas à jour.

C'est curieux. Sur mon PC cela a l'air de bien fonctionner.

Alors, je ne vois pas.

Désolé !

Bye !

je vais regarder cela de plus prés... probablement un problème de mon côté (je suis sous Excel 2016 en version US)

Rechercher des sujets similaires à "vba lister doublon conditionnel"