Date type error 13 type mismatch [Résolu]

Signaler
Messages postés
832
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
24 octobre 2020
-
Messages postés
832
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
24 octobre 2020
-
Bonjour,
Dim HistoDate() As Date
HistoDate(i) = Left$(Record, 19) 
==> Erreur : 13 : Type mismatch

Je comprends bien que la raison est que le format du string n'est pas une date valide.
Ma question : comment vérifier le string avant afin d'éviter l'erreur (msgbox si pas correct) ?
Merci

9 réponses

Messages postés
14930
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 octobre 2020
447
Bonjour

avec une regex ou l'operateur Like.
Pour Like, ça fait trop longtemps que j'ai pas codé en VB6 ou VBA pour te faire un exemple de tête mais pour les regex, voir ici (lien à copier coller)
http://regexstorm.net/tester?p=%28%280%5b1-9%5d%7c%5b1-2%5d%5b0-9%5d%7c3%5b0-1%5d%29%2f%280%5b13578%5d%7c1%5b02%5d%29%7c%280%5b1-9%5d%7c%5b1-2%5d%5b0-9%5d%7c30%29%2f%280%5b469%5d%7c11%29%7c%280%5b1-9%5d%7c%5b1-2%5d%5b0-9%5d%29%2f02%29%2f%5cd%7b4%7d&i=01%2f00%2f2020%0d%0a01%2f01%2f2020%0d%0a01%2f11%2f2020%0d%0a01%2f21%2f2020%0d%0a01%2f01%2f2020%0d%0a00%2f01%2f2020%0d%0a11%2f01%2f2020%0d%0a21%2f01%2f2020%0d%0a31%2f01%2f2020%0d%0a41%2f01%2f2020%0d%0a01%2f13%2f2020%0d%0a32%2f01%2f2020%0d%0a10%2f01%2f2020%0d%0a10%2f10%2f2020%0d%0a31%2f04%2f2020%0d%0a30%2f02%2f2020%0d%0a29%2f02%2f2019%0d%0a


Dans la case Pattern la regex, dans la case Input différent textes ressemblants à des dates.
Le seul truc c'est que le 29 février d'une année non bissextile est accepté

Tu peux voir le détail des capture en cliquant sur l'onglet "Table"
Messages postés
832
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
24 octobre 2020
2
Merci pour ta réponse mais je ne comprends pas comment on l'utilise.
Je ne vois pas de code !

Autre possibilité : j'ai un "on error goto" dans cette sub.
si erreur 13 => msgbox, exit
Messages postés
2249
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 octobre 2020
115
Bonjour
Ta question devrait être : comment vérifier une variable type Date avant afin d'éviter l'erreur (msgbox si pas correct) ?
Déjà comment obtiens-tu le tableau de Date HistoDate ? Saisie au clavier, exploration d'un fichier ou autre ?
Concernant le type Date de VB6 il y a les fonctions Year, Month et Day qui te permettent d'extraire les 3 données d'une date ( ces 3 fonctions retournent un Integer )
- entre 1 et 31 pour le numéro du jour
- entre 1 et 12 pour le mois
ensuite c'est à toi de vérifier que le jour et le mois sont corrects ( pas de 30 février ou de 31 avril par exemple )
Concernant On Error Goto celui-ci ne doit être utilisé que dans les erreurs imprévues ( coupure réseau par exemple ) . Il vaut mieux tester si des valeurs sont dans la bonne fourchette que de mettre des On Error Goto à tout bout de champ
N'ayant plus VB 6 depuis plus de 10 ans difficile de t'en dire plus .
Un salut à Whis en passant .

Messages postés
14930
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 octobre 2020
447
Salut vb

Herve, je ne sais plus comment on se sert d'une regex en vb6, je t'ai "juste" pondu la syntaxe et montré un exemple de capture.

Pour l'utilisation https://lite.qwant.com/?q=regex+vb6&client=opensearch
Messages postés
832
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
24 octobre 2020
2
"comment obtiens-tu le tableau de Date HistoDate ?"
comme je l'ai écrit, comme ceci
HistoDate(i) = Left$(Record, 19)

Quant au string Record il est construit par un sélecteur de date : il s'agit d'une form, on ne peut pas saisir une date erronée, par exemple si on choisit le mois 4 on ne peut choisir que les jours 1 à 30
l'erreur ne peut donc pas venir de là, en fait c'est mon problème : pourquoi record n'est-il parfois pas correct (2 cas sur 5.217 utilisations) ?
Messages postés
2249
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 octobre 2020
115
Bonsoir
tu ne peux obtenir ton tableau ainsi
HistoDate(i) = Left$(Record, 19)
car Left$ est une fonction pour les String alors que HistoDate est de type Date
Maintenant tu nous dis que Record n'est pas correct ( 2 cas sur 5217 utilisations )
Peux-tu préciser ces 2 cas ?
sinon tu peux utiliser la fonction CDate que convertir une chaine de caractères ( 20/12/1989 ) et valeur de type Date
Messages postés
2249
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 octobre 2020
115
Pardon : il faut lire "en valeur de type Date"
Messages postés
832
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
24 octobre 2020
2
Je ne peux peut-être pas obtenir le tableau ainsi mais c'est ainsi que ça fonctionne.
Je ne sais pas dans quelle mesure Record n'est pas correct, je ne connais pas le contenu de ce string; je ne parviens pas à reproduire l'erreur et les 2 utilisateurs différents qui ont eu le cas ne se souviennent plus comment ils on fait; maintenant chez eux ça fonctionne mais il ne savent pas non plus comment ils y sont arrivés.
Messages postés
2249
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 octobre 2020
115
Bonjour
Si tu nous mettais un exemple de ce que devrait contenir le tableau Record ?
Car ton code fonctionne si une string au bon format est entrée dans Record ( exemple 20/12/2019 soit les 2 chiffres du jour, les 2 du mois et les 4 de l'année )
Mais si
Left$(Record,19)
ne contient pas une chaine représentant une date avec le format correct cela plante ou va au On Error Goto que tu as mis .
De plus il y a les heures, minutes et secondes dans ton sélecteur . Je ne sais pas quelle incidence cela peut avoir .
Messages postés
14930
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 octobre 2020
447
Bonjour
Est ce que ta boite de saisie bloque le 29 février ?
Attention une année bissextile est:
  • soit divisible par 400
  • soit divisible par 4 mais pas par 100

Il s’agit bien d’un ou exclusif.
=> 1700, 1800, 1900 et 2100 ne sont pas bissextiles, alors que 1600 et 2000 si.
Messages postés
832
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
24 octobre 2020
2
Record peut contenir par exemple "06/03/2020 14:51:51 25.3 25.4 34.8 7.95 8.17"
dans ce cas Left$(Record,19) = "06/03/2020 14:51:51"
l'erreur vient du fait que 2 fois sur 5000 Record était vide et j'ai compris pourquoi et j'ai corrigé.
Pas besoin de vérifier si la syntaxe est correcte puisque la Form fait en sorte qu'elle le soit.
C'est donc résolu.