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 :

CDate pour une date dans une langue autre que celle du système


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Octobre 2020
    Messages : 17
    Points : 20
    Points
    20
    Par défaut CDate pour une date dans une langue autre que celle du système
    Bonjour!

    J'ai fait une super macro pour formater des dates du type "01/JAN/2020" vers "01/01/2020"
    (j'utilisais simplement CDate )

    Tout allait bien jusqu'à ce que je change l'affichage de la date de mon système Windows 10 (anglais vers français) et que je me heurte à une incompatibilité de type.
    J'ai cherché un moment avant de comprendre que seules les dates dont le mois est écrit en français sont converties.

    exemple :
    CDate("01/JAN/2020") fonctionne (JAN est le début de JANVIER/JANUARY)
    CDate("01/MAY/2020") ne fonctionne plus, CDate("01/MAI/2020") lui fonctionne

    Je pense qu'il y a plus malin que de faire une boucle qui traduirait les mois, je fais donc appel à votre expertise

    Bonne journée

  2. #2
    Membre éprouvé
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Points : 1 141
    Points
    1 141
    Par défaut
    Bonjour,

    Le sujet est récurrent.
    Une des dernières discussions en date (pun intended...) est disponible ici.

    Si vos données sont stockées dans des cellules Excel, la méthode qui est à mon avis la plus simple est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rng.TextToColumns DataType:=xlFixedWidth, FieldInfo:=Array(0, xlDMYFormat)
    Rng est un objet de type Range.

    Si une autre méthode convient mieux à votre besoin et que vous avez des questions sur son utilisation, n'hésitez pas à les formuler.

    Cdt

  3. #3
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Octobre 2020
    Messages : 17
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    comme d'autres j'imagine, j'ai cru que leur problème n'était pas le même que le mien d'où la précision dans mon titre
    Effectivement en utilisant le code que vous m'avez fournis et à l'aide la page dont vous avez donner le lien, j'arrive à gérer les dates anglaises/françaises, indépendamment de la langue de mon système.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Public Sub TestDate()
        Dim Dat As Date, Rng As Range
        Set Rng = ThisWorkbook.Sheets(1).Cells(1, 1)
        Rng.Value = "20/04/14"
        Rng.TextToColumns DataType:=xlFixedWidth, FieldInfo:=Array(0, xlYMDFormat)
        Dat = Rng.Value
        MsgBox Day(Dat) & "/" & Month(Dat) & "/" & Year(Dat)
    End Sub
    Pour autant j'ai beaucoup de mal à comprendre cette ligne de code en effet :
    Rng.TextToColumns DataType:=xlFixedWidth, FieldInfo:=Array(0, xlDMYFormat)
    Rng.TextToColumns parse l'information présente dans le Rng -> ok, mais j'ai du mal à voir où "transit" l'info. Où est stocké "Rng.TextToColumns". Ma cellule A1 est la même avant et après cette ligne de code edit : RngTextToColums modifie la cellule en direct

    DataType:=xlFixedWidth, je ne trouve que peu d'information, cette option permet à excel de déterminer tout seul la taille des items qu'on parse? JJ MMM AAAA dans mon cas? Il identifie de lui même le "/" ?
    FieldInfo:=Array(0, xlDMYFormat) permet d'interprêter la donnée parsée par xlFixedWidth comme une date -> ok mais pourquoi le "0" en premier élément de l'array, on parle de numéro de colonne dans la doc mais de quelle colonne parle-t-on ici?

    j'utilise cette doc : https://docs.microsoft.com/fr-fr/off....texttocolumns

    Mais surtout qu'est ce qui change par rapport au cdate pour que maintenant il interprête MAY ou MAI indifféremment?

    Ca fait beaucoup de question j'en conviens et vais continuer de chercher/tester de mon côté
    Mon problème est résolu en tout cas, merci beaucoup

  4. #4
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    Bonjour,
    Citation Envoyé par iVBAveADream Voir le message
    Mon problème est résolu en tout cas,
    Dans ton exemple, c'est exact mais si tu changes ta date avec "05/04/14" tu risques de déchanter mais comme ton souci était avec un mois alphabétique tu ne devrais pas avoir de problème.

  5. #5
    Membre éprouvé
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Points : 1 141
    Points
    1 141
    Par défaut
    Bonjour,

    Citation Envoyé par iVBAveADream Voir le message
    Pour autant j'ai beaucoup de mal à comprendre cette ligne de code en effet :
    Rng.TextToColumns DataType:=xlFixedWidth, FieldInfo:=Array(0, xlDMYFormat)
    TextToColumns est une méthode de l'objet Range. Comme vous l'avez compris, cette méthode vient modifier directement la valeur de la cellule et transforme une chaîne de caractères en un type de données choisi par l'utilisateur.

    Citation Envoyé par iVBAveADream Voir le message
    DataType:=xlFixedWidth, je ne trouve que peu d'information, cette option permet à excel de déterminer tout seul la taille des items qu'on parse?
    TextToColumns permet entre autre de transformer des fichiers texte en fichiers Excel. Par exemple un fichier CSV peut être ouvert directement dans Excel, qui interprète nativement chaque ligne du fichier texte comme le contenu d'une cellule de la colonne A.
    L'application de TextToColumns à cette colonne A permet alors à Excel de transformer le contenu texte de la colonne A en un ensemble de valeur (qui peuvent être numériques, textuelles ou dates) réparties sur les colonnes A, B, C etc.
    Pour transformer une chaîne de caractères en une série de cellules Excel, la fonction doit savoir comment est formaté le texte initial. C'est le rôle de l'argument DataType.
    Pour reprendre mon exemple d'un fichier CSV, il s'agit généralement de texte de longueur variable délimité par des points-virgules (ou un autre séparateur selon le format exact). On utilisera alors xlDelimited (en fournissant en plus le caractère qui sert de délimiteur).
    Mais on peut également imaginé du texte constitué d'un ensemble de valeurs numériques qui sont toutes écrites sur 10 caractères exactement. Dans ce cas, on utilisera l'argument xlFixedWidth pour préciser à Excel quelle façon il doit interpréter les chaînes de caractères qu'on lui fournit (et normalement, on donne aussi à Excel la longueur de chaque valeur textuelle).

    Ce que j'ai écrit ci-dessus n'est qu'une explication générique.
    Dans le cas qui vous intéresse, on utilise TextToColumns sur une cellule qui ne contient qu'une seule valeur. Utiliser xlFixedWidth ou xlDelimited est sans impact, et il n'est même pas nécessaire de préciser à Excel le 2ème argument (à savoir la longueur de chaque élément ou le délimiteur à utiliser). Excel va parser l'intégralité du contenu de la cellule et essayer de l'interpréter comme une unique valeur.


    Citation Envoyé par iVBAveADream Voir le message
    FieldInfo:=Array(0, xlDMYFormat) permet d'interprêter la donnée parsée par xlFixedWidth comme une date -> ok mais pourquoi le "0" en premier élément de l'array, on parle de numéro de colonne dans la doc mais de quelle colonne parle-t-on ici?
    Comme j'ai essayé de le dire maladroitement dans mon texte ci-dessus, TextToColumns prend une chaîne de caractère et essaie de la transformer en une série de valeurs. Ce sont ces différentes valeurs qui correspondent aux "colonnes" de la documentation Microsoft.

    Prenons le cas d'un texte délimité par des virgules : «123,14/10/2020,iVBAveADream»
    Excel va convertir ce texte en 3 valeurs, c'est-à-dire 3 colonnes.
    La première (numérotée 0) doit être interprétée comme un nombre, la deuxième (numérotée 1) doit être interprétée comme une date, et la dernière (numérotée 2) doit être interprétée comme une chaîne de caractère.
    L'argument FieldInfo permet d'indiquer tout cela à Excel.

    Dans le cas qui vous intéresse, la cellule à convertir ne contient qu'une seule valeur. Il n'y a donc qu'un seul format de colonne à spécifier : celui de la colonne '0'. Et ce format est une date, écrite sous la forme Jour Mois Année (on utilise donc xlDMYFormat pour l'indiquer à Excel).


    Pour finir, il peut être intéressant de vous renseigner sur la fonction DateSerial. Elle fonctionne assez différemment de TextToColumn et chacune a donc ces avantages et inconvénients.
    N'hésitez à échanger sur le sujet avec d'autres membres du forums, qui pourront vous donner un point de vue différent du mien.

    Cdt

  6. #6
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Octobre 2020
    Messages : 17
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par anasecu Voir le message
    Bonjour,


    Dans ton exemple, c'est exact mais si tu changes ta date avec "05/04/14" tu risques de déchanter mais comme ton souci était avec un mois alphabétique tu ne devrais pas avoir de problème.
    Mon problème n'est effectivement pas si résolu que ça :/
    Ce la fonctionnait bien sur le classeur de texte créé pour l'occasion mais pas dans mon fichier original

    Je crois que je suis embêté par le passage en automatique de certaines cellules au format date parce qu'il pense en reconnaitre certaines et d'autre non
    Citation Envoyé par Ben_L Voir le message
    Bonjour,


    TextToColumns est une méthode de l'objet Range. Comme vous l'avez compris, cette méthode vient modifier directement la valeur de la cellule et transforme une chaîne de caractères en un type de données choisi par l'utilisateur.


    TextToColumns permet entre autre de transformer des fichiers texte en fichiers Excel. Par exemple un fichier CSV peut être ouvert directement dans Excel, qui interprète nativement chaque ligne du fichier texte comme le contenu d'une cellule de la colonne A.
    L'application de TextToColumns à cette colonne A permet alors à Excel de transformer le contenu texte de la colonne A en un ensemble de valeur (qui peuvent être numériques, textuelles ou dates) réparties sur les colonnes A, B, C etc.
    Pour transformer une chaîne de caractères en une série de cellules Excel, la fonction doit savoir comment est formaté le texte initial. C'est le rôle de l'argument DataType.
    Pour reprendre mon exemple d'un fichier CSV, il s'agit généralement de texte de longueur variable délimité par des points-virgules (ou un autre séparateur selon le format exact). On utilisera alors xlDelimited (en fournissant en plus le caractère qui sert de délimiteur).
    Mais on peut également imaginé du texte constitué d'un ensemble de valeurs numériques qui sont toutes écrites sur 10 caractères exactement. Dans ce cas, on utilisera l'argument xlFixedWidth pour préciser à Excel quelle façon il doit interpréter les chaînes de caractères qu'on lui fournit (et normalement, on donne aussi à Excel la longueur de chaque valeur textuelle).

    Ce que j'ai écrit ci-dessus n'est qu'une explication générique.
    Dans le cas qui vous intéresse, on utilise TextToColumns sur une cellule qui ne contient qu'une seule valeur. Utiliser xlFixedWidth ou xlDelimited est sans impact, et il n'est même pas nécessaire de préciser à Excel le 2ème argument (à savoir la longueur de chaque élément ou le délimiteur à utiliser). Excel va parser l'intégralité du contenu de la cellule et essayer de l'interpréter comme une unique valeur.



    Comme j'ai essayé de le dire maladroitement dans mon texte ci-dessus, TextToColumns prend une chaîne de caractère et essaie de la transformer en une série de valeurs. Ce sont ces différentes valeurs qui correspondent aux "colonnes" de la documentation Microsoft.

    Prenons le cas d'un texte délimité par des virgules : «123,14/10/2020,iVBAveADream»
    Excel va convertir ce texte en 3 valeurs, c'est-à-dire 3 colonnes.
    La première (numérotée 0) doit être interprétée comme un nombre, la deuxième (numérotée 1) doit être interprétée comme une date, et la dernière (numérotée 2) doit être interprétée comme une chaîne de caractère.
    L'argument FieldInfo permet d'indiquer tout cela à Excel.

    Dans le cas qui vous intéresse, la cellule à convertir ne contient qu'une seule valeur. Il n'y a donc qu'un seul format de colonne à spécifier : celui de la colonne '0'. Et ce format est une date, écrite sous la forme Jour Mois Année (on utilise donc xlDMYFormat pour l'indiquer à Excel).


    Pour finir, il peut être intéressant de vous renseigner sur la fonction DateSerial. Elle fonctionne assez différemment de TextToColumn et chacune a donc ces avantages et inconvénients.
    N'hésitez à échanger sur le sujet avec d'autres membres du forums, qui pourront vous donner un point de vue différent du mien.

    Cdt
    Merci énormément pour le temps pris pour toutes ces explications, cela me permet effectivement de comprendre beaucoup mieux le morceau de code récupéré!
    Je vais continuer de le lire pour bien assimiler par contre

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je crois que je suis embêté par le passage en automatique de certaines cellules au format date parce qu'il pense en reconnaitre certaines et d'autre non
    Excel dans ce cas précis n'en reconnait aucune. Celles que l'on pense être correcte par exemple la source contient 11-10-2020 qui est en réalité le 10 novembre 2020 mais excel va conserver la date telle quelle et nous lirons le 11 octobre 2020.
    En revanche si la source contient le 11-14-2020, elle sera considérée comme une chaîne de caractères

    C'est à l'importation qu'il faut effectuer la conversion. Soit avec TextToColumns soit à l'aide de PowerQuery
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2020
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Octobre 2020
    Messages : 17
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,

    Excel dans ce cas précis n'en reconnait aucune. Celles que l'on pense être correcte par exemple la source contient 11-10-2020 qui est en réalité le 10 novembre 2020 mais excel va conserver la date telle quelle et nous lirons le 11 octobre 2020.
    En revanche si la source contient le 11-14-2020, elle sera considérée comme une chaîne de caractères

    C'est à l'importation qu'il faut effectuer la conversion. Soit avec TextToColumns soit à l'aide de PowerQuery
    Oui c'est très exactement mon cas en effet

    En continuant à fouiner sur le forum à partir du lien vers d'autres cas similaires de Ben_L, je suis tomber sur ça
    https://jpcheck.developpez.com/tutor...international/

    et j'ai finalement adapté cette partie de code, à base de split et dateserial :
    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
    Function ExtraireDateDepuisTexteGlobal(strDate As String) As Date
        Dim annee As Integer
        Dim mois As Integer
        Dim jour As Integer
        Dim Tableau As Variant
        'première étape, on transforme le texte en tableau avec la fonction Split
        Tableau = Split(strDate, Application.International(xlDateSeparator))
        Select Case Application.International(xlDateOrder)
            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 Function
    Merci à tous

Discussions similaires

  1. [XL-2016] récuperer une valeur dans un listbox autre que celle affichée
    Par Fdc_53 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/10/2018, 12h29
  2. Retourner une date dans la langue choisie
    Par sleeg dans le forum ASP
    Réponses: 2
    Dernier message: 12/10/2012, 13h58
  3. Réponses: 1
    Dernier message: 20/04/2010, 13h58
  4. Réponses: 10
    Dernier message: 20/02/2009, 11h25
  5. Réponses: 1
    Dernier message: 15/08/2005, 19h38

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