Filtrer deux colonnes et remplir une troisième colonne

MFerrand a écrit :

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 !

pouvez vous juste me réexpliquer comment fonctionne le V(0) ?

v est une variable de type Variant, qui peut donc se voir affecter n'importe quoi.

On lui affecte donc une chaîne de caractères formée avec les éléments que l'on veut utiliser ensuite indépendamment. On sépare les éléments à l'intérieur de la chaîne par un séparateur : espace s'il n'y en a dans aucun des éléments, ou un autre caractère (ici on a pris le point-virgule). La fonction Split permet ensuite de transformer cette chaîne en tableau de chaînes délimitées par le séparateur.

Cela permet assez facilement de disposer d'un tableau dont l'indice le plus bas est 0 et le plus haut égal au nombre d'éléments -1, que l'on peut utiliser dans une boucle.

MFerrand a écrit :

v est une variable de type Variant, qui peut donc se voir affecter n'importe quoi.

On lui affecte donc une chaîne de caractères formée avec les éléments que l'on veut utiliser ensuite indépendamment. On sépare les éléments à l'intérieur de la chaîne par un séparateur : espace s'il n'y en a dans aucun des éléments, ou un autre caractère (ici on a pris le point-virgule). La fonction Split permet ensuite de transformer cette chaîne en tableau de chaînes délimitées par le séparateur.

Cela permet assez facilement de disposer d'un tableau dont l'indice le plus bas est 0 et le plus haut égal au nombre d'éléments -1, que l'on peut utiliser dans une boucle.

Merci pour les explications

pouvez vous jute m'aider pour la dernière fois

comme vous savez j'ai un problème d'espace et de format dans mes cellules

et j'ai des codes qui sont des nombre mais ils son sous format TEXTE

et afin de travailler dessus je veux les convertir en nombre

j'ai utilisé les fonction VAL elle extrait les nuombre que je veux ,mais le problème est que lorsque la cellue est vide elle convertit quand meme et met 0 , et ça me fausse les données .

je souhaite donc convertir en nombre mais lorsque la cellule est vide elle reste vide

Merciii

Rajoute une petite condition

If Référence de ta cellule <>"" then
Ton instruction Val(Référence de ta cellule)
End if

Qui fait que les cellules vides seront ignorées

SoumZoum a écrit :

Rajoute une petite condition

If Référence de ta cellule <>"" then
Ton instruction Val(Référence de ta cellule)
End if

Qui fait que les cellules vides seront ignorées

mercii j'avait fait ça

et non j'ai toujours des 0 lorsque la cellule est vide

For i = 3 To lastrow
   If Cells(i, 17).Value <> "" Then

    Cells(i, 17).Value = Val(Range("Q" & i).Value)
   End If

 Next i

Si ta cellule est vraiment vide - ou le paraît -, tu dois encore avoir des espaces superflus

For i = 3 To lastrow
   If Trim(Cells(i, 17).Value) <> "" Then

    Cells(i, 17).Value = Val(Range("Q" & i).Value)
   End If

 Next i
SoumZoum a écrit :

Si ta cellule est vraiment vide - ou le paraît -, tu dois encore avoir des espaces superflus

For i = 3 To lastrow
   If Trim(Cells(i, 17).Value) <> "" Then

    Cells(i, 17).Value = Val(Range("Q" & i).Value)
   End If

 Next i

Parfait ça fonctionne

Merci beaucoup je suis épatée par votre professionnalisme.

Le mérite en revient à Ferrand

Un conseil, je ne sais pas d'où viennent ces espaces superflus, mais essaie de standardiser au maximum ta saisie pour éviter ce genre de problème.

SoumZoum a écrit :

Le mérite en revient à Ferrand

Un conseil, je ne sais pas d'où viennent ces espaces superflus, mais essaie de standardiser au maximum ta saisie pour éviter ce genre de problème.

j'ai deja mis en format standard mais cela ne change pas grand chose .bref j'ai reussi à contourner le souci c'est le plus important

afin de perfectionner mon projet je souhaite juste avoir votre avis

en fait mon code est lent (1mn 49) pour avoir le resultat que je souhaite

pensez vous que c'est normal ? (d'autant plus que lorsque la macro s'execute sur mon fichier c'est ecrit : le fichier ne repond pas , mais il fini quand meme l'execution et me donne le resultat )

ps: le code devient lent à partir du code que g publié ( c'est peut etre lent parce que c'est des boucles et des conditions imbriquées ????)

Regarde du côté de l'aide Microsoft pour les fonctions :

Application.ScreenUpdating

Application.Calculation

Si tu parles anglais, jette un oeil la-dessus également :

