Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/01/2012, 14h11   #1
Invité de passage
 
Homme
Ingénieur validation
Inscription : janvier 2012
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur validation
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : janvier 2012
Messages : 20
Points : 3
Points : 3
Par défaut Ajouter un filtre dans un TCD

Bonjour,

Je crée un tableau croisé dynamique par macros.
J'ai ajouté une macro à la suite qui crée un filtre sur les valeurs de la 3ème colonne du TCD.

Ça donne ça :

Code :
1
2
    Sheets("TCD").Select
    Selection.AutoFilter , Field:=3, Criteria1:=">=100", Operator:=xlAnd
Lorsque je regarde le résultat du filtre après l'exécution de la macro :
- le filtre existe dans mon TCD
- le filtre numérique est correctement sélectionné : supérieur ou égal à 100

Mais les valeurs affichées dans la colonne en question ne correspondent pas du tout...

Il y a de tout, des valeurs plus petites, plus grandes...
un filtre a bien été fait car des lignes ont disparu, mais sans queue ni tête...

Lorsque j'efface manuellement ce filtre, et que je le recrée à l'identique encore manuellement, ça marche nickel !

Quelqu'un aurait une idée svp ?
Live83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 14h23   #2
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,

Utilise l'enregistreur de macros, poste le code généré et indique ta version d'Excel.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 15h07   #3
Invité de passage
 
Homme
Ingénieur validation
Inscription : janvier 2012
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur validation
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : janvier 2012
Messages : 20
Points : 3
Points : 3
Ma version est Excel 2010

J'avais utilisé l'enregistreur de macro, et je m'en suis légèrement écarté, vu qu'elle ne marchait pas du tout pour le coup. ("La méthode AutoFilter de la classe Range a échoué")

Code :
1
2
3
4
5
6
7
8
9
Sub filtrage_colonne()
'
' filtrage_colonne Macro
'
    Columns("C:C").Select
    Selection.AutoFilter
    ActiveSheet.Range("$C$3:$C$1435").AutoFilter Field:=1, Criteria1:=">=100", _
        Operator:=xlAnd
End Sub
Live83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 16h04   #4
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
J'ai du mal à comprendre; tu filtres sur un champ ou sur un item ? Qu'est-ce qu'il y a en C3 ?
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 16h18   #5
Invité de passage
 
Homme
Ingénieur validation
Inscription : janvier 2012
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur validation
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : janvier 2012
Messages : 20
Points : 3
Points : 3
C3 : c'est la première cellule appartenant au TCD dans la colonne C.

C'est dans cette cellule que se crée le filtre (que ce soit manuellement ou par la macro)

Mon but est de n'afficher que les lignes du TCD dont la valeur située dans la colonne C matche mon filtre.

Voici un morceau du TCD avant que le filtre ne soit créé.
Images attachées
Type de fichier : png Capture_tcd.PNG (9,5 Ko, 7 affichages)
Live83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 16h41   #6
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Ça serait sympa d'avoir un petit fichier de test (sans données confidentielles).
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 17h05   #7
Invité de passage
 
Homme
Ingénieur validation
Inscription : janvier 2012
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur validation
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : janvier 2012
Messages : 20
Points : 3
Points : 3
Arffff...
Malheureusement c'est bourré d'info confidentielles.

Or le TCD garde toutes les infos du tableau de base, donc impossible de le rendre non confidentiel.

Et j'ai essayé en ne copiant que les valeurs de mon TCD dans un nouveau classeur : ça marche très bien avec une macro. Le problème vient donc clairement de l'interaction d'un filtre avec le TCD (mais seulement en génération automatique... bizarre...)

Pour essayer de donner une meilleure idée de ce qui se passe, je joins une nouvelle copie d'écran :

(Remarquez le tooltip qui précise bien que les éléments de la colonne C sont supérieurs ou égaux à 100 )
Images attachées
Type de fichier : png Capture_tcd_bis.PNG (78,6 Ko, 7 affichages)
Live83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 17h24   #8
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Sinon tu boucles sur les lignes et tu les caches si elles ne remplissent pas ta condition...
(J'avoue que je n'ai jamais réussi à faire marcher correctement AutoFilter par macro, et ce n'est pas faute d'avoir essayé suite à certaines questions de membres sur ce forum.)
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 07h53   #9
Futur Membre du Club
 
Inscription : décembre 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 68

Informations forums :
Inscription : décembre 2007
Messages : 70
Points : 18
Points : 18
Citation:
Envoyé par Live83 Voir le message
Ma version est Excel 2010

... ActiveSheet.Range("$C$3:$C$1435").AutoFilter Field:=1, Criteria1:=">=100",Operator:=xlAnd


End Sub[/code]
Bonjour,

Il me semble que s'il y a ,Operator:=xlAnd il devrait y avoir derrière un second critère...Criteria2:= xxxx sinon, il faut supprimer ,Operator:=xlAnd

