Filtrer deux colonnes et remplir une troisième colonne

Bonjour à tous

j'ai besoin de votre aide .

en fait je souhaite faire une sorte de filtre avec ma macro

j'ai des données de plus de 40 000 cellules

Alors j'ai trois colonnes sur lequelles je vais bosser : 1 ) Range("P" & i) 2) Cells(i, 18) 3) Cells(i, 19)

- la colonne :1 ) Range("P" & i) : contient des codes qui commencent tous pas une lettre et se termine soit par une lettre soit par un chiffre ( C1 10 ou P9 2 ou A2 33 ou C1 DX ou P9 CX .......etc )

- la colonne : 2) Cells(i, 18) contient des chainne de caractère :dans chaque celle y a un cas : CAISSE D'EPARGNE" ou "FRANCE " etc ... plusieurs cas (pour information j'ai fait une rechercheV en code vba dans cette colonne : et j'ai des cas ou c'est: #N/A)

- la colonne : 3) Cells(i, 19) est une cellule vide que je vais remplir avc le teste que j'effectue sur les deux autres colonnes (je mets KO ou OK)

Alors ce que je dois faire pour remplir la Cells(i, 19) :

je dois filtrer les cas de la colonne Cells(i, 18) et prendre uniquement :"CAISSE D'EPARGNE" et "FRANCE " et "EPARGNE"

* 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 .

donc dans ma Cells(i, 19) je dois avoir KO pour tous les cas :"CAISSE D'EPARGNE" et "FRANCE " et "EPARGNE" avec un code qui commence par C ou P et qui ne se termine pas par DX ou CX

voici le code que j'ai fait :

lastrow = Worksheets("Test de Notation").Range("R" & Rows.Count).End(xlUp).Row

For i = 3 To lastrow
           cellule = Range("P" & i).Value
            resultat = Mid(cellule, 1, 1)
            resultats = Mid(cellule, 4, 2)

     If Cells(i, 18) = "CAISSE D'EPARGNE " Or Cells(i, 18) = "EPARGNE"  Or Cells(i, 18) = "FRANCE" Then

             If resultat = "C" Then
                   If resultats <> "CX" And resultats <> "DX" Then
                             Cells(i, 19) = "KO"
                      Else
                            Cells(i, 19) = "OK"
                 End If

            End If

   Else
      Cells(i, 19) = "OK"
  End If

Next i

le problème que je rencontre est :

1 - la macro fonctionne pour uniquement deux cas lorsque Cells(i, 18) "CAISSE D'EPARGNE" Or Cells(i, 18) = "EPARGNE " mais pas pour Cells(i, 18) = "FRANCE " lorsque je clique dans mes donnée de base sur le cas "FRANCE" dans ma colonne y a un espace et le mot FRANCE se transforme en minuscule (sachant que j'ai converti tous les donnée en format standard avc mon code )

2- pour les cas ou ça fonctionne ma macro s'arrete à la motié des données et précisement dans le cas ou Cells(i, 18) =#N/A

j'ai un message d'erreur :" incompatiblité de type"

je vous remercie d'avance pour votre aide

cordialement

Je te souhaite bienvenue sur notre forum, j'espére que tu auras une répondre ASAP.

G.A

Hello,

Bon, c'est un peu fouillis tout ça

Peux-tu joindre un fichier, qu'on ait le contexte et de quoi faire des tests ?

N'oublie pas de baliser le code que tu insères dans ton message via les balises

Soyons sympa ! J'avais un moment pour souffler.

Sub okko()
    Dim n&, i&, j%, v
    v = Split("KO;CAISSE D'EPARGNE;EPARGNE;FRANCE", ";")
    With Worksheets("Test de Notation")
        n = .Cells(.Rows.Count, 18).End(xlUp).Row
        For i = 3 To n
            If VarType(.Cells(i, 18)) = 8 Then
                For j = 1 To 3
                    If Trim(UCase(.Cells(i, 18))) = v(j) Then
                        If .Cells(i, 16) Like "[CP]*" Then
                            If Not .Cells(i, 16) Like "*CX" And _
                             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)
            v(0) = "KO"
        Next i
    End With
End Sub

Cordialement

Ferrand

Oh, la belle bleue

SoumZoum a écrit :

Oh, la belle bleue

merci pour la reponse

mais pouvez vous garder mon code et juste l’améliorer et me dire ce que je dois enlever ou rajouter


MFerrand a écrit :

Soyons sympa ! J'avais un moment pour souffler.

Sub okko()
    Dim n&, i&, j%, v
    v = Split("KO;CAISSE D'EPARGNE;EPARGNE;FRANCE", ";")
    With Worksheets("Test de Notation")
        n = .Cells(.Rows.Count, 18).End(xlUp).Row
        For i = 3 To n
            If VarType(.Cells(i, 18)) = 8 Then
                For j = 1 To 3
                    If Trim(UCase(.Cells(i, 18))) = v(j) Then
                        If .Cells(i, 16) Like "[CP]*" Then
                            If Not .Cells(i, 16) Like "*CX" And _
                             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)
            v(0) = "KO"
        Next i
    End With
End Sub

Cordialement

Ferrand

je vous remercie ,mais je comprends pas grand chose

pouvez vous juste améliorer mon code me dire ce que je dois rajouter ou enlever

Autant que je me souviennes depuis que je l'ai écrit, c'est une amélioration de ton code ! je n'ai pas introduis d'élément absent de ton projet. Le petit plus c'est qu'il respecte quelque règles de base en matière d'écriture de code : déclaration des variables (en tête de procédure), qualificateurs d'objets explicites, présentation graphique permettant une lecture plus aisée, etc.

Si un élément de syntaxe t'échappe, tu peux en demander une explication.

Cordialement

MFerrand a écrit :

Autant que je me souviennes depuis que je l'ai écrit, c'est une amélioration de ton code ! je n'ai pas introduis d'élément absent de ton projet. Le petit plus c'est qu'il respecte quelque règles de base en matière d'écriture de code : déclaration des variables (en tête de procédure), qualificateurs d'objets explicites, présentation graphique permettant une lecture plus aisée, etc.

Si un élément de syntaxe t'échappe, tu peux en demander une explication.

Cordialement

je vous ai juste publié une petite partie de mon projet, bien sur que j'ai déclaré mes variables en début de la macro .et je vous ai bien expliqué ce que j'ai fait dans ma macro !


tagnithamousi a écrit :
MFerrand a écrit :

Autant que je me souviennes depuis que je l'ai écrit, c'est une amélioration de ton code ! je n'ai pas introduis d'élément absent de ton projet. Le petit plus c'est qu'il respecte quelque règles de base en matière d'écriture de code : déclaration des variables (en tête de procédure), qualificateurs d'objets explicites, présentation graphique permettant une lecture plus aisée, etc.

Si un élément de syntaxe t'échappe, tu peux en demander une explication.

Cordialement

je vous ai juste publié une petite partie de mon projet, bien sur que j'ai déclaré mes variables en début de la macro .et je vous ai bien expliqué ce que j'ai fait dans ma macro

ma macro a complètement changé, aucune de mes fonctions

de plus y a aucune explication sur les nouvelles fonctions 'un commentaire à coté aurait été apprécié '

Qu'est-ce que ça change ?

L'opération à propos de laquelle tu poses une question est (apparemment) parfaitement circonscrite. D'autre part, tout code (opérationnel) ne peut figurer que dans une procédure. Il est donc normal de te fournir une procédure susceptible de répondre à ta question si tu as bien fourni les indications relatives au problème.

Par ailleurs vu les problèmes que tu dis rencontrer et les formulations que tu en donnes, par exemple "CAISSE D'EPARGNE" écrit ensuite "CAISSE D'EPARGNE " pour n'en citer qu'un, conduit à border le plus solidement possible les vérifications pour réduire les aléas résultant d'approximations dans la base afin d'en surmonter (ou récupérer) le plus possible.

