Filtrer deux colonnes et remplir une troisième colonne

Ferrand, je me permets de commenter parce que ça me titille depuis hier. Tout ça n'est qu'un malentendu et on tourne en rond J'espère ne pas avoir fait de faute.

Sinon, merci pour la remarque

@tagnithamousi regarde les commentaires et tu comprendras que ça correspond exactement à tes desiderataes. Et tu pourras en plus l'expliquer à qui de droit.

Sub okko()
    Dim n&, i&, j%, v 'Déclaire n, i, j comme Integer, v comme variant
    v = Split("KO;CAISSE D'EPARGNE;EPARGNE;FRANCE", ";") 'Créé un tableau à une dimension de longueur 4. "KO" est la valeur par défaut qui s'inscrira si les conditions plus bas ne sont pas réunies
    With Worksheets("Test de Notation")
        n = .Cells(.Rows.Count, 18).End(xlUp).Row 'n = Dernière ligne non-vide de la colonne 18
        For i = 3 To n 'Boucle sur les lignes, de la ligne 3 à la dernière non-vide
            If VarType(.Cells(i, 18)) = 8 Then 'Si la cellule contient du texte (vartype 8 = vbstring = string)
                For j = 1 To 3 'Boucle sur les différentes valeurs du tableau créé plus haut
                    If Trim(UCase(.Cells(i, 18))) = v(j) Then 'Trim permet de supprimer les espaces superfuls. Ucase passe la chaine en majuscule
                        If .Cells(i, 16) Like "[CP]*" Then 'Si la cellule de la colonne 16 ressemble à "[CP]*"
                            If Not .Cells(i, 16) Like "*CX" And _ 'De plus, si cette cellule ne ressemble pas à "*CX" et à "*DX", alors on remplace la valeur "KO" mise par défaut en début de code par "OK" et on quitte la boucle "Exit For"
                             Not .Cells(i, 16) Like "*DX" Then
                                v(0) = "OK"
                                Exit For 
                            End If
                        End If
                    End If
                Next j
            End If
            .Cells(i, 19) = v(0) 'On inscrit la valeur de v(0), "KO" par défaut ou "OK" si le code a trouvé une correspondance, dans la cellule de la même ligne que la (non)correspondance, en colonne 19
            v(0) = "KO" 'On réinitialise la variable à "KO"
        Next i
    End With
End Sub

Quand un code n'est pas clair pour toi, n'hesite pas à le faire tourner manuellement grâce à la touche F8, qui execute le code ligne-après ligne. La fonction debug.print et la fenêtre d'execution (dans le menu "affichage") permet de contrôler pas mal de choses.

merciii beaucoup pour vos efforts, mais je suis triste de vous dire que vraiment ça ne marche pas , je trouve des cas en KO et qui ont un code C1 DX par exemple .

Upload un fichier anonymisé.

Rien à rajouter

Il y a peut-être à expliquer plus l'usage du "modèle" de chaîne avec l'opérateur Like, assez méconnu.

"[CP]*" désigne toute chaîne commençant par C ou P (la mise entre crochets concerne un seul caractère et au début du modèle indique que seule la première lettre est concernée.

Si une seule lettre avait été concernée à la fin, ou deux lettres mais séparément, cela aurait pu être regroupé dans un même modèle pour tout tester simultanément (on indique les caractère qui doivent être absent en les faisant précéder d'un point d'exclamation), mais un couple exigeait un test séparé.


merciii beaucoup pour vos efforts, mais je suis triste de vous dire que vraiment ça ne marche pas , je trouve des cas en KO et qui ont un code C1 DX par exemple .

Tu es sûr de ce que tu dis ? Les codes se terminant par CX et DX selon tes indications devaient être rejetés. Donc rien de plus normal de les trouver KO !

6classeur-test.xlsx (15.12 Ko)

voici un fichier que j'ai modifie un peu car je ne peux pas publier les vrai info, j'ai mis l'essentiel et un test manuel pour vous expliquer ce que je dois faire (j'ai repris tous les cas possibles)

j'ai déjà converti en format standard

Merci beaucoup pour votre aide

J'ai relu le début du sujet. Il y a je crois un problème de langage !

Losque tu dis "je dois prendre...", implicitement on interprète que ce qui est à prendre (à retenir, à sélectionner...) c'est ce qui est "OK".

Ensuite lorsque tu dis que tu dois mettre "KO" ou "OK", bé oui ! ce qui n'est pas "OK" est "KO"...

Il faut reformuler exactement les conditions

(Bon j'ai mon navigateur qui se bloque !

si vous essayez ma macro vous allez trouver que ça fonctionne

et ça bug au niveau du #N/A et FRANCE

j'ai fait un test et j'ai enlevé le #N/A et FRANCE

ça fonctionne très bien et pas de bug

je veux juste une solution pour ça

Merci beaucoup

(retour)

Si l'inversion est bien complète (mais à confirmer, je me méfie toujours), mon code fonctionne parfaitement : il suffit donc de changer "OK" en "KO" et "KO" en "OK" , il y en a 3 au total dans la macro.


A tester tout de même sur un échantillon plus représentatif, car là il n'y a que des "KO".

Merci beaucoup je vais faire mes tests sur mes donnes

pouvez vous juste m'expliquer pk vous avez fait la boucle J de 1 to 3 , pk 3 je n'ai pas compris l'idée de creer un tableu avec la variable V

mercii


est ce que vous pouvez me dire aussi qu'est ce qui ne va pas avec mon code ?

pourquoi il ne reconnait pas ces cas spécifiques?

Parce qu'on n'a pas à faire 3 conditions en indiquant chaque nom entre guillemets, c'est la boucle qui le fait ; on n'a écrit les noms à la suite que dans la définition de la variable, en une seule chaîne qu'on splitte pour la transformer en tableau. C'est moins long à écrire, et en y incluant le "OK", on n'a plus qu'à changer cette variable au passage quand les conditions sont satisfaites. A la fin on affecte systématiquement la valeur de v(0) qui contient soit "OK" soit "KO" si elle a été modifiée en cours de macro, mais de toute façon la bonne valeur (et on la réinitialise pour le tour suivant).

Cordialement


Parce que #NA! est une valeur d'erreur, soit un type de donnée spécifique. Quand tu testes si = "EPARGNE", VBA te dit non, moi je n'ai pas une chaîne, incopatibilité ! De même la comparaison est sensible à la casse par défaut. Il faudrait donc avoir mis dans ton module Option Compare Text pour la modifier, mais cela ne règle pas le problème des espaces intempestives qui auraient pu fausser la comparaison. Donc en testant d'abord si la cellule contient une chaîne, puis en comparant après suppression des espaces éventuels et mise en majuscules, on évite ces écueils.

Ça ne couvre encore pas toutes les possibilités d'écarts, mais cela en fait déjà pas mal et c'est les plus fréquentes.

MFerrand a écrit :

Parce qu'on n'a pas à faire 3 conditions en indiquant chaque nom entre guillemets, c'est la boucle qui le fait ; on n'a écrit les noms à la suite que dans la définition de la variable, en une seule chaîne qu'on splitte pour la transformer en tableau. C'est moins long à écrire, et en y incluant le "OK", on n'a plus qu'à changer cette variable au passage quand les conditions sont satisfaites. A la fin on affecte systématiquement la valeur de v(0) qui contient soit "OK" soit "KO" si elle a été modifiée en cours de macro, mais de toute façon la bonne valeur (et on la réinitialise pour le tour suivant).

Cordialement


Parce que #NA! est une valeur d'erreur, soit un type de donnée spécifique. Quand tu testes si = "EPARGNE", VBA te dit non, moi je n'ai pas une chaîne, incopatibilité ! De même la comparaison est sensible à la casse par défaut. Il faudrait donc avoir mis dans ton module Option Compare Text pour la modifier, mais cela ne règle pas le problème des espaces intempestives qui auraient pu fausser la comparaison. Donc en testant d'abord si la cellule contient une chaîne, puis en comparant après suppression des espaces éventuels et mise en majuscules, on évite ces écueils.

Ça ne couvre encore pas toutes les possibilités d'écarts, mais cela en fait déjà pas mal et c'est les plus fréquentes.

mauvaise nouvelle ça ne marche pas pour tous les cas : je trouve toujours des cas C1 DX P1 CX en KO (normalement meme si ça commence par P ou C ils sont en ok par ce qu'ils se terminent par CX et DX

Ça c'est une condition que tu n'as pas formulée. Relis ton premier post.

Heu non ? je vais vérifier.

Après vérif. la condition est : si ils commencent par C ou P, ils sont KO si ils ne se terminent pas par CX ou DX

CxxxCX =KO

CxxxDX =KO

PxxxCX =KO

PxxxDX =KO

CxxxxX =OK

PxxxxX =OK

AxxxCX =OK

AxxxDX =OK

Et si ce n'est pas CAISSE D'EPARGNE, EPARGNE ou FRANCE, c'es OK quel que soit le code.

non je l'ai bien expliqué dans mon premier poste et meme dans le fichier que je vous ai envoye j'ai mis un commentaire

si caisse d'epargne ou epargne ou france je mets KO si la colonne code = C ... ou P... et ok pour tout l reste ( exemple si g cas epargne et que le code = C..DX je mets ok )

dans le fichier que je vous ai envoyé g fait l'operation manuellement et lorsque vous filtrez et vous metez KO vous allez trouver que tous les codes commencent par P ou C et ne se termine PAS par dx ou cx

je pense que le problème des espaces et des chaines de caractère se pose aussi dans la colonne des codes

MFerrand a écrit :

Ça c'est une condition que tu n'as pas formulée. Relis ton premier post.

Heu non ? je vais vérifier.

Après vérif. la condition est : si ils commencent par C ou P, ils sont KO si ils ne se terminent pas par CX ou DX

CxxxCX =KO

CxxxDX =KO

PxxxCX =KO

PxxxDX =KO

CxxxxX =OK

PxxxxX =OK

AxxxCX =OK

AxxxDX =OK

Et si ce n'est pas CAISSE D'EPARGNE, EPARGNE ou FRANCE, c'es OK quel que soit le code.

si caisse Epargne ou épargne ou france :

Cxxx =KO

Cxxx =KO

Pxxx=KO

Pxxx =KO

PxxDX=OK

AxxDX =OK

ok si autre qe caisse d'epargne ou épargne ou france

please aidez moi je ne trouve plus de solution à ce problème

Confirmons les conditions :

* pour ces trois cas ( "CAISSE D'EPARGNE" et "FRANCE " et "EPARGNE" ) je dois prendre dans la colonne Range("P" & i) le code qui commence uniquement par C ou P et qui Ne se términe pas par DX ou CX

* si c'est le cas je dois ecrire dans la Cells(i, 19) : KO , et ok pour tous les autre cas .

1)si caisseépargne ou epargne ou france :

  • --------------------------------------2)si code commence par C ou P ET ne se termine pas par CX ou DX : =>KO
  • --------------------------------------------------2bis) si code ne commence pas par C ou P : =>OK
  • -------------------------------------------------2ter) si code commence par C ou P ET se termine par CX ou DX : =>OK