Cordialement
mécano41 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 16h25   #10
Invité de passage
 
Homme
Ingénieur validation
Inscription : janvier 2012
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur validation
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : janvier 2012
Messages : 20
Points : 3
Points : 3
Citation:
Envoyé par ZebreLoup Voir le message
Sinon tu boucles sur les lignes et tu les caches si elles ne remplissent pas ta condition...
(J'avoue que je n'ai jamais réussi à faire marcher correctement AutoFilter par macro, et ce n'est pas faute d'avoir essayé suite à certaines questions de membres sur ce forum.)
Bonjour,

J'ai suivi ton conseil : ça marche nickel !

C'est un peu long au niveau du traitement...
Et j'ai du me creuser la tête car je suis novice en VBA et je trouve ça assez peu intuitif voire par moments un peu torturé !
Etre obligé de sélectionner une cellule pour pouvoir sélectionner une ligne... à moins qu'on puisse faire plus simple ?
Mais ça marche, ça fait ce que je veux, et c'est bien là le plus important.

Merci pour votre temps et vos réponses !

A toutes fins utiles :
(J'ai aussi créé une macro pour faire la manipulation inverse)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
Sub Cacher_lignes()
 
Dim i As Integer
i = 4
 
While (Range("B" & i) <> "")
    If (Range("C" & i).Value <= Range("E2").Value) Then
        Range("B" & i).Activate
        Rows(ActiveCell.Row & ":" & ActiveCell.Row).Hidden = True
    End If
    i = i + 1
Wend
 
End Sub
 
'******************
 
Sub Montrer_lignes()
 
Dim i As Integer
i = 4
 
While (Range("B" & i) <> "")
         Range("B" & i).Activate
        Rows(ActiveCell.Row & ":" & ActiveCell.Row).Hidden = False
        i = i + 1
Wend
 
End Sub
Live83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 17h05   #11
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Evite au maximum de sélectionner, tu perds en performance

Code :
1
2
3
4
5
6
7
8
9
10
11
Sub Montrer_lignes()
 
Dim i As Integer
i = 4
 
While (Range("B" & i) <> "")
         Rows(i).Hidden = False
        i = i + 1
Wend
 
End Sub
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 17h08   #12
Invité de passage
 
Homme
Ingénieur validation
Inscription : janvier 2012
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur validation
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : janvier 2012
Messages : 20
Points : 3
Points : 3
Ah voilà... je vais essayer ça.
Ca simplifie déjà visuellement et je veux bien croire que ne pas sélectionner fait gagner du temps !

Merci
Live83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 17h20   #13
Futur Membre du Club
 
Inscription : décembre 2007
Messages : 70
Détails du profil
Informations personnelles :
Âge : 68

Informations forums :
Inscription : décembre 2007
Messages : 70
Points : 18
Points : 18
Avec ta version initiale, as-tu essayé de supprimer la fin de l'instruction comme indiqué au message #9 et regardé si cela fonctionne mieux?

Cordialement
mécano41 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 17h26   #14
Invité de passage
 
Homme
Ingénieur validation
Inscription : janvier 2012
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur validation
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : janvier 2012
Messages : 20
Points : 3
Points : 3
Oui, pardon j'ai oublié de répondre.
Ça ne change rien...
Live83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 17h42   #15
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Ou bien, pour éviter une boucle :

Code :
1
2
3
4
5
Sub Montrer_lignes()
 
Range([B4], [B4].End(xlDown)).EntireRow.Hidden = True
 
End Sub
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 18h11   #16
Invité de passage
 
Homme
Ingénieur validation
Inscription : janvier 2012
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur validation
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : janvier 2012
Messages : 20
Points : 3
Points : 3
Oui, en effet c'est beeeeaaaauuuucoup plus rapide !
(en changeant le True en False )
Live83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 10h24   #17
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,

Pour masquer les lignes, tu peux utiliser :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub Cacher_lignes()
 
Dim c As Range, Plage As Range
Application.ScreenUpdating = False
For Each c In Range([B4], [B4].End(xlDown))
    If c.Value <= Range("E2").Value Then
        If Plage Is Nothing Then
            Set Plage = c
        Else
            Set Plage = Union(Plage, c)
        End If
        Plage.EntireRow.Hidden = True
    End If
Next c
Application.ScreenUpdating = True
End Sub
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 14h40   #18
Invité de passage
 
Homme
Ingénieur validation
Inscription : janvier 2012
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur validation
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : janvier 2012
Messages : 20
Points : 3
Points : 3
Bonjour,

Je n'ai pas eu le temps d'essayer la dernière proposition.
Mais ce que j'ai mis auparavant fonctionne très bien !

Je mets le topic en résolu.

Merci
Live83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h38.


 
 
 
 
Partenaires

Hébergement Web