OK,
dans ce cas tu peux passer par une variable de type Variant, elle prendra le type selon la valeur attribuée (une date avec la fonction, du texte avec ="").
Version imprimable
OK,
dans ce cas tu peux passer par une variable de type Variant, elle prendra le type selon la valeur attribuée (une date avec la fonction, du texte avec ="").
Que dois-je modifier dans mon code pour ne plus avoir de pb ? J'ai l'impression d'être très près du but et donc très peu de modifs à effectuer dans mon code ? Je me trompe ? Je ne cherche pas la "pureté" du code mais simplement que cela fonctionne.
J'avoue être un peu déboussolé devant les discussions de spécialistes. Je rappelle que je débute...
Cdlt.
Jérôme.
Dans l'idée
à adapter pour les autres cas bien évidemment :)Code:
1
2
3
4
5
6
7
8
9
10 Dim PO_Date As Variant .... If IsDate(Range("C9").Value) Then PO_Date = ExtraireDateDepuisTexteGlobal (Range("C9").Value) Else PO_Date = "" End If ... Range("E" & y).NumberFormat = "" Range("E" & y).Value = PO_Date
bonsoir
@jean philippe André
ce n'est pas le dateserial que je remet en cause mais la facon d'annalyser et splitter strdate qui ne peut fonctionner qu'avec le format francais
en effet si tu injecte un format qui est different du xldateorder ben c'est capout avec ton select case
tandis que les fonctions generique (day,month,year) fonctionnent et donne la meme chose avec les trois format
exemple avec month
;)Code:
1
2
3 msgbox month("12/25/2018") msgbox month("25/12/2018") msgbox month("2018/12/25")
pas besoins de splitter si la date est valide et fait un len de 10 et si elle fait pas un len de 10 on annalyse pas strdate mais cdate(strdate) ;)
et ENCORE !! on a quand meme un soucis avec les dates avec des jour /mois <12
ici 09 sera pris comme le mois en fonction de la region parametrée (france)sauf que c'est pas forcé que ce soit exacte mais malheureusement c'est la que s'arrete toute l'intuitivité de VBA
et il y a bien d'autre piege encore ;)Code:MsgBox Month("08/09/2018")
peut etre pour etre sur d'analyser correctement par exemple
je ferais un test de date avec format voir si la chaine reste identique comme ca je peut determiner le format dans le quel elle a été injectée
en effet si je fait
if format(strdate,"dd/mm/yyyy") =strdate then x=1
if format(strdate,"mm/dd/yyyy") =strdate then x=0
if format(strdate,"yyyy/mm/dd") =strdate then x=2
parti de la oui tu peux splitter et tu sais ce que vaut tableau(0,1,2) dans un select case x car x sera l'ordre de la date injectée et non xldateorder;)
Cela reste globalement inutile si on part du postulat que le format de date visible est celui qui correspond bien aux parametres régionaux.
Tu utilises un exemple bidon, car il n'existe pas de 25e mois, donc aucun risque.
Que te donnent plutôt
Et je te fais grace du fait que même aui format québécois (et donc avec AAAA-MM-JJ en format standard), j'obtiens respectivement 1 3 et 1Code:
1
2
3 msgbox month("01/03/2019") msgbox month("03/01/2019") msgbox month("2019/01/03")
re
heu.. 25 c'est pas le mois c'est le jour
avec les tiens j'obtiens 3 1 1
parce que justement c'est la ou je disais tout a l'heure qu'il y avait un piege c'est les jour/mois <12 vba les identifie avec sa region paramétrée et donc La !! que s'arrete ca capacité a traduire une dateCode:
1
2
3 MsgBox Month("01/03/2019") MsgBox Month("03/01/2019") MsgBox Month("2019/01/03")
en effet rien ne dis que ton 1 er msgbox n'est pas le 3 janvier 2019 en format "mm/dd/yyyy"
a tu essayé la fonction avec le select case avec les trois format ?
C'est gentil de remettre en doute un code validé par toute une équipe derrière :roll:
Ce qui est ridicule, car encore une fois tu biaises ton raisonnement :
A/ Passer à Month(TaString) ca implique 2 traitements
1 - transformer TaString en TaDate avec un CDate()
2- déterminer le mois de TaDate
B/ Passer à Month(TaDate) évite toute ambiguité.
Tu trouveras bien évidemment que
t'affichera selon tes paramètres régionaux 1 ou 3.Code:MsgBox Month(ExtraireDateDepuisTexteGlobal("01/03/2019"))
Bref, on palabre (encore) inutilement ici.
licpegpon, ca donne quoi ta mise à jour ?
je ne met pas en doute ce qui a été fait je dis seulement l'association split,select case xldateorder n'est pas suffisante c'est toutCitation:
C'est gentil de remettre en doute un code validé par toute une équipe derrière
injecte une date format us "12/25/2019" tu verra ou meme une chaine bidon
aucun gardefou ,aucune gestion d'erreur,aucune annalyse du format injecté en amont
sans parler du test isdate absent dans le code original qui tu en conviendra dans une fonction sensée recevoir une chaine string et non une date devrait etre de rigueur et pourrait eviter des plantages inutiles
de plus le "as date" de la fonction elle meme ne permet aucune gestion d'erreur ou evitement d'erreur ,c'est pour cela que je l'ai mis a "as variant"
ca m'étonnerais fortement que toi ayant les connaissance que tu a et connaissant certainement plus que moi les pieges avec les dates ,tu te contente de ce code ;) ca serait le monde a l'envers
Tu peux continuer ta masturbation intellectuelle Patrick
J ai l impression d avoir déclenché une avalanche d interrogations entre experts VBA !!
Pour ma part (modestement), je vais tester ce qui me semble le plus simple c est à dire conduisant à un minimum de modifications, rajouts, ...
A la vue des échanges dans ce post je suis impressionné par le niveau de compétences de nombreux développeurs et la réactivité des réponses données. Cela confirme ce que m ont dit des développeurs de ma société : le site developpez.com est incontournable dès que l on veut des pistes, de l aide, des exemples, ... Vraiment top !!
Cdlt.
Jérôme
re
rien voir avec la mastubation juste un peu de bon sens
avec split il faut absolument annalyser le string (strdate) avant d'allouer (l'annee,mois,jour) a tableau(0,1,2)
editCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 Function ExtraireDateDepuisTexteGlobal(strDate As String) As Variant Dim annee&, mois&, jour&, X&, Tableau As Variant ExtraireDateDepuisTexteGlobal = "Invalid Date" If IsDate(strDate) Then 'première étape, on transforme le texte en tableau avec la fonction Split Tableau = Split(strDate, Application.International(xlDateSeparator)) If Format(strDate, "dd/mm/yyyy") = strDate Then X = 1 Else X = 0 If Val(strDate) > 31 Then X = 2 Select Case X Case 0 'MJA annee = Tableau(2) mois = Tableau(0) jour = Tableau(1) Case 1 'JMA annee = Tableau(2) mois = Tableau(1) jour = Tableau(0) Case 2 'AMJ annee = Tableau(0) mois = Tableau(1) jour = Tableau(2) End Select ExtraireDateDepuisTexteGlobal = DateSerial(annee, mois, jour) End If End Function Sub test() MsgBox ExtraireDateDepuisTexteGlobal("31/02/2019") 'injection d'une date format FR MsgBox ExtraireDateDepuisTexteGlobal("25/12/2019") 'injection d'une date format FR MsgBox ExtraireDateDepuisTexteGlobal("12/25/2019") 'injection d'une date format US MsgBox ExtraireDateDepuisTexteGlobal("2019/12/25") MsgBox ExtraireDateDepuisTexteGlobal("2019/122/25") End Sub
correction pour le x=2 ce test est plus sur pour faire la différence entre invalide et le format yyyy/mm/dd
Code:If Len(Tableau(0)) = 4 Then X = 2
Bonjour
Quelques exemples ne valident pas un code, surtout quand le jeu de tests est foireux.