Filtre de dates + autres filtres
Bonjour,
Dans une discussion précédente intitulée "filtre de date vba" initiée le 19 juillet dernier, il était indiqué une solution pour effectuer un tri entre deux dates. Mais comment doit-on faire quand, en sus de ce tri entre deux dates, il faut rajouter d'autre critères numériques et / ou alphanumériques.
Concrètement, j'utilise : '"EcritAvant" est le nom de la feuille où se trouve la base
With Sheets("EcritAvant") 'de données intitulé "tblEcritAvant".
.Range("tblEcritAvant[#All]").AdvancedFilter Action:=xlFilterCopy, _ '"CritèreDébut" est l'adresse de la 1ère cellule de la zone
CriteriaRange:=.Range(CritèreDébut & ":CritèreFin" & Limite), _ 'de critères ; "CritèreFin" est la partie colonne de l'adresse
CopyToRange:=.Range(FiltreRéponseEntête), Unique:=False 'de fin de cette zone qui peut comporter plusieurs lignes.
End With '"Limite" donne la partie ligne de cette adresse de fin.
La base comporte 18 champs dont 4 sont susceptibles de varier dans des plages de valeurs propres à chacun. La zone de critères comporte donc 22 champs. Les dates sont traitées comme des entiers longs pour éviter les complications de formats nationaux.
D'avance merci pour votre temps.
Une distorsion entre ma saisie (en deux colonnes) et le texte représentée rend un paragraphe illisible. Toutes mes excuses
Concrètement, j'utilise :
With Sheets("EcritAvant")
.Range("tblEcritAvant[#All]").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=.Range(CritèreDébut & ":CritèreFin" & Limite), _
CopyToRange:=.Range(FiltreRéponseEntête), Unique:=False
End With '"Limite" donne la partie ligne de cette adresse de fin.
'"EcritAvant" est le nom de la feuille où se trouve la base de données intitulé "tblEcritAvant".
'"CritèreDébut" est l'adresse de la 1ère cellule de la zone de critères ; "CritèreFin" est la partie colonne de l'adresse de fin de cette zone qui peut comporter plusieurs lignes. "Limite" donne la partie ligne de cette adresse de fin.
Bonjour,
un fichier aurait été le bienvenu
voici un exemple
Bonsoir Monsieur,
Contexte
L'objectif poursuivi dans ce module du programme est 1) de permettre à un comptable de retrouver des informations antérieurement saisies afin de reprendre le même pattern dans la saisie d'une pièce de même type ; et 2) de servir d'outil d'audit pour s'assurer de la qualité de la saisie.
Sur la page qui est communiquée, on trouve au milieu, sur fond vert, la liste des champs de la base de données.
Le tableau du bas est en liaison avec un formulaire mis à disposition de l'utilisateur. Ce dernier dispose d'un formulaire composé d'une listbox alimentée par une macro et de textboxes, une par champ, qui affichent les données correspondant à la liste sélectionnée de la listbox.
Dans le cadre du 1er usage, seule la première ligne du tableau est utilisée ; les bornes inférieures et supérieures de chaque champ doublonné reprennent la même valeur, chacun pour ce qui le concerne. Dans le second usage, des critères complémentaires peuvent être saisis directement dans les lignes subséquentes.
Le tableau du haut vise juste à mettre en forme pour le filtre les données du tableau du bas.
Question
Le programme fonctionne tant qu'il n'y a pas de champ doublonné. Par contre, il n'affiche aucune réponse dès que les champs doublonnés ont été introduits ; il ne plante pas, mais il n'affiche rien.
Dans le fichier reçu, il est utilisé un objet ListObjects dont je ne connais ni la syntaxe détaillée, ni l'usage (je ne suis pas informaticien, me bornant à bricoler des outils pour le Cabinet) alors que j'utilise un tableau comme source de données. Serait-ce un objet parent ?
Merci d'avance pour l'aide que vous pourrez m'apporter.
S'il s'agit de faciliter la saisie, alors c'est sur l'onglet où se trouve la BdD qu'il faut filtrer.
Le programme fonctionne tant qu'il n'y a pas de champ doublonné. Par contre, il n'affiche aucune réponse dès que les champs doublonnés ont été introduits ; il ne plante pas, mais il n'affiche rien.
De quel programme s'agit-il ?
Si les données source sont structurées en "tableau excel", alors ListObjects(1) désigne ledit tableau dans le code VBA.Dans le fichier reçu, il est utilisé un objet ListObjects dont je ne connais ni la syntaxe détaillée, ni l'usage (je ne suis pas informaticien, me bornant à bricoler des outils pour le Cabinet) alors que j'utilise un tableau comme source de données. Serait-ce un objet parent ?
Pourrais-tu mettre un exemple avec quelques données (non réelles) ? sinon voici un exemple à partir de ce que j'ai compris.
Bonsoir Monsieur,
En pièce jointe, un court extrait de la base de données (colonnes AA et suivantes), seuls les noms des tiers ont été anomysés. Le comptable remplit un formulaire où les informations d'une écriture (référencée dans la colonne Pièce), il ne saisit qu'une fois les informations indispensables (date pièce, libellé, n° pièce…), l'appli génère tous les articles (les lignes) de l'écriture. Pour toujours orthographier le nom du tiers de la même façon, pour utiliser le même compte pour des achats similaires… il tape Ctrl+B qui appelle la macro qui charge la listbox sur le champ qui lui pose problème directement ou non (le plus souvent le nom) ; la macro recherche alors, dans le cas du nom, toutes les écritures où l'on trouve la chaîne de caractères qui a été tapée ; pour limiter l'affichage dans la listbox, il peut aussi spécifier des informations complémentaires comme un numéro de compte par exemple.
En usage d'audit, on peut vouloir spécifier en sus des plages de dates de saisie ou d'échéances ou encore des plages de valeur en débit comme en crédit sans que ces éléments ne soient exhaustifs.
Merci pour le temps que vous me consacrez.
l'appli génère tous les articles (les lignes) de l'écriture. Pour toujours orthographier le nom du tiers de la même façon, pour utiliser le même compte pour des achats similaires… il tape Ctrl+B qui appelle la macro qui charge la listbox sur le champ qui lui pose problème directement ou non (le plus souvent le nom) ; la macro recherche alors, dans le cas du nom, toutes les écritures où l'on trouve la chaîne de caractères qui a été tapée
Re-bonjour,
Ce que tu écris au présent, je comprends maintenant que c'est ce que tu souhaites ? ou c'est ce qui existe ?
Dans tous les cas, je ne travaille pas/jamais avec des userform, listbox, textbox qui pour moi me posent un tas de problèmes et sont longs à mettre en oeuvre, je travaille directement sur l'onglet en y mettant les valeurs de recherche. Pour les dates, je peux aménager cela car il n'est pas évident de connaître la valeur numérique correspondant à une date ... je peux le faire. Pour la autres valeurs, tu peux y mettre non pas des formules mais des validations selon listes déroulantes. Sinon les premiers caractères suffisent ou alors il faut y mettre * devant.
C'est exactement la façon dont je procède personnellement.
Mais ai-je bien compris ?
Bonjour Monsieur,
Ce qui existe, c'est une feuille de saisie dont les intitulés de colonne sont définis mais pas leur positionnement dans la feuille : l'utilisateur peut choisir, par exemple, de mettre la colonne date de saisie après le numéro de pièce si c'est ce qu'il préfère. Il indique ses choix sur une feuille de paramétrage et l'application gère la mise en forme. Ce module fonctionne parfaitement.
On rentre alors dans l'utilisation de la feuille de saisie. La personne qui saisit, qui n'est pas toujours la même sur un dossier donné, va entrer les données utiles pour générer les écritures. Afin qu'elles soient le plus homogène possible en dépit de la diversité des utilisateurs, la personne devant le clavier doit disposer d'un outil de visionnage des saisies antérieures. C'est là qu'intervient la macro Control + B qui reprend les informations de la colonne où est le focus quand la macro est appelée et affiche le userform de sélection.
La macro envoie l'information dans la zone de critères et l'outil excel de filtrage restitue la sélection. Comme je l'ai indiqué, tant que je n'introduis pas la notion de plage de valeurs, tout fonctionne comme attendu. Par contre, dès que je doublonne les colonnes où des plages sont requises, là il n'y a plus de restitution de données.
Dans l'article de M. Boisgontier du 19 juillet dernier, il indiquait une solution pour traiter ce cas mais elle ne reprenait qu'un seul critère de plage. J'aurais voulu savoir comment je pouvais étendre sa solution à plusieurs critères de plage ainsi qu'à l'introduction de un ou plusieurs critères simples comme "*texte*" par exemple.
Par ailleurs, je vais réfléchir sur la non-utilisation des userforms dans l'appli. Ils permettent une présentation plus facile d'accès pour l'utilisateur mais au détriment, comme vous le soulignez, d'une réelle lourdeur dans la programmation.
Merci beaucoup du temps que vous consacrer à ce problème