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

Excel Discussion :

Conversion de texte en date [XL-2010]


Sujet :

Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Conversion de texte en date
    Bonjour,

    Je travaille avec un fichier excel exporté d'un système informatique qui met les dates au format "jj.mm.aaaa".

    Quand j'éxécute manuellement la fonction "Remplacer" (Ctrl+H) en substituant les "." par des "/", j'obtiens le format souhaité "jj/mm/aaaa".
    ex: "05.01.2014" devient "05/01/2014" et excel le reconnait automatique comme date.

    Par contre, quand j'exécute la fonction "remplacer" par macro avec le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
    le format est bien "jj/mm/aaaa" mais le code comprend que le format initial était "mm.jj.aaaa".

    En conséquence:
    1 - "05.01.2014" devient "01/05/2014" et est reconnu comme date avec le jour et le mois inversés
    2 - "20.05.2014" devient "20/05/2014" et n'est pas reconnu comme date puisqu'il n'y a pas de 20eme mois

    J'ai bien trouvé une parade en inversant au préalable le mois et le jour du format d'exportation, mais je n'aime pas trop cette solution bricolage.
    Donc si quelqu'un a une solution pour réaliser cette correction par vba proprement, merci par avance pour le coup de main.

    M!KA

  2. #2
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    et si tu essayes ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection = CDate(Split(Selection, ".")(0) & "/" & Split(Selection, ".")(1) & "/" & Split(Selection, ".")(2))
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Points : 9
    Points
    9
    Par défaut La meme chose mais en massif?
    Merci pour ta réponse Casefayere.

    Ta solution marche parfaitement sur une cellule, cependant saurais-tu comment étendre cette ligne de code à une plage de cellule sans les balayer une à une?

    Je me demandais s'il n'est pas possible d'empêcher excel d'identifier que remplacer les "." par des "/" dans les cellules génere des dates?
    En d'autre termes, peut-on désactiver la fonction de reconnaissance de type d'excel?

    Merci!

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour,

    tenter avec un espace précédent la "date".

    Sinon c'est normal vu le VBA nativement en anglais …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Qu'entends tu exactement par "mettre un espace devant la date"?

    l'idée ici n'est pas de balayer les cellules une à une ou de mettre une formule (la formule est ma solution actuelle).

    Sinon, tu as raison, c'est bien parce que vba est nativement en anglais que je rencontre ce problème, après, je ne pense pas que ce soit normal de ne pas pouvoir reproduire par macro une action qui marche manuellement.

    Concernant la désactivation de la reconnaissance automatique de type, vous n'avez rien?

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Non car c'est normal, VBA est anglo-saxon !

    Donc soit précéder la date d'un espace et donc ce sera du texte conservé au format d'origine
    soit inverser le jour et le mois et ce n'est pas du bricolage car c'est la normalité d'Excel
    ou encore utiliser les fonctions de date; voir cette discussion

    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Merci pour ton apport.

    J'imagine que si deux membres confirmés comme vous n'ont pas de solution idéale pour réaliser cette opération sur une plage de cellule (sans boucle), c'est qu'il n'existe probablement pas de manière de le faire.

    Pour information, la solution que j'utilise actuellement passe par les formules:

    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
    Set Trouve = .Rows(1).Find("Exported Column", LookIn:=xlValues, LookAt:=xlPart)
        If Not Trouve Is Nothing Then
            .Columns(Trouve.Column + 1).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
            Trouve.Offset(0, 1).FormulaR1C1 = "=RC[-1]" 'Copie de l'entete de la colonne
            'Formule bricolage
            Trouve.Offset(1, 1).FormulaR1C1 = "=VALUE(IF(RC[-1]<>"""",CONCATENATE(MID(RC[-1],1,2),""/"",MID(RC[-1],4,2),""/"",MID(RC[-1],7,4)),""""))"
            Trouve.Offset(1, 1).AutoFill Destination:=.Range(Trouve.Offset(1, 1), .Cells(.Rows.Count, Trouve.Column).End(xlUp).Offset(0, 1))
            .Columns(Trouve.Column + 1).NumberFormat = "dd/mm/yyyy"
            Application.Calculate
            'suppression des formules
            .Columns(Trouve.Column + 1).Copy
            Trouve.Offset(0, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
            .Columns(Trouve.Column).Delete
        End If
    Bricolage quoi!!

    Je vais laisser ce sujet ouvert quelques jours encore pour si jamais quelqu'un propose une meilleure solution, ensuite je le considerait comme "Résolu" histoire de fermer la discussion.

    En espérant qu'un jour Excel ne limite plus sa manière de fonctionner à ses origines culturelles pour devenir normal selon mes critères

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Et oui, Excel n'a pas été créé en France !

    Sinon avec une fonction de date comme dans la discussion en lien cela devrait le faire aussi
    et donc sans colonne supplémentaire …

    Pour les problèmes de date, je préfère modifier en amont ou les gérer au moment de l'importation,
    pas une fois les données dans le classeur …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Je passe par la création d'une nouvelle colonne (puis suppression de l'originale) pour eviter de balayer les cellules une à une avec une boucle.

    Par expérience, il me semble que les formules natives sont plus rapides que les boucles programmées, cela dit je n'ai jamais fait de test approfondi pour m'en assurer.
    Qu'en pensez-vous?

    Concernant la politique d'importation, personnellement je ne modifie jamais le classeur en amont, avant importation, pour ne pas devoir réexporter l'information si jamais j'ai un doute sur un résultat et que je suis amené à devoir comparer mes informations.
    Cela dit, les goûts et les couleurs...

  10. #10
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 200
    Points : 14 346
    Points
    14 346
    Par défaut
    Bonjour,

    Essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Selection.NumberFormat = "dd.mm.yyyy"
    Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
    Selection.NumberFormat = "dd/mm/yyyy"
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  11. #11
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 200
    Points : 14 346
    Points
    14 346
    Par défaut
    Oups, au temps pour moi. Oublie la réponse précédente.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Bonjour à tous,

    Finalement je reste avec la solution que j'avais proposée en passant par les formules.

    Le seul changement que j'ai apporté depuis la dernière, réside dans la formule de reconstruction de la date qui devient:
    DATE(MID(RC[-1],7,4),MID(RC[-1],4,2),MID(RC[-1],1,2))

    La reconstruire ainsi m'évitera les problèmes de paramètres régionaux qui peut varier d'un ordi à l'autre.

    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
    Sub DateConverter(ByVal Trouve As Range)
     
    With Trouve.Parent
        .Columns(Trouve.Column + 1).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
        Trouve.Offset(0, 1).FormulaR1C1 = "=RC[-1]"
        Trouve.Offset(1, 1).FormulaR1C1 = "=IF(RC[-1]<>"""",DATE(MID(RC[-1],7,4),MID(RC[-1],4,2),MID(RC[-1],1,2)),"""")"
        Trouve.Offset(1, 1).AutoFill Destination:=.Range(Trouve.Offset(1, 1), .Cells(.Rows.Count, Trouve.Column).End(xlUp).Offset(0, 1))
        .Columns(Trouve.Column + 1).NumberFormat = "dd/mm/yyyy"
        Application.Calculate
        .Columns(Trouve.Column + 1).Copy
        Trouve.Offset(0, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        .Columns(Trouve.Column).Delete
    End With
     
    End Sub
    Merci à tous pour vos suggestions.

    A+

  13. #13
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 693
    Points
    6 693
    Par défaut Solution sans boucle
    Bonjour,

    Pour bien saisir le phénomène d'inversion des dates etc voir ce tuto :

    Comprendre et gérer les dates sous Excel et en VBA

    Sinon, à la base ce dont tu as besoin de faire, c'est avant tout une conversion, tu peux donc utiliser l'outil convertir d'Excel (onglet Données) plutôt que des manœuvres de remplacement

    donnée voulues en colonne B sans titre....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub ConvetDates() 'brute
        Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
            Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
            :=Array(1, 4), TrailingMinusNumbers:=True
    End Sub
    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Parfait!
    C'est exactement ce que je cherchais!!

    Merci beaucoup Ormonth pour cette solution.

    A+

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Bon, je viens de finir les tests de la solution en changeant les paramètres régionaux pour identifier l'impact sur la date et ça fonctionne nickel.

    La solution est parfaitement géniale.

    J'étais sûr qu'il y avait moyen de dépasser les limites culturelles d'excel

    Merci à tous

  16. #16
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut Heu …

    Cela reste bien dans la culture d'Excel car c'est une fonction interne d'Excel et sinon cela ne fonctionnerait pas !

    C'est juste une autre manière de procéder comparativement à la fonction DateValue par exemple …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conversion texte en date avec SQL delphi
    Par DAEM86 dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/12/2015, 23h28
  2. [AC-2007] Conversion date-texte en date
    Par berapard dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 09/02/2011, 16h37
  3. [AC-2007] Conversion texte en date
    Par tibofo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/11/2009, 18h34
  4. [AC-2003] Conversion de format texte en date ou extraction
    Par gwenagan dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 09/08/2009, 22h01
  5. [Dates] Conversion d'un text en date
    Par sagitarium dans le forum Langage
    Réponses: 1
    Dernier message: 07/06/2006, 20h21

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