IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDK Discussion :

[VBA] - Appliquer un filtre


Sujet :

SDK

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut [VBA] - Appliquer un filtre
    Bonjour,

    Je souhaite trouver la fonction en VBA qui me permettrait de filtrer les données sur une colonne sélectionnée.
    Ensuite j'exporte le résultat obtenu en fichier PDF (mais ça je sais faire).

    Merci.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Salut,

    Pour ajouter un filtre à l'aide d'une macro tu dois utiliser la fonction AddComplexFilter(variable_a_filtrer, formule_du_filtre) de l'objet Report (exemple: ThisDocument.Reports.Item(1).AddComplexFilter "toto", "=<toto> = 1")

    Par contre je n'ai pas trouvé comment supprimer un filtre créé par macro. Du coup je le remplace par un filtre bidon (1=1).

  3. #3
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Pourquoi ne pas filtrer directement dans la requête ? Pour se servir du même fournisseur de données pour plusieurs rapports ?

    Et pourquoi ne pas filtrer dans le rapport directement alors ? Pour actionner des filtres à coup de requêtes ? C'est une technique intéressante effectivement, je me la garde dans un coin du cerveau
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Dans mon cas je dois générer des rapports pour de nombreuses personnes, qui ne sont pas abilitées à voir les mêmes choses. Du coup je filtre pour chaque groupe de personnes et j'exporte à chaque fois. Bien pratique

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Pourquoi des filtres en VBA
    Pour ma part, j'ai un tableau avec une rupture par destinataire. Je dois générer un fichier PDF par destinataire en ayant au préalable filtrer sur le destinantaire.
    J'ai plus 20 destinataires et la macro m'évitera de le faire manuellement.

  6. #6
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Est-ce que la solution donnée te convient ?
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  7. #7
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je ne sais pas si la solution me convient. Je n'ai pas encore eu le temps d'essayer.
    En as-tu une meilleur ?

  8. #8
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Celle là me parait idéale pour ta problèmatique alors je n'en ai pas cherchée une autre en fait.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Et la solution de poser des filtres (via le SUPERVISEUR) sur les univers pour chaque utilisateur ne peut-elle pas te convenir ?

    Ensuite lorsque tu envoies ton document via DocAgentOption, c'est lui qui se charge du reste.

    L'intéret est double car si ces utilisateurs ont un accès à BO pour consulter les rapports, ta confidentialité est déjà posée.

  10. #10
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Oui mais dans ce cas, chaque utilisateur doit rafraichir son rapport. Ce qui peut être une bonne solution car, comme tu le disais, ça permet de mettre en place la sécurité sur chaque utilisateur.

    Mais on se rend compte que parfois le client préfère qu'une seule personne rafraichisse les rapports pour tous les autres, et dans ce cas il faut gérer avec les logins, etc.

    A moins que le DocAgentOption soit une commande VBA qui permette de rafraichir le rapport avec les paramètres liés à un utilisateur précis, ce qui effectivement serait une solution plus intéressante que les filtres.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    DocAgentOption est bien une solution VBA pour c'eux et celles qui n'ont pas les moyens de s'offrir BCA.

    Tu poses ton filtre sur l'univers (via SUPERVISEUR), tu envoies ton doc via (BCA ou DocAgentOption) avec l'action Refresh au groupe d'utilisateurs sur lequel tu as posés ton filtre et le travail se fait tout seul.

    Il te reste juste à ajouter dans le AfterRefreh un ExportAsPDF avec un nom de fichier générique suivit du BOUSER.

    PS: je n'ai jamais utilisé la solution DocAgentOption car justement je dispose de BCA (très pratique)

    Je n'arrive pas à joindre un fichier ?

  12. #12
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Hum dans ce cas effectivement, ça serait plus intéressant de D'ABORD définir la sécurité dans le superviseur pour chaque utilisateur PUIS d'utiliser DocAgentOption pour rafraichir le rapport pour la liste des utilisateurs, en utilisant les paramètres de chacun.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  13. #13
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    HELP !
    J'ai passé un certain temps sur la ligne de commande et ça bloque.
    La voici :
    Application.Documents.Item("Datamart - Chiffres Carts").Reports.Item("A").AddComplexFilter "Secteur(Cart N-1)", "=<Secteur(Cart N-1)> = 94"
    Message : "Erreur d'éxecution '20' : Bad formula : Type de données incorrect (DMB0003)"

    Après plusieurs recherches, je sais qu'il bloque sur la valeur de la variable (dans le cas ci-dessus : 94). J'ai essayé de passer cette valeur dans une variable ... Rien n'y change.

    Un p'tit coup de pouce, merci.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Il s'agit bien d'une variable numérique et pas alphanumérique ? En général c'est ça. Si c'est alphanumérique il te faudra mettre des guillemets à 94 :

    Application.Documents.Item("Datamart - Chiffres Carts").Reports.Item("A").AddComplexFilter "Secteur(Cart N-1)", "=<Secteur(Cart N-1)> = ""94"""

  15. #15
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Impeccable !
    Mais alors maintenant le problème est que lorsque je retourne dans le rapport, il ne m'affiche rien. Il faut que j'aille dans "Format" "Filter". Là, je visualise bien mon filtre et lorsque je fait "OK", il m'affiche bien le rapport avec la valeur filtrer.
    Y a t'il un moyen de lui simuler cette dernière manipulation par le code ?

    Merci.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Ah oui j'ai omis ce détail: il faut rafraichir les rapports via la méthode Report.Item(i).ForceCompute

  17. #17
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Ca avance! Merci.
    Le filtre fonctionne comme je veux.


    Maintenant, j'ai le problème suivant :
    Une fois que j'ai filtrer mes 2 onglets, je veux enregistrer le résultat en fichier PDF en donnant au fichier PDF un nom qui contient (entre autre) le contenu d'une variable qui se trouve dans mon document. Cette variable (appelons là <VAR - Période>) contient l'année et le mois d'une date saisie dans une invite.
    Mais voilà, je ne trouve pas l'intruction qui permet de récupérer le contenu de cette variable.

    De même, par la suite, j'aimerai récupérer les valeurs succéssives d'un objet pour les différents enregistrements rapporter lors d'un raffraichissement.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    En fait, on ne peut pas récupérer le contenu d'une variable. On peut seulement récupérer sa formule, et l'évaluer (mais hors contexte, c'est à dire sans tenir compte des maitres. Tu risques donc de prendre des erreurs valeurmulti). Donc si tu souhaites récupérer les différentes valeurs d'une cellule en fonction d'un filtre, la seule solution est de lire directement dans le fournisseur de données (DataProvider) et de le parcourrir jusqu'à l'endroit qui t'intéresse.

    Pour récupérer la formule d'une variable : ThisDocument.DocumentVariables.Item("nom_variable").Formula

    Pour évaluer une formule :
    ThisDocument.Evaluate(formule)

  19. #19
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Encore merci.
    Je vais essayer de récupérer la donnée (qui ne vient pas d'un fournisseur de donnée) que je souhaite en la récupérant par la formule et en évaluant cette formule.
    Maintenant, tu me parles de DataProvider pour parcourir les enregistrements d'un fournisseur de donnée.
    Je ne trouve rien à ce sujet dans l'aide.
    Peux tu me mettre sur la voie ?

    Merci.

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Le dataprovider est la structure qui retourne les résultats d'une requête, sous forme de lignes donc (on peut accéder à ces données via le cube). Il se décompose en colonnes, qui correspondent aux différentes variables, et pour chacune on peut accéder à la n-ième valeur. Dans mon j'applique mon filtre aux rapports sur une variable var1, puis je parcours le data provider pour tomber sur la valeur de var1 qui m'intéresse. Avant il faut avoir repéré la position de la colonne, car dans le dataprovider on y accède via un index et nom par le nom. En gros ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 to ThisDocument.DataProviders.Item(numero_requete).Columns.Count<div style="margin-left:40px">If ThisDocument.DataProviders.Item(numero_requete).Columns.Item(i).Name = Nom_de_var1 Then Exit For</div>Next
     
    For cpt_var1 = 1 to ThisDocument.DataProviders.Item(numero_requete).Columns.Item(i).Count<div style="margin-left:40px">If ThisDocument.DataProviders.Item(numero_requete).Columns.Item(i).Item(cpt_var1)  = Valeur_var1 Then Exit For</div>Next
    cpt_var1 te donne le numéro de la première ligne pour laquelle ta variable vaut la valeur sur laquelle tu filtres. Tu accèdes donc à toute la ligne en faisant varier i.
    Voilà pour les exemples de syntaxe

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA] Appliquer filtre sur tableau
    Par sasafca dans le forum SDK
    Réponses: 2
    Dernier message: 03/07/2015, 11h45
  2. [XL-2007] copier des lignes d'une feuille à une autre et appliquer des filtres avec VBA
    Par Malek713 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/11/2010, 19h46
  3. Appliquer un filtre à un TshellListView
    Par Phébus dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/10/2005, 08h09
  4. Appliquer un filtre depuis liste déroulante
    Par samlepiratepaddy dans le forum Access
    Réponses: 6
    Dernier message: 20/10/2005, 07h43
  5. Appliquer un filtre à la source d'un contrôle
    Par marchand_de_sable dans le forum Access
    Réponses: 15
    Dernier message: 11/08/2005, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo