Bonjour à tous...
L'inversion mois/ jour d'une date est un problème récurrent en VBA, dû au fait que toute chaîne (donnée String) est susceptible d'être automatiquement convertie en date par VBA, qui lui appliquera dès lors le format américain pour reconnaître la chaîne en tant que date, ce qui provoque l'inversion dès lors que le jour est inférieur à 13...
Dès lors toute date sous forme texte doit être explicitement convertie (CDate ou DateValue), ce qui conduit VBA à utiliser les paramètres régionaux du système pour opérer la reconnaissance en tant que date.
Ceci fonctionne bien par exemple lors de l'affectation d'une valeur de TextBox (valeur texte) à une cellule, si la donnée convertie est immédiatement affectée (VBA n'a plus la main sur elle dès lors qu'elle est dans Excel), mais si VBA a l'occasion de réintervenir avant affectation définitive, il peut toujours reconvertir et provoquer l'inversion.
La parade est alors d'opérer une double conversion : conversion en nombre (CLng entier long) du texte converti en date :
vdate = CLng(CDate(txtdate))
La date, convertie en sa valeur numérique n'est plus susceptible de transformation. Il convient alors de veiller lors de l'affectation, à mettre la cellule au format date voulue (car si la cellule est au format Standard, Excel ne lui appliquera plus alors un format automatique de date par défaut...)
Dans l'autre sens (récupération d'une date dans une cellule), l'objet Range dispose d'une propriété spécifique :
vdate = .Cells(x, y).Value2
Value2 permet de récupérer une valeur date sous sa forme numérique de stockage, qui ne pourra alors faire l'objet de conversion automatique.
En ce qui concerne les variables destinées à accueillir des dates, pour ma part (sauf exception !) je les laisse toujours en type Variant, ce qui lors de la manipulation de données représentatives de dates, qui peuvent être de type String, Long ou Date, évite les incompatibilités de type...
Cordialement.