SoumZoum a écrit :

Hello,

Bon, c'est un peu fouillis tout ça

Peux-tu joindre un fichier, qu'on ait le contexte et de quoi faire des tests ?

N'oublie pas de baliser le code que tu insères dans ton message via les balises

désolée ,c'est la première fois que je publie sur le site , je ne maitrise pas les balises

mais là j'ai amélioré

j’espère que comme ça c'est plus clair pour vous

je vous remercie


MFerrand a écrit :

Qu'est-ce que ça change ?

L'opération à propos de laquelle tu poses une question est (apparemment) parfaitement circonscrite. D'autre part, tout code (opérationnel) ne peut figurer que dans une procédure. Il est donc normal de te fournir une procédure susceptible de répondre à ta question si tu as bien fourni les indications relatives au problème.

Par ailleurs vu les problèmes que tu dis rencontrer et les formulations que tu en donnes, par exemple "CAISSE D'EPARGNE" écrit ensuite "CAISSE D'EPARGNE " pour n'en citer qu'un, conduit à border le plus solidement possible les vérifications pour réduire les aléas résultant d'approximations dans la base afin d'en surmonter (ou récupérer) le plus possible.

j'ai l'impression que vous n'avez pas compris mon problème .c'est une macro toute simple !

Je me permets de ré intervenir.

Merci pour les balises, premièrement Ca facilite grandement la lecture d'un code.

Ensuite, quel est le soucis, tagnithamousi ? Ferrand t'as proposé un code qui, bien qu'il fait la même chose que le tiens, est différent en ce sens qu'il effectue des vérifications qui le rendent bien plus efficace et stable.

S'il s'agit simplement du fait que tu ne comprends pas le code, il faut demander (gentiment) des explications à l'aidant, en l'occurrence Ferrand ; si par contre ce nouveau code ne s'intègre pas "bien" dans ton projet, alors il faut le dire (toujours gentiment) et nous expliquer quels sont les problèmes rencontrés.

Thomas

SoumZoum a écrit :

Je me permets de ré intervenir.

Merci pour les balises, premièrement

Ensuite, quel est le soucis, tagnithamousi ? Ferrand t'as proposé un code qui, bien qu'il fait la même chose que le tiens, est différent en ce sens qu'il effectue des vérifications qui le rendent bien plus efficace et stable.

S'il s'agit simplement du fait que tu ne comprends pas le code, il faut demander (gentiment) des explications à l'aidant, en l'occurrence Ferrand ; si par contre ce nouveau code ne s'intègre pas "bien" dans ton projet, alors il faut le dire (toujours gentiment) et nous expliquer quels sont les problèmes rencontrés.

Thomas

je ne vois pas pourquoi vous ajoutez le mot gentiment ?

C'est l'impression qui ressort, en tout cas me concernant, dans le ton de tes réponses.

Bref, là n'est pas la question, on ne va pas s'arrêter sur une parenthèse ; quel est concrètement ton problème ?

SoumZoum a écrit :

C'est l'impression qui ressort, en tout cas me concernant, dans le ton de tes réponses.

Bref, là n'est pas la question, on ne va pas s'arrêter sur une parenthèse ; quel est concrètement ton problème ?

j'ai répondu sur le même ton de la réponse que j'ai eu , on est pas là pour dénigrer le boulot des autres ! car si j'ai publié mon problème ici c'est que j'ai bossé dessus et que j'avais besoin d'autres personnes pour m'aider

le fait d'aider peut se faire gentiment aussi ! (je ne parle pas de vous ! )


tagnithamousi a écrit :
SoumZoum a écrit :

C'est l'impression qui ressort, en tout cas me concernant, dans le ton de tes réponses.

Bref, là n'est pas la question, on ne va pas s'arrêter sur une parenthèse ; quel est concrètement ton problème ?

j'ai répondu sur le même ton de la réponse que j'ai eu , on est pas là pour dénigrer le boulot des autres ! car si j'ai publié mon problème ici c'est que j'ai bossé dessus et que j'avais besoin d'autres personnes pour m'aider

le fait d'aider peut se faire gentiment aussi ! (je ne parle pas de vous ! )

mon problème est que je souhaite filtrer une première colonne puis une deuxième colonne pour remplir la troisième colonne avec Ko ou OK

le blocage que j'ai se fait au niveau de la deuxieme colonne

le code ne lis pas certains cas et bloque

cas ou la cells= FRANCE ou #N/A

Tu sais, une partie des personnes qui viennent demander de l'aide sont souvent des débutants qui n'ont aucune de VBA, ou des notions limitées - tout le monde a commencé là hein, ce n'est pas péjoratif. Donc si le code fourni n'est pas "complet", en l'occurrence la déclaration des variables, on ne peut que penser qu'elle n'a pas été faite ; donc certains préfèrent fournir un code "clé en main".

Je ne trouve pas qu'il ait dénigré ton travail, il t'a juste donné des pistes d'améliorations. Personne n'a la science infuse, donc tout conseil, sous quelque forme que ce soit (ici implicite, en code) est bon à prendre. Si tu connais déjà, tant mieux ! Si tu ne connais pas, tant mieux aussi.

La susceptibilité n'est jamais productive

Revenons au sujet initial. Le problème de départ a bien été compris, mais quel est le soucis avec le code de Ferrand ? Il ne marche pas ? Il ne s'intègre pas bien dans ton projet ?

SoumZoum a écrit :

Tu sais, une partie des personnes qui viennent demander de l'aide sont souvent des débutants qui n'ont aucune notion de VBA (tout le monde a commencé là hein, ce n'est pas péjoratif). Donc si le code fourni n'est pas "complet", en l'occurrence la déclaration des variables, on ne peut que penser qu'elle n'a pas été faite ; donc certains préfèrent fournir un code "clé en main".

Je ne trouve pas qu'il ait dénigré ton travail, il t'a juste donné des pistes d'améliorations. Personne n'a la science infuse, donc tout conseil, sous quelque forme que ce soit (ici implicite, en code) est bon à prendre. Si tu connais déjà, tant mieux ! Si tu ne connais pas, tant mieux aussi.

La susceptibilité n'est jamais productive

Revenons au sujet initial. Le problème de départ a bien été compris, mais quel est le soucis avec le code de Ferrand ? Il ne marche pas ? Il ne s'intègre pas bien dans ton projet ?

en réalité je ne peux pas présenter un travail que je n'ai pas fait , j'aurai préféré qu'on me dise comment améliorer le code et non le changer avec des nouvelles fonctions que ne ne connais pas .

le code que Ferrand a fait ne correspond pas à ma demande (certes y a plus le blocage au niveau de la cells 2 pour incompatibilité ) mais le KO et OK ne correspondent pas à ce que je souhaite faire (c'est pour cela je disais qu'il fallait expliquer le code " pour pouvoir adapter ! )

tagnithamousi a écrit :
SoumZoum a écrit :

Tu sais, une partie des personnes qui viennent demander de l'aide sont souvent des débutants qui n'ont aucune notion de VBA (tout le monde a commencé là hein, ce n'est pas péjoratif). Donc si le code fourni n'est pas "complet", en l'occurrence la déclaration des variables, on ne peut que penser qu'elle n'a pas été faite ; donc certains préfèrent fournir un code "clé en main".

Je ne trouve pas qu'il ait dénigré ton travail, il t'a juste donné des pistes d'améliorations. Personne n'a la science infuse, donc tout conseil, sous quelque forme que ce soit (ici implicite, en code) est bon à prendre. Si tu connais déjà, tant mieux ! Si tu ne connais pas, tant mieux aussi.

La susceptibilité n'est jamais productive

Revenons au sujet initial. Le problème de départ a bien été compris, mais quel est le soucis avec le code de Ferrand ? Il ne marche pas ? Il ne s'intègre pas bien dans ton projet ?

en réalité je ne peux pas présenter un travail que je n'ai pas fait , j'aurai préféré qu'on me dise comment améliorer le code et non le changer avec des nouvelles fonctions que ne ne connais pas .

le code que Ferrand a fait ne correspond pas à ma demande (certes y a plus le blocage au niveau de la cells 2 pour incompatibilité ) mais le KO et OK ne correspondent pas à ce que je souhaite faire (c'est pour cela je disais qu'il fallait expliquer le code " pour pouvoir adapter ! )

pouvez vous juste m'aider à améliorer la colonne 2 ou ya mes chaines de caractère pour que mon code puisse lire tous les cas qu'il y a dans la colonne (car lorsque j’enlève #N/A et FRANCE cela fonctionne normalement )

J'ai un peu de mal à suivre la trajectoire de la discussion !

Si je t'ai vexé, dis-le ! On pourra en discuter, et je te prierai de m'en excuser car telle n'était pas mon intention. Cependant, il n'a été question que de code en réponse à un problème, et je ne vois vraiment pas quels propros auraient pu être vexants dans cet échange.

Tu poses une question en vue de régler un problème fonctionnel auquel ta macro ne répond pas. Les éléments que tu donnes sont un peu fouillis comme l'avait soulevé ZouSoum, mais en y regardant de près il y avait déjà suffisamment de points soulevés auxquels on pouvait répondre. Ayant un moment de disponibilité, je t'ai proposé un code qui devrait répondre aux problèmes que tu avais signalé.

Tu reviens en disant que ce n'était pas ta demande, tu souhaitais qu'on te dise ce qu'il fallait modifier dans ton code. Je comprends bien ! Seulement, si j'avais répondu ainsi, cela se serait limité à des phrases style : Fais un test sur tel élément à tel moment, Utilise telle méthode plutôt que telle autre, etc. Et je n'aurais fourni aucun code.

Cela marche éventuellement avec quelqu'un qui maîtrise déjà un peu bien VBA, mais je ne pouvais déduire des termes de ta demande que tu te trouvais dans un tel cas. Comme l'a déjà indiqué ZoumSoum, cela n'a rien de péjoratif ni de condescendant. Il a bien fallu débuter un jour, dans tout activité. Je fais des macros depuis presque 30 ans, et avec VBA depuis 22 ans (et mon niveau en la matière n'est pas supérieur à nombre d'intervenants qui oeuvrent dans ce domaine depuis beaucoup moins longtemps, et je pourrais même avoir des complexes en observant des progressions fulgurantes comme celle de ZoumSoum... )

Bref, il m'a donc paru plus judicieux de te fournir un code, élaboré à partir de tes indications, que j'avais un peu de disponibilité pour produire. A ce stade, deux choses : je m'efforce, sauf exception s'il n'y a qu'une ligne, de fournir un code immédiatement fonctionnel, donc au moins une procédure (tout code exécutable doit être dans une procédure), et je me fais une règle de la présenter selon des normes qui pour la plupart sont fortement recommandées aux programmeurs (non sans intention didactique). J'ai certes quelques particularités de style (comme chacun) qui ne font pas partie des recommandations d'usage mais dont je ne vois aucune raison de ma passer (ce n'est pas essentiel et si elles ne conviennent pas, l'intéressé peut toujours les modifier sans dommage).

Donc maintenant la question est de savoir si ce code répond ou non aux problèmes posés. Aussi je ne te suis pas quand tu veux qu'on reprenne ton code ! S'il fonctionnait, tu n'aurais pas eu de question à poser. Donc je t'en propose un autre (pas radicalement différent d'ailleurs en termes de structure, mais qui opère un certain nombre de vérification que ton code ne faisait pas). Donc, non ! Je ne peux reprendre ton code. J'en ai repris tous les éléments nécessaires déjà ! Et je peux te fournir toutes les explications sur les éléments qui peuvent t'interroger.

Cordialement

Ferrand

MFerrand a écrit :

J'ai un peu de mal à suivre la trajectoire de la discussion !

Si je t'ai vexé, dis-le ! On pourra en discuter, et je te prierai de m'en excuser car telle n'était pas mon intention. Cependant, il n'a été question que de code en réponse à un problème, et je ne vois vraiment pas quels propros auraient pu être vexants dans cet échange.

Tu poses une question en vue de régler un problème fonctionnel auquel ta macro ne répond pas. Les éléments que tu donnes sont un peu fouillis comme l'avait soulevé ZouSoum, mais en y regardant de près il y avait déjà suffisamment de points soulevés auxquels on pouvait répondre. Ayant un moment de disponibilité, je t'ai proposé un code qui devrait répondre aux problèmes que tu avais signalé.

Tu reviens en disant que ce n'était pas ta demande, tu souhaitais qu'on te dise ce qu'il fallait modifier dans ton code. Je comprends bien ! Seulement, si j'avais répondu ainsi, cela se serait limité à des phrases style : Fais un test sur tel élément à tel moment, Utilise telle méthode plutôt que telle autre, etc. Et je n'aurais fourni aucun code.

Cela marche éventuellement avec quelqu'un qui maîtrise déjà un peu bien VBA, mais je ne pouvais déduire des termes de ta demande que tu te trouvais dans un tel cas. Comme l'a déjà indiqué ZoumSoum, cela n'a rien de péjoratif ni de condescendant. Il a bien fallu débuter un jour, dans tout activité. Je fais des macros depuis presque 30 ans, et avec VBA depuis 22 ans (et mon niveau en la matière n'est pas supérieur à nombre d'intervenants qui oeuvrent dans ce domaine depuis beaucoup moins longtemps, et je pourrais même avoir des complexes en observant des progressions fulgurantes comme celle de ZoumSoum... )

Bref, il m'a donc paru plus judicieux de te fournir un code, élaboré à partir de tes indications, que j'avais un peu de disponibilité pour produire. A ce stade, deux choses : je m'efforce, sauf exception s'il n'y a qu'une ligne, de fournir un code immédiatement fonctionnel, donc au moins une procédure (tout code exécutable doit être dans une procédure), et je me fais une règle de la présenter selon des normes qui pour la plupart sont fortement recommandées aux programmeurs (non sans intention didactique). J'ai certes quelques particularités de style (comme chacun) qui ne font pas partie des recommandations d'usage mais dont je ne vois aucune raison de ma passer (ce n'est pas essentiel et si elles ne conviennent pas, l'intéressé peut toujours les modifier sans dommage).

Donc maintenant la question est de savoir si ce code répond ou non aux problèmes posés. Aussi je ne te suis pas quand tu veux qu'on reprenne ton code ! S'il fonctionnait, tu n'aurais pas eu de question à poser. Donc je t'en propose un autre (pas radicalement différent d'ailleurs en termes de structure, mais qui opère un certain nombre de vérification que ton code ne faisait pas). Donc, non ! Je ne peux reprendre ton code. J'en ai repris tous les éléments nécessaires déjà ! Et je peux te fournir toutes les explications sur les éléments qui peuvent t'interroger.

Cordialement

Ferrand

je vous remercie pour le boulot que vous avez fait, mais helas ça ne correspond pas à ma demande

je comprends votre réaction , mais c'est un boulot que je dois presenter , je ne peux pas remettre quelque chose que je n'ai pas fait ou encore que je ne comprends pas !(c'est pour cela je souhaite être éclairé sur comment je peux l'améliorer)

mon code bloque uniquement sur la deuxième colonne et que pour quelques cas

donc à mon avis je dois juste faire un travail sur cette colonne avant de faire mon filtre

enlever les espaces ou quelques chose qui permet à ma macro de lire les cellules qui ont des caractères spéciaux

cordialement

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