IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Inversion mois et date ?


Sujet :

Macros et VBA Excel

  1. #21
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 674
    Par défaut
    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

  2. #22
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Par défaut
    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.

  3. #23
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 674
    Par défaut
    Dans l'idée

    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
    à adapter pour les autres cas bien évidemment
    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

  4. #24
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Month("08/09/2018")
    et il y a bien d'autre piege encore
    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

  5. #25
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 674
    Par défaut
    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

    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")
    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
    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

  6. #26
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    heu.. 25 c'est pas le mois c'est le jour
    avec les tiens j'obtiens 3 1 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")
    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
    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

  7. #27
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 674
    Par défaut
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Month(ExtraireDateDepuisTexteGlobal("01/03/2019"))
    t'affichera selon tes paramètres régionaux 1 ou 3.

    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

  8. #28
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    C'est gentil de remettre en doute un code validé par toute une équipe derrière
    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 tout
    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
    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

  9. #29
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 674
    Par défaut
    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

  10. #30
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Par défaut
    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

  11. #31
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    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)
    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
    edit
    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

  12. #32
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bonjour

    Quelques exemples ne valident pas un code, surtout quand le jeu de tests est foireux.

Discussions similaires

  1. Inversion (mois et jour) dans les dates
    Par hortencia dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/02/2012, 20h03
  2. DATES : Inversions mois et jours
    Par hortencia dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/06/2011, 15h51
  3. [A-03] inversions entre jour et mois sur dates
    Par thiefer dans le forum IHM
    Réponses: 4
    Dernier message: 31/10/2008, 15h52
  4. Problème format date - SimpleDateFormat inversion mois/jour
    Par juanqui dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 07/02/2007, 15h37
  5. ajouter 1 mois à une date dans une requete
    Par alain.lc dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 04/04/2005, 13h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo