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 ="").
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 ="").
Cycle de vie d'un bon programme :
1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise
Pas de question technique par MP, je ne réponds pas
Mes ouvrages :
Migrer les applications VBA Access et VBA Excel vers la Power Platform
Apprendre à programmer avec Access 2016, Access 2019 et 2021
Apprendre à programmer avec VBA Excel
Prise en main de Dynamics 365 Business Central
Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
Pensez à consulter la FAQ Excel et la FAQ Access
Derniers tutos
Excel et les paramètres régionaux
Les fichiers Excel binaires : xlsb,
Autres tutos
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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![]()
Cycle de vie d'un bon programme :
1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise
Pas de question technique par MP, je ne réponds pas
Mes ouvrages :
Migrer les applications VBA Access et VBA Excel vers la Power Platform
Apprendre à programmer avec Access 2016, Access 2019 et 2021
Apprendre à programmer avec VBA Excel
Prise en main de Dynamics 365 Business Central
Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
Pensez à consulter la FAQ Excel et la FAQ Access
Derniers tutos
Excel et les paramètres régionaux
Les fichiers Excel binaires : xlsb,
Autres tutos
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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![]()
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
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 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 msgbox month("01/03/2019") msgbox month("03/01/2019") msgbox month("2019/01/03")
Cycle de vie d'un bon programme :
1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise
Pas de question technique par MP, je ne réponds pas
Mes ouvrages :
Migrer les applications VBA Access et VBA Excel vers la Power Platform
Apprendre à programmer avec Access 2016, Access 2019 et 2021
Apprendre à programmer avec VBA Excel
Prise en main de Dynamics 365 Business Central
Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
Pensez à consulter la FAQ Excel et la FAQ Access
Derniers tutos
Excel et les paramètres régionaux
Les fichiers Excel binaires : xlsb,
Autres tutos
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 date
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
C'est gentil de remettre en doute un code validé par toute une équipe derrière
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 : Sélectionner tout - Visualiser dans une fenêtre à part MsgBox Month(ExtraireDateDepuisTexteGlobal("01/03/2019"))
Bref, on palabre (encore) inutilement ici.
licpegpon, ca donne quoi ta mise à jour ?
Cycle de vie d'un bon programme :
1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise
Pas de question technique par MP, je ne réponds pas
Mes ouvrages :
Migrer les applications VBA Access et VBA Excel vers la Power Platform
Apprendre à programmer avec Access 2016, Access 2019 et 2021
Apprendre à programmer avec VBA Excel
Prise en main de Dynamics 365 Business Central
Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
Pensez à consulter la FAQ Excel et la FAQ Access
Derniers tutos
Excel et les paramètres régionaux
Les fichiers Excel binaires : xlsb,
Autres tutos
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 toutC'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 codeca serait le monde a l'envers
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
Tu peux continuer ta masturbation intellectuelle Patrick
Cycle de vie d'un bon programme :
1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise
Pas de question technique par MP, je ne réponds pas
Mes ouvrages :
Migrer les applications VBA Access et VBA Excel vers la Power Platform
Apprendre à programmer avec Access 2016, Access 2019 et 2021
Apprendre à programmer avec VBA Excel
Prise en main de Dynamics 365 Business Central
Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
Pensez à consulter la FAQ Excel et la FAQ Access
Derniers tutos
Excel et les paramètres régionaux
Les fichiers Excel binaires : xlsb,
Autres tutos
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)
edit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part If Len(Tableau(0)) = 4 Then X = 2
mes fichiers dans les contributions:
mail avec CDO en vba et mail avec CDO en vbs dans un HTA
survol des bouton dans userform
prendre un cliché d'un range
si ton problème est résolu n'oublie pas de pointer :: ça peut servir aux autres
et n'oublie pas de voter
Bonjour
Quelques exemples ne valident pas un code, surtout quand le jeu de tests est foireux.
Partager