Bonsoir, et Salut à tous !
Hormis le blocage avec un .Value
qui n'avait pas d'objet auquel se raccrocher, dans le code initial, il me semble qu'il faudrait rappeler le b-a-ba en matière de dates lorsqu'on travaille en paramètres FR (je le précise car les choses peuvent être différentes selon les paramètres régionaux).
Il faut préciser d'abord que les dates constituent un type de données Date, type particulier faisant l'objet de traitement particulier, mais devant son clavier on a aucun moyen de différencier les types de données saisies (sauf à saisir une formule susceptible de renvoyer une valeur dans un type de données...). On frappe des touches qui envoient des caractères ! Tant qu'Excel ne reçoit que des chiffres ou des caractères pouvant entrer dans la composition de nombres ce sera interprété comme nombre. La présence d'un autre caractère quelconque suffira à faire interpréter la saisie comme texte.
Rappelons que si l'on ne force pas l'alignement dans Excel, les nombres iront se cadrer à droite dans une cellule, et le texte à gauche. Signe de reconnaissance qui a son importance en matière de date car, cadrée à droite comme les nombres, c'est une date reconnue comme date par Excel, cadrée à gauche ce sera un texte non reconnu comme date et non traité comme tel.
Lorsqu'on saisit manuellement une date, Excel l'identifiera à partir des éléments saisis : le séparateur de date utilisé [ - le tiret de façon universelle, / le slash commun à de nombreux pays], les nombres saisis pouvant représenter des quantièmes de mois et de jours, les noms de mois abrégés ou complets le cas échéant. Il se réfère aux paramètres régionaux de Windows pour opérer cette reconnaissance.
La date saisie étant reconnue comme date, il la convertit en type Date.
C'est à dire dote la cellule d'un format de date par défaut (sauf si la cellule a déjà un format autre que Standard), figurant aux paramètres régionaux, selon la forme de la saisie, et convertit la date en nombre, forme sous laquelle elle est stockée et qui permet les calculs...
VBA travaille un peu comme Excel en matière de date, mais le premier problème qu'on rencontre en utilisant des Userforms est que les contrôles accueillant des données : TextBox, ComboBox, ListBox ne connaissent que des données de type String, du texte !
Donc chaque fois qu'on sort une date d'une TextBox, on sort du texte et non une données de type Date, et si l'on veut être sûr d'avoir une date il convient par conséquent de la convertir systématiquement en Date !
Si on ne le fait pas, VBA s'en chargera tout seul s'il peut reconnaître la chaîne comme date, mais par défaut sa vision est américaine et donc des dates saisies en format FR ayant un jour inférieur à 13 verront ce dernier interprété comme étant le mois, ce qui provoque l'inversion fréquente jour/mois.
L'utilisation de la fonction Format n'est jamais une solution, car cette fonction renvoie du texte, c'est à dire qu'elle peut formater une date en texte selon le format spécifié, mais ne produit pas une données Date (et dans la cellule on sait que le format est conditionné par le format de cellule). Il peut donc y avoir conversion sauvage de la date passée à la fonction et/ou de la valeur renvoyée par la fonction.
Lorsqu'on se sert de cette fonction lors de l'affectation d'une donnée date on peut fort bien se retrouver avec une date inversée mois/jour (prise en compte comme date par Excel et cadrée à droite) ou une date insérée comme texte (cadrée à gauche, donc non reconnue comme date par Excel).
On obtient les deux cas avec le code concerné.
L'utilisation de Format est à proscrire !
La solution est de convertir explicitement la valeur issue de la TextBox lors de l'affectation : les fonctions CDate ou DateValue le permettent, et leur utilisation dirige la reconnaissance opérée par VBA au moyen des paramètres régionaux FR (que VBA ignore superbement si on ne l'y contraint pas).
J'ajoute, s'agissant de Format, que son utilisation pour affecter un nombre quelconque est tout autant une erreur, telle qu'elle figure également dans ce code [surtout si le format indiqué ne peut être reconnu par VBA...]. Le format sous laquelle une valeur apparaîtra est l'affaire du format de cellule, ce qu'on affecte est une valeur, qui ne doit en aucun cas être modifiée par l'application d'un format. Si la cellule n'a pas le format voulu, on ajoute une ligne de code pour la doter de ce format.
Tout ce bout de code est donc à remettre sur pied pour éviter que des problèmes continuent de surgir... Et si par la même occasion on faisait disparaître les Select, Selection ou ActiveCell, on finirait pas avoir un bon code !
Pour ce qui est du filtrage, je ne comprends pas vraiment la façon de procéder : ne récupérer qu'une colonne et obtenir par formules des éléments qui auraient pu être fournis par le filtrage. En tout cas hors problème de dates qui sont du texte, ça fonctionne !
Cordialement.