http://www.cpearson.com/excel/optimize.htm

SoumZoum a écrit :

Regarde du côté de l'aide Microsoft pour les fonctions :

Application.ScreenUpdating

Application.Calculation

Si tu parles anglais, jette un oeil la-dessus également :

http://www.cpearson.com/excel/optimize.htm

voici ce qui ralenti mon code :

je fais une rechercheV dans une feuille à partir de l'onglet deux ("xxxxx") du classeur

lastrow = Worksheets("Test de Notation").Range("Q" & Rows.Count).End(xlUp).Row
For i = 1 To lastrow
Cells(i, 18) = Application.VLookup(Cells(i, 17), Worksheets("xxxx").Range("$H$2:$L$1050").Value, 5, False)
Next i

sinon tout le reste est rapide

que pensez vous de ma fonction ?

Que tu devrais suivre les pistes que je t'ai données

SoumZoum a écrit :

Que tu devrais suivre les pistes que je t'ai données

j'ai essayé avec ma recherchV mais ça ne change pas grand chose

Application.ScreenUpdating = True

Application.ScreenUpdating = True

Application.ScreenUpdating = false

Regarde du côté de calculation

SoumZoum a écrit :

Regarde du côté de calculation

hihihih

vous en avez marre de mon projet :p :p je comprends , moi auss d'ailleurs j'ai trop bossé dessus

Il ne s'agit pas tant d'en avoir marre que d'être pédagogue.

Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours.

Il faut que tu apprennes à rechercher les informations. En soi, pour les autodidactes du moins, tout réside dans la recherche d'informations. L'ami qu'on a tous qui est fort en informatique est bien souvent simplement fort en Google

SoumZoum a écrit :

Il ne s'agit pas tant d'en avoir marre que d'être pédagogue.

Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours.

Il faut que tu apprennes à rechercher les informations. En soi, pour les autodidactes du moins, tout réside dans la recherche d'informations. L'ami qu'on a tous qui est fort en informatique est bien souvent simplement fort en Google

merci pour le conseil je passe mon temps à chercher parfois je comprends parfois non et dans ce cas la je demande de l'aide !

voilà ce que j'ai fait , j'ai l'impression que c'est encore plus lent

Application.ScreenUpdating = False
lastrow = Worksheets("Test de Notation").Range("Q" & Rows.Count).End(xlUp).Row

For i = 1 To lastrow
Application.Calculate
Cells(i, 18) = Application.VLookup(Cells(i, 17), Worksheets("mapping").Range("$H$2:$L$1050").Value, 5, False)

Next i

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

C'est normal, tu ne l'as pas désactivé

Concernant la "Calculation" :

SoumZoum a écrit :

La calculation automatique, qui est la valeur par défaut, fait que chaque cellule modifiée est automatiquement recalculée ainsi que les cellules qui en découlent - les liens, les formules. Si tu as un =f7+f8 en cellule f6 et que tu modifies cette dernière, il recalculera les trois. Le fait de la mettre en manuelle et de la réactiver en fin de routine permet de tout faire d'un bloc, plutôt que de recalculer à chaque passage sur une cellule.

Tu désactives en début de module (=False), tu réactives en fin de sub ou en fin d'instruction (=True).

Des risques ? A part ralentir ta macro, non.

Par contre si un bout de ton code se base sur un résultat de la même macro, ça pourra te bloquer.

Exemple

Sheets.Add
[A1, A2] = 10
[A3].Formula = "=A1*A2" '= 100
Application.calculation = xlcalculationmanual
[A1] = 20
[A4].formula = "=A3*10"
Application.calculation = xlcalculationautomatic

Mets ça dans une sub et fais la tourner manuellement (touche F8), en étant attentif aux valeurs de A3 et A4.

Dans l'exemple, ça va, car les formules sont recalculées à la fin, donc pas de problème.

Maintenant, remplace

[A4].formula = "=A3*10"

par

[A4]= [A3]*10

, et refais tourner la sub .

Et tu verras que ça peut te donner des résultats bien différents de ceux attendus.

Concernant donc ton code :

Application.ScreenUpdating = False
Application.Calculation = xlcalculationmanual '(Eviter de placer ce genre d'instruction au milieu d'une boucle car elle sera exécutée à chaque itération, ce qui n'est pas utile ni judicieux si tu souhaites optimiser ton code. 
lastrow = Worksheets("Test de Notation").Range("Q" & Rows.Count).End(xlUp).Row

For i = 1 To lastrow
Cells(i, 18) = Application.VLookup(Cells(i, 17), Worksheets("mapping").Range("$H$2:$L$1050").Value, 5, False)

Next i

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

Ca devrait marcher bien plus vite !

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