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.
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.
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).
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.
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
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.
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.
Je ne sais pas si la solution me convient. Je n'ai pas encore eu le temps d'essayer.
En as-tu une meilleur ?
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.
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.
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.
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 ?
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.
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.
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"""
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.
Ah oui j'ai omis ce détail: il faut rafraichir les rapports via la méthode Report.Item(i).ForceCompute
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.
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)
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.
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 :
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.
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
Voilà pour les exemples de syntaxe
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager