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