Conversion date CSV en Excel

Bonjour à tous,

J'aimerais votre aide concernant la conversion de la date d'un fichier CSV en Excel. Je souhaiterai synchroniser plusieurs dates provenant de données différentes mais pour cela Excel doit reconnaître ces données comme date sous un format précis (impossible de changer le format de la date dans le fichier CSV, celui-ci est importé d'un logiciel).

Ex : l'heure est donnée de ce format : "dd.mm.yyyy hh:mm EEST" et je voudrais le format suivant "yyyy-mm-dd hh:mm:ss" pour l'ensemble des cellules. Je voudrai ensuite pouvoir les copier coller directement dans un tableau avec l'ensemble des données (le copier coller ne doit pas faire référence à un fichier où les possible calculs pourraient avoir lieu.

Vous trouverez en pièce jointe un exemple pour les 7 premiers jours avec deux données de dates différentes.

J'ai déjà réussi à le faire en fractionnant les cellules (cellule A jour,B mois, C date, D heure), en recomposant la date =DATE(C3,B3,A3)

puis en ajoutant l´heure sous forme d'un texte =TEXT(E3,"yyyy-mm-dd")&TEXT(D3," hh:mm:ss") et enfin en faisant un collage spécial. Cependant cela prend bien 20min et il y a plus de 20 données différentes. Existe-t-il un moyen plus rapide ?

Bien cordialement,

Yann

Bonjour,

avec une macro :

Sub dateHeure()
    Dim datas, col As Long, lig As Long, tmp As Double
    For col = 1 To 3 Step 2
        datas = Cells(2, col).Resize(Cells(Rows.Count, col).End(xlUp).Row - 1).Value
        For lig = 1 To UBound(datas)
            datas(lig, 1) = DateValue(Replace(Left(datas(lig, 1), 10), ".", "/")) + TimeValue(Mid(datas(lig, 1), 12, 5))
        Next lig
        With Cells(2, col).Resize(UBound(datas))
            .Value = datas
            .NumberFormat = "dd/mm/yyyy hh:mm"
        End With
    Next col
End Sub

eric

Bonjour elektdu91 et bienvenue sur le Forum !

Bonjour Eric,

Bonjour le Forum !

Par formule retournant un résultat au date au format Excel ( choisir le format désiré !) :

=DATE(DROITE(STXT(A2;1;11);4);STXT(STXT(A2;1;11);4;2);GAUCHE(STXT(A2;1;11);2))+TEMPS(GAUCHE(STXT(A2;12;5);2);DROITE(STXT(A2;12;5);2);0)

La même chose mais au format texte :

=TEXTE(DATE(DROITE(STXT(A2;1;11);4);STXT(STXT(A2;1;11);4;2);GAUCHE(STXT(A2;1;11);2))+TEMPS(GAUCHE(STXT(A2;12;5);2);DROITE(STXT(A2;12;5);2);0);"jj/mm/aaaa hh:mm")

Re,

Merci de vos rapides réponses.

Concernant la solution de JFL, j'ai tenté votre code mais cela me met une erreur. Après brève analyse, la date ne reconnaît pas séparément les différents éléments qui la constitue.

Concernant votre solution Eric, la macro marche parfaitement pour deux colonnes. Cependant, je possède 39 colonnes d'environ 900000 lignes (avec le temps toutes les deux colonnes). J'ai tenté de remplacer le nombre de colonnes dans la macro mais un message d'erreur est apparue "type mismatch"

Sub dateHeure()
   Sub dateHeure()
    Dim datas, col As Long, lig As Long, tmp As Double
    For col = 1 To 39 Step 2
        datas = Cells(2, col).Resize(Cells(Rows.Count, col).End(xlUp).Row - 1).Value
        For lig = 1 To UBound(datas)
            datas(lig, 1) = DateValue(Replace(Left(datas(lig, 1), 10), ".", "-")) + TimeValue(Mid(datas(lig, 1), 12, 5))
        Next lig
        With Cells(2, col).Resize(UBound(datas))
            .Value = datas
            .NumberFormat = "yyyy-mm-dd hh:mm:ss"
        End With
    Next col
End Sub

Dois-je rajouter un autre élément ? (Je ne suis pas très calé VBA)

EDIT: Je viens de retenter en reprenant toutes les valeurs du début, le message d'erreur devient "out of memory" (l'erreur vient de la ligne datas quand je debug. Autre erreur, pour les jours inférieurs à 12, il considère les jours comme des mois et les mois comme des jours.

Cordialement,

Yann

pas la peine de mettre 90000 lignes...

Une dizaine avec les erreurs signalées suffisent

Voici le fichier ci-joint sur 2 jours pour mieux expliquer les pb

https://www.cjoint.com/c/GCupHyOiykw

Pb 1 : impossible faire marcher la macro sur plus de colonne (ici 39) message "Out of memory"

Pb 2 : L'ordre de la date doit être bien precis "yyyy-mm-dd hh:mm:ss" or pour les jours avant le 13 du mois, le fichier donne la date de la manière suivante : "yyyy-dd-mm hh:mm:ss"

Cordialement,

Yann

Je vous retourne votre fichier avec mes formules corrigées et simplifiées.

Merci beaucoup JFL, votre solution marche très bien (juste eu besoin d'adapter le bon format de date).

En espérant que la solution macro puisse également fonctionner afin de faire toutes les colonnes en même temps.

Je vous remercie en tout cas de votre aide,

Cordialement,

Yann

Je t'avais dit que 10 lignes suffisaient...

Chez moi pas d'inversion mois-jour, cependant j'ai complété pour verrouiller un peu plus. Regarde si c'est mieux pour toi.

Si toujours pb redpose un fichier de 10 lignes en précisant où tu as l'erreur

eric

Bonjour,

Désolé pour la gène, je trouvais plus pertinent de vous montrer deux journées entières mais je comprends l'encombrement.

Vous aurez ci-joint le fichier que vous m'avez transmis précédemment.

Celui-ci en tant que tel fonctionne très bien. Néanmoins, lorsque je l'applique à mon fichier avec l'ensemble des colonnes je me retrouve avec le problème suivant.

Il marche très bien jusqu'à la colonne I puis s'arrête avec le message d'erreur "400" (croix rouge). Pour info, cette colonne est la plus longue avec plus d'un million de cellule (10458576 précisément); Lorsque j'effectue la macro de la colonne K jusqu'à la fin cela fonctionne de nouveau.

Serait-ce un problème dû au nombre des cellules ? Sinon dois-je juste utiliser la méthode de JFL pour cette cellule ?

Le problème d'inversion jour-mois est réglé merci.

Cordialement,

Yann

Je ne connais pas tous les libellés par coeur, c'est quoi 400 ?

Combien as-tu de mémoire ?

10458576 c'est la dernière ligne. Par curiosité vide cette cellule et teste.

Sinon dépose ton fichier avec juste cette colonne en A et la macro que je teste chez moi si ce n''est pas une valeur erronée plutôt.

eric

Bonjour,

L'erreur affiche juste "400" pas de libellé. En effet, l'erreur vient du fait que c'est la dernière ligne, j'ai retesté sans et cela fonctionne très bien. Je possède 4,0 GO de RAM dont 3,4 utilisable.

Je vous renvoie le fichier juste avec cette fameuse colonne. https://www.cjoint.com/c/GCviKldMXDw

Si pas de solution, je remplacerai la dernière ligne à la main.

Merci beaucoup de votre aide en tout cas,

Yann

Bonjour,

c'est effectivement un cas particulier à traiter :

Sub dateHeure()
    Dim datas, col As Long, lig As Long
    Application.ScreenUpdating = False
    For col = 1 To 1 Step 2
        If Cells(2, col) <> "" Then
            If Cells(Rows.Count, col) <> "" Then lig = Rows.Count Else lig = Cells(Rows.Count, col).End(xlUp).Row
            datas = Cells(2, col).Resize(lig - 1).Value
            For lig = 1 To UBound(datas)
                datas(lig, 1) = CDbl(DateValue(Replace(Left(datas(lig, 1), 10), ".", "/")) + TimeValue(Mid(datas(lig, 1), 12, 5)))
            Next lig
            With Cells(2, col).Resize(UBound(datas))
                .Value = datas
                .NumberFormat = "yyyy-mm-dd hh:mm:ss"
            End With
        End If
    Next col
End Sub

eric

Re,

Le problème est réglé, cela fonctionne parfaitement.

Je vous remercie pour tout et considère le sujet comme résolu.

Bonne continuation ou à bientôt pour un autre problème.

Cordialement,

Yann

Bonjour,

Je reviens vers vous concernant ce même problème, la dernière fois lorsque j'utilisais mon propre PC, le problème des dates n’apparaissait pas mais lorsque de l'utilisation de la macro sur le PC de l'entreprise, les dates ont rechangés de sens (mois et jour sont inversés). Or je travaille à l'étranger et la macro doit pouvoir être utilisé par tous. Auriez-vous une solution pour résoudre ce problème ?

En pièce jointe les 10 lignes de calcul représentant le pb.

Pour rappel, la macro utilisé :

Sub dateHour()
    Dim datas, col As Long, lig As Long, tmp As Double
    Application.ScreenUpdating = False
    For col = 1 To 39 Step 2
         If Cells(2, col) <> "" Then
         If Cells(Rows.Count, col) <> "" Then lig = Rows.Count Else lig = Cells(Rows.Count, col).End(xlUp).Row
            datas = Cells(2, col).Resize(Cells(Rows.Count, col).End(xlUp).Row - 1).Value
            For lig = 1 To UBound(datas)
                datas(lig, 1) = CDbl(DateValue(Replace(Left(datas(lig, 1), 10), ".", "/")) + TimeValue(Mid(datas(lig, 1), 12, 5)))
            Next lig
            With Cells(2, col).Resize(UBound(datas))
                .Value = datas
                .NumberFormat = "yyyy-mm-dd hh:mm:ss"
            End With
        End If
    Next col
End Sub

Cordialement,

Yann

Bonjour,

tu as mis un xlsx pour que j'ai le plaisir de copier-coller le code ?

eric

Bonjour,

Voilà la version xlms avec le code

Cordialement,

Yann

Fourni un fichier avec l'extraction sur une feuille et ce que tu obtiens sur une autre (+ une copie valeur du résultat au format texte à coté).

Mais n'étant pas à l'étranger je risque d'avoir du mal à constater et corriger....

Bonjour,

Désolé de la réponse tardive, j'étais en déplacement la semaine dernière...

Je n'ai pas tout à fait compris ce que vous vouliez mais vous trouverez en pièces jointes ce que j'ai compris.

Sur la feuille 1, les cellules originales avant d'avoir utilisé la macro et sur la feuille 2 les résultats après avec le format texte colonne 2.

Cordialement,

Yann

Bonjour,

pas d'inversion de date chez moi.

Ce que je te demandais c'était de mettre le résultat obtenu dans des colonnes au format texte : 09/12/2016 16:48:00 pour lire ce que tu obtiens pour une date erronée..

De toute façon je vais m'absenter plusieurs jours, je te conseille de démarrer un nouveau topic.

eric

Rechercher des sujets similaires à "conversion date csv"