Macro - Valeur selon filtre

12testmacro.xlsm (9.93 Ko)

Bonjour,

J'aimerais apprendre à faire 2 choses.

1) Mettre une valeur selon un critère.

Dans l'exemple ci-joint, il s'agirait de filtrer sur la colonne A et, pour toutes les valeurs où il y a "Excel", mettre une valeur dans la colonne B associée

2) Copier une valeur selon un critère

Idem que précédent, mais en copiant dans un autre onglet.

On ne prend QUE les lignes où il y a le mot "Excel" en colonne A et on copie dans un autre onglet (avec le titre de chaque colonnes).

S'agit-il de manipulations compliquées?

En vous remerciant pour votre lecture,

Bonne journée!

Bonjour,

Je pense que tu veux mixer 2 choses différentes ici. Pourquoi filtrer pour écrire les valeurs ? Que va apporter le filtre dans le point 1 ? On peut tout à fait trouver quelles sont les cellules concernées et écrire dans la cellule juste à droite. Vois le code ci-dessous. On pourrait être encore plus rapide en travaillant en mémoire et en n'écrivant pas dans les cellules au fur et à mesure, mais sur de petits tableaux cela ne fait aucune différence :

Sub test()
Dim lo As ListObject
Set lo = Feuil1.ListObjects("Tableau1")
'On crée une boucle sur toutes les cellules du tableau
For C = 1 To lo.ListRows.Count
    With lo.DataBodyRange.Cells(C, 1)
        'si on trouve la chaîne de caractères Excel n'importe où dans la cellule, on met une croix dans la cellule une colonne à droite
        If .Value Like "*Excel*" Then .Offset(, 1) = "X"
    End With
Next
End Sub

Pour le point 2, tu peux tout à fait travailler en mémoire également, créer un tableau virtuel qui contient toutes les données où Excel est trouvé dans la colonne A.
Mais cette fois, tu peux bel et bien filtrer les données qui contiennent Excel, copier uniquement les lignes visibles, et les coller ensuite ailleurs :

Sub test2()

    ActiveSheet.ListObjects("Tableau1").Range.AutoFilter Field:=1, Criteria1:= _
        "=*Excel*", Operator:=xlAnd
    Range("Tableau1[#All]").Copy
    Sheets.Add After:=ActiveSheet
    ActiveSheet.Paste
End Sub

Ce ne sont que des pistes indicatives. Il y a plusieurs façons de faire ceci.

Merci Formatic! Je teste cela dès que possible

Bonsoir,

(Ma première contribution avec une solution Power-Query)...

Sans macro, et sans la colonne B (qui ne servira à rien)

Une requête PQ, à actualiser dès modification du Tableau source.

Bonne soirée

Bonjour,

Merci Cousin. Cela permet en effet de filtrer sur le mot excel. C'est frustrant car je savait faire en fait, il faut que j'ai un état d'esprit plus "PQ" que "Macro".

21Formatic, ta macron fonctionne impeccablement avec l'exemple que j'ai donné.

Mais je n'arrive pas à la transposer à mon besoin, ce qui signifie qu'il y a des choses que je n'ai pas bien comprise.

Ca bloque là en fait :

Set lo = Feuil1.ListObjects("Tableau1")

Il me dit "Erreur d'execution 9 : L'indice n'appartient pas à la sélection"

Dans mon fichier , l'onglet c'est Feuil4 et le nom du tableau c'est "t_test".

Le nom des colonnes n'est plus le même mais la valeur à chercher est aussi en colonne A.

Du coup j'ai juste changé:

Set lo = Feuil4.ListObjects("t_test")

Pourriez-vous svp m'aider à identifier mon erreur?

EDIT : si c'est impossible avec mes explications ci-dessus, j'anonymiserai le fichier et je le mettrai en PJ

Hello,

De mon côté je veux bien une version anonymisée du fichier (2 ou 3 lignes suffisent, ne t'embête pas à en faire trop) parce que pour ces choses-là, j'ai du mal sans mettre les mains dedans ...

Merci.

Voir PJ.

Mon objectif exact est le suivant.

Selon ce qu'il y a dans la colonne A, marquer quelque chose dans la colonne B (soit "Pos-up", soit "Email", soit "Job_HIRE").

Exemple : JV_000_Paris_JV_000_Paris_Pos_Up dans colonne A? On met Pos_Up dans colonne B

12qforum1.xlsx (11.52 Ko)

Un grand merci pour votre aide !

Pourquoi ne pas faire ceci par formule ?

Pourquoi ne pas avoir mis tes codes qui posent souci dans le fichier ?

Il faut à nouveau tout refaire ? (moyennement motivé pour)

Merci de ta réponse.

Comment tu traiterais cela par formule?

Une combinaison de fonctions "SI" et "CHERCHE"?

Un truc du genre

=SI(ESTERREUR(CHERCHE("*Job_LOAR*";A2));SI(ESTERREUR(CHERCHE("*Phone*";A2));"TEST";"Phone");"Job_LOAR")

Quelque chose de cet ordre-là, oui. Si tu n'as pas énormément de choix différents, cela peut être une option.

=SIERREUR(SI(CHERCHE("Pos_up";[@[Job Name]])>1;"Pos_Up";"");"")&SIERREUR(SI(CHERCHE("Email";[@[Job Name]])>1;"Email";"");"")&SIERREUR(SI(CHERCHE("Job_HIRE";[@[Job Name]])>1;"Job_HIRE";"");"")

(Ce n'est pas optimisé, c'est pour donner l'idée)

Sinon, cela a l'air de fonctionner ainsi :

Sub test()
Dim Ws As Worksheet
Dim lo As ListObject
Set Ws = ThisWorkbook.Worksheets("feuil4")
Set lo = Ws.ListObjects("t_test")
'On crée une boucle sur toutes les cellules du tableau
For C = 1 To lo.ListRows.Count
    With lo.DataBodyRange.Cells(C, 1)
        'si on trouve la chaîne de caractères Excel n'importe où dans la cellule, on met une croix dans la cellule une colonne à droite
        If .Value Like "*Email*" Then .Offset(, 1) = "X"
    End With
Next
End Sub
Rechercher des sujets similaires à "macro valeur filtre"