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 :

Import .csv : Format date incorrect. Aléatoirement! [XL-2013]


Sujet :

Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Août 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Août 2016
    Messages : 34
    Points : 29
    Points
    29
    Par défaut Import .csv : Format date incorrect. Aléatoirement!
    Bonsoir,

    Je me casse la tête depuis quelques jours sur une chose qui parait pourtant simple...
    Je crée une macro Excel qui va suivre les étapes suivantes:
    - Copie des données d'un .csv
    - Collage des données dans un onglet de mon tableau Excel
    - Conversion des données avec séparateur ","

    Une des colonnes contient des dates que je souhaite exploiter.
    Lorsque je fais la conversion de la colonne D où se trouvent ces dates en format Date courte, le résultat est conforme, j'ai bien uniquement des dates au format JJ/MM/AAAA.
    Si par contre j'automatise cette conversion en VBA, le résultat obtenu est inexploitable : La colonne D (Et uniquement...) va passer en format Texte, et après impossible de changer le format, même manuellement.

    J'ai trouvé une solution de contournement moche mais efficace: Je crée une nouvelle colonne en E une fois les données collées, où pour chaque cellule j'applique "=D1*1", "=D2*1"... Avant de formater en Date courte, ce qui me donne effectivement des dates courtes exploitables... SAUF pour les jours compris entre le 01 et le 12 du mois, où Excel inverse le mois et le jour
    En gros je me retrouve avec :18/11/2017 - 17/11/2017 - 16/11/2017 - 15/11/2017 - 14/11/2017 - 13/11/2017 et... 11/12/2017.

    J'imagine qu'il y a une méthode plus simple et propre pour exploiter les données de ce fichier .csv, et que le problème vient soit d'un problème de format horaire entre la source du CSV et mon OS, soit de la conversion.

    Je ne peux malheureusement pas poster le .csv en question pour des questions de confidentialité, mais je peux mettre le code que j'utilise:

    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
    33
    34
    Windows("query.csv").Activate
        Cells.Select
        Selection.Copy
        Windows("XXXX.xlsm").Activate
        Sheets("Extract").Select
        Range("A1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
        Columns("A:A").Select
        Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
            :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
            Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
            ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
            (20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1)), TrailingMinusNumbers _
            :=True
     
        Columns("E:E").Select
        Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
        Range("E1").Select
        ActiveCell.FormulaR1C1 = "Open Date"
        Columns("E:E").Select
        Selection.NumberFormat = "General"
        Range("E2").Select
        ActiveCell.FormulaR1C1 = "=RC[-1]*1"
        Range("E2").Select
        Selection.AutoFill Destination:=Range("E2:E1342")
        Range("E2:E1342").Select
        Columns("E:E").Select
        Selection.NumberFormat = "m/d/yyyy"
     
    End Sub
    Il doit y avoir quelque chose à modifier dans les Arrays au moment de la conversion, mais j'ai beau tester, je ne trouve pas quoi.

    Avez-vous une idée pour fluidifier ce process svp?

    Merci!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par KeteMeteK Voir le message
    Bonjour,

    Pour voir comment régler un import csv. Dupliquez votre fichier Csv et donnez à la copie une extension .txt.

    Créez une macro, puis ouvrez ce fichier txt avec Excel et laissez vous guider jusqu'à l'étape 3 comme dans le vidage d'écran ci-dessous. Sur votre colonne Date, sélectionnez date et le format actuel. Continuez jusqu'à l'ouverture du fichier, fermez la macro et regardez le paramètre modifié pour la date dans votre macro.

    Pièce jointe 329758

  3. #3
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Le problème est la dichotomie entre Excel francophone (dates jj/mm/aa, séparateur décimale ",", séparateur de données ";") et VBA qui reste farouchement anglophone (dates mm/jj/aaaa, séparateur décimal ".", séparateur de données ",").

    Pour compenser (partiellement) ce problème qui touche au paroxysme quand on utilise des CSV, je te conseille d'ouvrir les CSV en utilisant Workbooks.OpenText et non pas simplement Workbooks.Open.
    https://msdn.microsoft.com/fr-fr/vba...t-method-excel
    Cette méthode permet un meilleur contrôle de l'ouverture en proposant de nombreux paramètre pour s'adapter au contenu du fichier.

    Une autre remarque qui n'a rien à voir avec ta question mais qui pique un peu les yeux quand on lit ton code : tu devrais limiter l'usage de "Selection" qui ne fait que compliquer le code et ralentir l'exécution.
    Je te montre ce que ça donne avec ton code.

    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
        Workbooks("query.csv").ActiveSheet.UsedRange.Copy
        Workbooks("XXXX.xlsm").Sheets("Extract").Range("A1").PasteSpecial (xlPasteValues)
     
        Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
            :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
            Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
            ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
            (20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1)), TrailingMinusNumbers _
            :=True
     
        Columns("E:E").Insert CopyOrigin:=xlFormatFromLeftOrAbove
        Range("E1").FormulaR1C1 = "Open Date"
        Columns("E:E").NumberFormat = "General"
        Range("E2:E1342").FormulaR1C1 = "=RC[-1]*1"
        Columns("E:E").NumberFormat = "m/d/yyyy"
    Ca fait quand même plus propre, non ?
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Août 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Août 2016
    Messages : 34
    Points : 29
    Points
    29
    Par défaut
    Merci à tous deux pour vos réponses.

    De ce que je vois, en effet il faut que le .csv soit ouvert en tant que fichier texte.

    @Eric KERGRESSE : J'ai essayé ta méthode, mais seul le Array(1, 1) a été modifié en Array(1, 4). En reproduisant dans mon code, ça ne change strictement rien

    @Menhir : Déjà, merci pour le code, effectivement c'est beaucoup plus léger et élégant comme ça. J'utilise beaucoup l'enregistreur, d'où un résultat lourd.
    Par contre, là encore, même en utilisant ta méthode avec l'argument Local:= True, je tombe sur le même problème.

    Je n'ai pas précisé que l'export query.csv se fait depuis un site web, et n'est donc pas enregistré en local (Ou alors, en tant que fichier temporaire uniquement).
    J'ai allégé un export en enlevant les informations sensibles et vous joins un exemple d'export brut.

    Merci pour votre aide, je patauge et je bloque sur ce point qui pourtant me paraissait abordable
    Fichiers attachés Fichiers attachés

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par KeteMeteK Voir le message
    @Eric KERGRESSE : J'ai essayé ta méthode, mais seul le Array(1, 1) a été modifié en Array(1, 4). En reproduisant dans mon code, ça ne change strictement rien
    il faut sélectionner la bonne colonne.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Août 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Août 2016
    Messages : 34
    Points : 29
    Points
    29
    Par défaut
    Oui j'avais bien sélectionné la colonne D (Donc, Array(4, x)).

    Peux-tu me confirmer le pas-à-pas suivant?
    - Sauvegarde du .csv en .txt
    - Début d'enregistrement de la macro
    - Ouverture via Excel du .txt
    - Avancer jusqu'à l'étape 3 (Celle de ton screenshot), et sélectionner "JMA" (Dans mon cas, voir fichier csv joint dans mon précédent post)
    - Arrêter l'enregistrement
    - Vérifier les "Array" qui ont été modifiés

    C'est bien cela?

    Merci,

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par KeteMeteK Voir le message
    Le plus simple est de modifier directement votre quatrième Array en faisant varier le deuxième paramètre de 3 à 8 selon vos données.
    La transformation du csv en txt n'est là que pour vous aider à comprendre le fonctionnement.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Août 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Août 2016
    Messages : 34
    Points : 29
    Points
    29
    Par défaut
    Je viens de refaire le test avec Array(4, 4), puis (4, 5) ... Jusqu'à (4, 8) : Rien ne change, j'ai toujours mon problème initial.

    Cela fonctionne-t-il chez vous depuis le fichier .csv que j'ai fourni plus haut?

    Merci,

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par KeteMeteK Voir le message
    Pouvez-vous mettre en ligne un fichier .zip ou directement le .csv ?

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Août 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Août 2016
    Messages : 34
    Points : 29
    Points
    29
    Par défaut
    Voilà le fichier .zip
    Fichiers attachés Fichiers attachés

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par KeteMeteK Voir le message
    Voilà le fichier .zip
    Vos dates doivent elles conserver les heures après import ?

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Août 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Août 2016
    Messages : 34
    Points : 29
    Points
    29
    Par défaut
    Non, uniquement un format JJ/MM/AAAA .

    Tout en évitant bien sûr d'inverser les mois et les jours pour les dates =< 12...

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par KeteMeteK Voir le message
    La transformation des colonnes Dates en champ date n'est pas fiable. Un certain nombre de valeurs ont leurs mois/jours inversés.
    Après plusieurs essais, il semble qu'il faut importer ces champs en mode Texte dans un premier temps et ensuite transformer la partie date de la cellule.

    La ligne a regarder est la ligne 8 (entre autres) : la colonne E doit indiquer 05/10/2017 et non 10/05/2017

    Le code suivant est à tester :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    Option Explicit
     
    Sub TestEnLaissantLExtensionEnCsv()
     
    Dim NomDuRepertoire As String, NomDuFichierCsv As String
        NomDuRepertoire = "XXXXX\" ' A adapter
        NomDuFichierCsv = "query.csv"
     
        Importer_Csv_ModeTexte NomDuRepertoire, NomDuFichierCsv
        ChangerLesValeurs2 ActiveSheet, 1
     
     
    End Sub
     
     
    Sub Importer_Csv_ModeTexte(ByVal Repertoire As String, ByVal Fichier As String)
     
        Workbooks.OpenText Filename:=Repertoire & "\" & Fichier, _
            Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
            xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, _
            Comma:=True, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), _
            Array(2, 1), Array(3, 1), Array(4, 2), Array(5, 2), Array(6, 2), Array(7, 2), Array(8, 2), _
            Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 2), Array(14, 1), Array(15, 1), _
            Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1)), TrailingMinusNumbers:=True
        Cells.EntireColumn.AutoFit
     
     
    End Sub
     
     
    Sub ChangerLesValeurs2(ByVal FeuilleCsv As Worksheet, ByVal LigneDeTitre As Long)
     
    Dim I As Long, J As Long
    Dim DerniereLigne As Long, DerniereColonne As Long
    Dim MaDate As Variant
     
        With FeuilleCsv
             DerniereLigne = .UsedRange.Rows.Count
             DerniereColonne = .UsedRange.Columns.Count
             For I = 1 To DerniereColonne
                 If InStr(1, .Cells(LigneDeTitre, I), "Date", vbTextCompare) > 0 Then
                    For J = LigneDeTitre + 1 To DerniereLigne
                        If .Cells(J, I) <> "" Then
                            MaDate = Split(.Cells(J, I), " ")
                           .Cells(J, I) = Format(MoulinetteDate(MaDate(0)), "dd/mm/yyyy")
                        End If
                    Next J
                 End If
             Next I
        End With
     
    End Sub
     
     
    Function MoulinetteDate(ByVal DateEnTexte As String) As Variant
     
    Dim MesSlashs As Variant
     
        Application.Volatile
     
        MesSlashs = Split(DateEnTexte, "/")
        If UBound(MesSlashs) = 2 Then
           MoulinetteDate = DateSerial(CLng(MesSlashs(2)), CLng(MesSlashs(1)), CLng(MesSlashs(0)))
        End If
     
    End Function

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Août 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Août 2016
    Messages : 34
    Points : 29
    Points
    29
    Par défaut
    Cette solution a l'air de fonctionner!

    J'ai testé avec plusieurs exports .csv, en adaptant un peu ça fait le travail

    Merci beaucoup Eric!

    Topic résolu.

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

Discussions similaires

  1. [Toutes versions] import csv - format cellule et changement point -> virgule
    Par benito32 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/07/2015, 17h12
  2. Import Excel format date nom reconnu
    Par slachromana dans le forum SAS Base
    Réponses: 2
    Dernier message: 11/07/2013, 09h56
  3. Import csv, convertion date GMT à heure locale
    Par vinch999 dans le forum DB2
    Réponses: 0
    Dernier message: 02/05/2011, 11h27
  4. Format de date sous import CSV
    Par SOLEIL1962 dans le forum Access
    Réponses: 3
    Dernier message: 14/09/2008, 22h14
  5. [Excel] Import .csv et format de date
    Par davlefabuleux dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/09/2006, 20h06

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