Excel VBA erreur d'exécution 13
Bonjour,
J'ai créé un formulaire de saisie avec des textBox qui doivent contenir des dates. Jusque là tout fonctionne sauf lorsque l'on ne saisit pas date dans la textBox j'ai le message excel vba erreur d'exécution 13 à la ligne correspondant au au code par exemple : Format(CDate(date_at), "m/d/yyyy") .
Est-ce qu'il y aurait un moyen de régler ce problème ou de le contourner en mettant un msgBox "vous n'avez pas saisit de date"
Je vous remercie par avance.
Private Sub valider_at_Click()
Sheets("AT").Activate
Dim k
'**************************** VALIDATION DES DONNEES SAISIES **************************************
'1. verifications des valeurs
m = 0
For Each Ctrl In UserForm1.si.Controls
k = k + Ctrl.Value
Next Ctrl
For Each Ctrl In Me.Controls
If TypeOf Ctrl Is MSForms.OptionButton Then
Cob = Ctrl.Object.Value
If Cob = "Vrai" Then m = m + 1
End If
Next Ctrl
If m < 3 Then
Select Case MsgBox("Veuillez compléter les 3 champs SI, ADMIN et STATUT", vbCritical, "Champs manquant")
End Select
'MsgBox ("Veuillez compléter les 3 champs SI, ADMIN et STATUT ")
Exit Sub
End If
With Sheets("AT")
'Declaration des variables
Dim i As Integer
'Affectation des variables
i = 1
'Boucle chacune des cellules de la colonne B
Do While Cells(i, 1) <> ""
Cells(i, 1).Offset(1, 1).Select
i = i + 1 'on incrémente le compteur de la boucle while
Loop
'affichage des infos du formulaire dans la base de donnée
ActiveCell.Value = nom_at
ActiveCell.Offset(0, 1).Value = prenom_at
ActiveCell.Offset(0, 2).Value = Me.admin1.ActiveControl.Caption
ActiveCell.Offset(0, 3).Value = Me.si.ActiveControl.Caption
ActiveCell.Offset(0, 4).Value = Activite_at
ActiveCell.Offset(0, 5).Value = entite_at
ActiveCell.Offset(0, 6).Value = Format(CDate(date_at), "m/d/yyyy")
ActiveCell.Offset(0, 7).Value = domaines_utilisateurs_at
ActiveCell.Offset(0, 8).Value = Me.statut.ActiveControl.Caption
ActiveCell.Offset(0, 9).Value = recap_at
ActiveCell.Offset(0, 10).Value = commentaires_at
ActiveCell.Offset(0, 11).Value = Format(CDate(date_dernier), "m/d/yyyy")
'On test si l'enregistrement est le premier de la table
If ActiveCell.Offset(-1, -1).Value = "N°Assistance" Then
ActiveCell.Offset(0, -1).Value = 1
Else
ActiveCell.Offset(0, -1).Value = ActiveCell.Offset(-1, -1) + 1
End If
End With
Unload Me 'fermeture du formulaire
UserForm1.MultiPage1.Value = 0
UserForm1.Show
End SubBonjour,
Tu peux tester un truc du style :
If Me.date_at.Value <> "" Then
ActiveCell.Offset(0, 6).Value = Format(CDate(date_at), "m/d/yyyy")
Else
MsgBox "Merci de saisir une date ..."
End IfEn espèrant que cela t'aide ...
Bonsoir,
.....Value = Format(CDate(date_at), "m/d/yyyy")Tu insères des dates converties en texte, au format américain !?
Tu insères des dates converties en texte, au format américain !?
A priori ... c'est sa liberté ... non ... ??? ... au beau Kenny ...
Salut James !
Certes ! Nul n'en disconvient ! Mais je suis toujours intéressé dans un cas de ce genre, de savoir s'il s'agissait du but effectivement recherché, ou bien s'il s'agit d'un sous-produit résultant soit d'un objectif autre, soit de l'élimination d'une anomalie... !
Cordialement.
Bonjour,
Merci pour vos réponses.
Effectivement j'ai du utiliser ce format car j'ai eu des soucis de dates inversées (mois et jour) lorsque je validais mes données.
J'ai trouvé cette solution qui semble fonctionner....après si il y en a une autre je suis preneur
Bonjour,
Elle fonctionne dans la mesure où tu donnes à VBA une chaîne où mois et jour sont inversés, qu'il va convertir en les inversant...
Ce n'est pas la solution la plus rationnelle, et elle risque de te réserver des surprises un jur ou l'autre...
Si tu écris :
....Value = date_attu auras une inversion si le jour est inférieur à 13...
En écrivant :
....Value = Format(CDate(date_at), "m/d/yyyy")tu fais comme précédemment mais tu inverses préalablement jour et mois en prévision de l'inversion qui suivra...
Il faut bien voir que la valeur extraite d'une TextBox est une valeur String (jamais Date) et en utilisant Format tu produis aussi toujours une valeur String (jamais Date).
La solution logique est normalement :
....Value = CDate(date_at)Là tu envoies à la cellule une date, obtenue par conversion de la chaîne en date avec CDate : il n'y a pas inversion dans ce cas car la reconnaissance du caractère Date est opérée selon les paramètres régionaux de Windows (soit les paramètres FR), alors que dans les deux cas précédents la conversion était automatique (en intervenant automatiquement, VBA applique les paramètres de reconnaissance US).
Cela peut ne pas suffire si l'affectation à la cellule est différée (passage par variable intermédiaire...), ce qui permet à VBA de réinterpréter la date et opérer une nouvelle conversion en inversant... La parade dans un tel cas consiste à convertir la chaîne convertie en date en entier Long (avec CLng), valeur qui ne pourra plus être modifiée et correspond à la valeur de stockage d'une date dans Excel et VBA.
Cordialement.
James007 a écrit :Bonjour,
Tu peux tester un truc du style :
If Me.date_at.Value <> "" Then ActiveCell.Offset(0, 6).Value = Format(CDate(date_at), "m/d/yyyy") Else MsgBox "Merci de saisir une date ..." End IfEn espèrant que cela t'aide ...
Bonjour,
Cela fonctionne j'ai bien une message Box sauf que lorsque je clique sur le bouton valider et bien les données se retrouvent dans le tableau sans les dates.
MFerrand a écrit :Bonjour,
Elle fonctionne dans la mesure où tu donnes à VBA une chaîne où mois et jour sont inversés, qu'il va convertir en les inversant...
Ce n'est pas la solution la plus rationnelle, et elle risque de te réserver des surprises un jur ou l'autre...
Si tu écris :
....Value = date_attu auras une inversion si le jour est inférieur à 13...
En écrivant :
....Value = Format(CDate(date_at), "m/d/yyyy")tu fais comme précédemment mais tu inverses préalablement jour et mois en prévision de l'inversion qui suivra...
Il faut bien voir que la valeur extraite d'une TextBox est une valeur String (jamais Date) et en utilisant Format tu produis aussi toujours une valeur String (jamais Date).
Merci
La solution logique est normalement :
....Value = CDate(date_at)Là tu envoies à la cellule une date, obtenue par conversion de la chaîne en date avec CDate : il n'y a pas inversion dans ce cas car la reconnaissance du caractère Date est opérée selon les paramètres régionaux de Windows (soit les paramètres FR), alors que dans les deux cas précédents la conversion était automatique (en intervenant automatiquement, VBA applique les paramètres de reconnaissance US).
Cela peut ne pas suffire si l'affectation à la cellule est différée (passage par variable intermédiaire...), ce qui permet à VBA de réinterpréter la date et opérer une nouvelle conversion en inversant... La parade dans un tel cas consiste à convertir la chaîne convertie en date en entier Long (avec CLng), valeur qui ne pourra plus être modifiée et correspond à la valeur de stockage d'une date dans Excel et VBA.
Cordialement.
Bonjour et merci MFerrand.
Superbe explications.