Format date mm/dd/yyyy pour la première quinzaine du mois
Bonjour tout le monde,
J'ai créé un tableau excel, que je complète à partir d'un formulaire. Je souhaite intégrer une date à chacune de mes entrées et c'est là que je rencontre un problème, au niveau du format de la date.
La première quinzaine du mois présente le format mm/dd/yyyy
La seconde quinzaine du mois présente le format dd/mm/yyyy, qui est le bon.
Cela devrait être plus explicite sur mon fichier que je joins.
Quelqu'un aurait-il une solution à ce problème ?
Merci beaucoup, parce que je suis complètement bloqué.
Bonjour,
Eternel problème...
ActiveCell = CDate(TextDate.Value)Cordialement.
Bonjour MFerrand,
Je vous remercie pour votre rapidité.
Je dois encore faire une mauvaise manœuvre, car cela ne fonctionne pas.
J'ai un message d'erreur : erreur d'exécution 13
Private Sub TextDate_Change()
ActiveCell = CDate(TextDate.Value)
End Sub
Encore merci !
Bonsoir,
A quoi correspond ActiveCell?
Cdlt.
Bon !
D'abord on va mettre un contrôle sur la date au niveau dela saisie, toujours ça de gagné :
Private Sub TextDate_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If TextDate <> "" Then
If Not IsDate(TextDate.Value) Then
MsgBox "Saisir une date valide !", vbInformation, "Date invalide"
Cancel = True
End If
End If
End SubAinsi si un souci apparaît il sera réglé en amont de la validation...
Ensuite, il serait dommage de mettre un tableau Excel et d'oublier qu'on en a mis un ! Ces tableaux présentent deux particularités intéressantes :
- Excel ajoute un nom correspondant au tableau, automatiquement, nom qui correspond à la partie données du tableau, et ce nom est utilisable en VBA comme un autre nom de plage ! (attention, ce n'est pas tout à fait le cas dans Excel, mais pour VBA on a un nom tombé du ciel utilisable).
- Et ces tableaux ont aussi la particularité que si tu places une ligne de données sous le tableau, hop ! Excel l'intègre automatiquement au tableau !
[Tableau5].Rows.Count te donne à tout moment le nombre de lignes, donc le numéro de la dernière (compté dans le Tableau, pas dans la feuille), et travaillant avec un Tableau (comme avec une plage nommée) on peut oublier la feuille, et toutes les contorsions pour trouver la bonne ligne... ! On l'aura avec +1 dans le tableau [juste une petite difficulté en démarrant avec un tableau vide, car il doit obligatoirement contenir une ligne, il faut donc la tester si ta dimension de tableau est 1 pour savoir s'il faut affecter en ligne 1 ou 2, mais une fois affectée la ligne 2 tout roule, tu peux éventuellement supprimer la condition si le tableau ne doit être jamais vide par la suite, sinon la condition étant là elle peut y rester].Tu vois donc comment avec ces éléments dont tu disposais, tu disposes aisément de ta ligne d'insertion !
Je ne raffole pas non plus des énumérations procédant à une affectation cellule par cellule [ça m'endort !
Comme tu as donné des noms à tes contrôles ne permettant pas spontanément de les parcourir en boucles dans l'ordre voulu, on va un peu forcer la chose et mettre ces noms dans un tableau :
ctl = Split("x TextProjet ComboTâche TextDurée")TextDate est absent, remplacé par un "x" pour marquer sa position (indice 0) car on traitera spécifiquement la date, mais les indices 1 à 3 de ce tableau renverra les noms des contrôles dans le bon ordre...
[NB- Il est toujours possible de faire des boucles, et il y a d'autres méthodes, tu auras l'occasion d'en découvrir d'autres plus tard...]
Pour faire bonne mesure dans les expérimentations, on ne va pas affecter directement aux cellules on va affecter à un tableau (encore un !!!). Donc avec une boucle de 1 à 3 on va affecter à notre tableau final les valeurs des contrôles :
For i = 1 To 3
DPTD(i) = Controls(ctl(i)).Value
Next iEt on affecte également la date :
DPTD(0) = CDate(TextDate.Value)Et au final on affecte la ligne de données en une seule fois :
.Cells(lni, 1).Resize(, 4).Value = DPTDIci, vu la quantité de données, on ne va pas gagner grand chose, quoique par rapport à tes sélections successives qu'on peut assimiler à ramper sur la feuille, ce sera infiniment plus rapide ! On gagne en rapidité, en réduisant au minimum les interactions avec Excel et en réalisant le maximum d'opérations hors Excel...
Comme il m'a semblé que la date était obligatoire, on met un contrôle sur le fait que sa saisie a eu lieu. Pour les autres, à toi de voir, la Tâche était déjà bloquante, rien de changé à cet égard.
Cela donne donc :
Private Sub CommandNouvelle_entrée_Click()
Dim lni%, i%, ctl, DPTD(3)
If TextDate.Value = "" Then
MsgBox "Saisir une date !", vbInformation, "Date manquante"
TextDate.SetFocus: Exit Sub
End If
ctl = Split("x TextProjet ComboTâche TextDurée")
With [Tableau5]
If .Cells(1, 1) <> "" Then lni = .Rows.Count + 1 Else lni = 1
For i = 1 To 3
DPTD(i) = Controls(ctl(i)).Value
Next i
DPTD(0) = CDate(TextDate.Value)
.Cells(lni, 1).Resize(, 4).Value = DPTD
End With
MsgBox "Votre tâche a bien été ajoutée à votre base de données", vbInformation, _
"CONFIRMATION"
End SubJe me suis permis de supprimer ta procédure d'ouverture, pas vraiment utile à l'intérieur, tu ouvres quand il n'est pas chargé, donc de l'extérieur, et tu le relances quand il a été masqué, donc encore à partir d'un autre élément...
Pour les dates ça fonctionne... les raisons d'un erreurs 13 étant nombreuses il faudrait voir exactement comment tu avais procédé pour expliquer la tienne.
Par exemple, j'avais voulu dans un premier temps faire une boucle sur les 4 éléments en utilisant la fonction Iif pour différencier l'affectation de la date des autres... résultat : erreur 13 ! J'avais oublié que Iif (un peu équivalent de SI mais ne fonctionnant pas pareil justement) évalue les deux termes dont un seul sera renvoyé selon la condition, donc pas de problème pour convertir la date mais au contrôle suivant, impossibilité d'évaluer sa conversion en date, d'où erreur 13...
Cordialement.
Bonsoir,
Merci beaucoup !
Je testerai tout cela dès lundi, au travail car je n'ai pas office sur mon ordinateur, je ne peux pas tester maintenant malheureusement.
Par contre, je vois que tu as modifié beaucoup de choses, et j'aimerai limiter un maximum les modifications, mais n'y connaissant pas grand chose, je voulais savoir si ma base était mauvaise. N'y a t'il pas moyen de juste modifier la partie concernant les dates pour résoudre mon problème ?
Merci beaucoup en tout cas
Bonjour,
Alors, je n'ai pas compris comment tu as fait .. parce que si je remets le code dans mon fichier à moi, cela ne fonctionne pas.
Sur ton fichier, c'est top top top ! Merci beaucoup !
Par contre, comment faire si je souhaite ajouter des colonnes à mon tableau ?
Il n'y a pas de raison que cela ne fonctionne pas si ton fichier modèle était conforme au fichier sur lequel tu veux appliquer...
Si cela ne fonctionne pas donc, c'est qu'il y a des différences entre les deux fichiers, qu'il convient de cerner.
Et logiquement cela se traduit en principe par une erreur d'exécution, ou une erreur de compilation, qu'il serai bon de décrire pour tenter de déceler la source de ce dysfonctionnement.
Cordialement.