2bis) si autre que caisseépargne ou epargne ou france : =>OK

C'est ainsi que se traduisent tes conditions.

Evidemment si un problème d'espaces peut aussi se poser dans code, il faut supprimer ces espaces lors de l'appel de la cellule.

Remplacer .Cells(i, 16) par : Trim(.Cells(i, 16)) [3 fois]

MFerrand a écrit :

Confirmons les conditions :

* pour ces trois cas ( "CAISSE D'EPARGNE" et "FRANCE " et "EPARGNE" ) je dois prendre dans la colonne Range("P" & i) le code qui commence uniquement par C ou P et qui Ne se términe pas par DX ou CX

* si c'est le cas je dois ecrire dans la Cells(i, 19) : KO , et ok pour tous les autre cas .

1)si caisseépargne ou epargne ou france :

  • --------------------------------------2)si code commence par C ou P ET ne se termine pas par CX ou DX : =>KO
  • --------------------------------------------------2bis) si code ne commence pas par C ou P : =>OK
  • -------------------------------------------------2ter) si code commence par C ou P ET se termine par CX ou DX : =>OK

2bis) si autre que caisseépargne ou epargne ou france : =>OK

C'est ainsi que se traduisent tes conditions.

Evidemment si un problème d'espaces peut aussi se poser dans code, il faut supprimer ces espaces lors de l'appel de la cellule.

Remplacer .Cells(i, 16) par : Trim(.Cells(i, 16)) [3 fois]

ça fonctioooooooooone merci beaucoup

pouvez vous m'expliquer la diffrence entre mettre le Tim trois dans la boucle

et le mettre une fois au debut de la boucle (car c'est ce que j'ai fait en premier et ça n'a pas marché )?

Il faut le faire à chaque appel de la cellule.

Ou alors mettre la valeur "trimée" dans une variable et utiliser la variable.

Je vous remercie beaucoup pour votre aide et votre disponibilité

bonne contnuation

Bonne continuationn à toi.

Rechercher des sujets similaires à "filtrer deux colonnes remplir troisieme colonne"