Problème format da date après importation csv

Signaler
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
-
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
-
Bonjour à tous,

alors voilà j'ai un souci que je n'arrive pas à comprendre. J'importe un fichier .csv qui comporte sur la première colonne des dates comme celle-ci : 11/03/2012 (soit 11 Mars 2012).
Quand le fichier est importé dans un nouveau classeur excel la date devient : 03/11/2012.

En fait je sélectionne les données qui sont comprises entre deux dates que l'utilisateur peut choisir grâce a un calendrier DTPicker dans une userform. Je ne sais pas si le souci pourrait venir d'ici, parce que le calendrier est lui au "bon format" c'est à dire 11/03/2012 (11 Mars 2012)

Je vous montre le code que j'utilise pour importer le fichier csv. (Celui ci doit etre compris dans le même dossier que le fichier excel ou l'on copie les données).


Dim derligne1 As Long
Dim derligne2 As Long, derligne3 As Long, derligne4 As Long, derligne5 As Long, derligne6 As Byte
Dim tablo1 As Variant, tablo2 As Variant, tablo3 As Variant
Dim ecart_date As Integer
Dim I As Long, k As Long, u As Byte, f As Long
Dim Tablo() As Variant, CelSource As Variant
Dim Cel As Range
Dim ladate1 As Date, ladate2 As Date
Dim Source
Dim Temp As String
Dim TabloOK  As Boolean
Dim fs

'Importer les données de plusieurs classeurs


Application.ScreenUpdating = False
Set fs = CreateObject("Scripting.FileSystemObject")

TabloOK = False
  derligne2 = Sheets("releve_erreur").Range("A" & Rows.Count).End(xlUp)(2).Row 'definit la derniere ligne de la colonne A
  ladate1 = DTPicker1.Value
  ladate2 = DTPicker2.Value
Temp = Dir(ActiveWorkbook.Path & "\*.csv")
Do While Temp <> ""
    Workbooks.Open Filename:=ThisWorkbook.Path & "" & Temp
      With Sheets(1)
        derligne3 = Cells(Rows.Count, 1).End(xlUp).Row
        For Each Cel In .Range("A2:A" & derligne3)
        CelSource = Split(Cel.Value, ";")
          If Cel = ";;;;" Then GoTo suite:
          If CelSource(0) >= ladate1 Then
          If CelSource(0) <= ladate2 Then
          TabloOK = True
          f = f + 1
            ReDim Preserve Tablo(1 To 5, 1 To f)
            Tablo(1, f) = CelSource(0)
            Tablo(2, f) = CelSource(1)
            Tablo(3, f) = CelSource(2)
            Tablo(4, f) = CelSource(3)
            Tablo(5, f) = CelSource(4)
          End If
          End If
        Next Cel
      End With
suite:
  ActiveWindow.Close SaveChanges:=False
  If TabloOK True Then Range(Cells(derligne2, 1), Cells(derligne2 + f - 1, 5)).Value _
                      Application.WorksheetFunction.Transpose(Tablo)
  Temp = Dir
Loop
MsgBox "Les données sont transférées"
Application.ScreenUpdating = True



Merci de votre aide

Robin

15 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Salut,

Essaie comme ceci pour voir si ça règle ton problème.
Tu dois mettre une référence à Microsoft Forms 2.0 Object Library
Adapte selon tes besoins...
    Dim strTemp As String
    Dim MyDataObject As DataObject

        Open NomDuFichier For Binary As #1
        strTemp = Space$(LOF(1))
        Get #1, , strTemp
        
        Set MyDataObject = New DataObject
        MyDataObject.SetText strTemp
            nbLignes = Cells(Rows.Count, "A").End(xlUp).Row + 1 
            MyDataObject.PutInClipboard
            Range("A" & nbLignes).PasteSpecial
            Close #1
    
        MyDataObject.Clear
        Set MyDataObject = Nothing


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Bonjour,
Cela veut dire que ton fichier csv contient des strings.
Si ta colonne A est formatée en date ===>>
For Each c In Columns("A1:A" & Rows.Count).SpecialCells(xlCellTypeConstants)
  c.Value = c.Text
Next

Cet exemple démarre à la ligne 1 de la colonne A. Si autre ligne (exemple A3 ===>> change A1 par A3)
A ne lancer qu'une seule fois après l'importatiçion, hein !



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Bonjour,

ucfoutu, avec
For Each c In Columns("A2:A" & Rows.Count).SpecialCells(xlCellTypeConstants)
, ce la me renvoit une erreur d'exécution 1004: erreur défini par l'objet ou par l'application.
J'ai modifié par
For Each c In Range("A2:A" & Rows.Count).SpecialCells(xlCellTypeConstants)
et la ça fonctionne !

Par contre c'est très long .. Il n'y a pas un moyen de le traiter avec un tableau(array)?

MPi merci d'avoir répondu, c'est intéressant à décortiquer mais je dois avouer que je suis quand même débutant et il me faudra m'y pencher plus dessus pour comprendre ton code. Il sert à importer et à mettre les dates au bon format ou juste changer les dates au bon format après l'importation?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Il n'y a pas un moyen de le traiter avec un tableau(array)?

Je pense que oui, mais en utilisant alors CDate sur les strings.
Je pense par ailleurs que tu gagnerais du temps avec le 1er code en le faisant( précéder d'une inhibition de l'affichage (Application.ScreenUpdating = False) à rétablir à True en sortie de ta boucle.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Mon bout de code sert à importer un fichier en passant par le "clipboard" d'Excel.

Je me suis rendu compte qu'Excel gérait bien les dates, entre autres, de cette façon. C'est comme si Excel prenait le temps de traduire les données lorsqu'elles passaient par le presse-papiers.

Le principe est d'ouvrir le fichier csv comme si c'était un fichier txt, de copier le tout dans le clipboard et de transférer dans Excel. Ça se passe très rapidement et ça fonctionne bien dans mon cas.


MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Ok merci pour vos réponse.
Je ne connaissais pas le clipboard d'Excel ,je vais me renseigner sur ça.

ucfoutu, pourrais tu me donner plus de précision quant au Cdate sur les strings, ça reste assez flou pour moi.
Merci!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
ucfoutu, pourrais tu me donner plus de précision quant au Cdate sur les strings

je ne saurais faire mieux en explications que celles que tu trouveras dans ton aide VBA en ouvrant simplement sur le mot .... devine donc ===>>> cdate !
Alors ? ===>> fais-en autant, s'il te plait

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Bonjour ucfoutu,

J'ai essayé avec CDate sur une seule cellule de mon tableau (parce que je n'arrivais pas à le faire avec une boucle pour tout un array), le format de la cellule n'est pas modifié (elle reste 05/08/2012 au lieu de 08/05/2012).

N'y a-t-il pas une autre manière de faire? C'est vraiment dommage parce que la solution que tu m'as proposé fonctionne très bien mais même avec un Application.ScreenUpdating = False rétablit ensuite, ça reste vraiment très long.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Montre ce que tu as écrit !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Plus là !
Essaye ceci :
Attention : au départ, ta colonne A doit être formatée en texte (avant l'importation)
Dim toto As Range, tablo, derlig As Long
derlig = Range("A" & Rows.Count).End(xlUp).Row
Set toto = Range("A2:A" & derlig)
tablo = toto
toto.NumberFormat = "dd/mm/yyyy"
For i = 1 To UBound(tablo)
  tablo(i, 1) = CDate(tablo(i, 1))
Next
toto = tablo

Dis-moi si cela marche et si plus rapide. Je ne peux faire de test, n'ayant pas tes données importées.



________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Re ucfoutu,

Alors j'ai fait les tests ça fonctionne si je converti avant l'importation la colonne A en texte. Le problème c'est qu'à la base elle n'est pas dans ce format.. Par contre c'est rapide.
C'est bizarre que pour l'autre solution qui fonctionnait, il n'y est pas eu besoin de convertir en texte avant.
Merci d'avoir pris le temps de répondre je sais que tu es occupé en ce moment.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Bien évidemment, que pour une solution : pas besoin de convertir en texte et que pour l'autre oui !
Ce sont tout simplement deux approches différentes et n'ayant absolument rien à voir l'une avec l'autre !
Voilà ! tu as entre les mains les deux baguettes : chacune avec ses avantages et ses inconvénients. A toi de choisir. Je n'en vois pas d'autre.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Perso, je m'en tiens au DataObject... simple et efficace dans mon cas, avec des dates anglaises et françaises

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Ok, merci ucfoutu tu es décidément toujours là pour m'aider c'est sympa, j'aurais du mal sinon !

Demain je vais essayer de me pencher sur ta solution MPi. J'essayais au maximum de garder la base d'importation que j'avais déjà faite parce que elle me permet d'ouvrir un à un tous les fichier csv contenu dans un même dossier et de sélectionner ensuite les données comprises dans entre deux dates. Bref, pour coder cela il m'a fallu plusieurs jours voir semaines.. :p! Néanmoins je crois que je vais tenter.

Je vous tiens au courant
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012

Je viens de m'apercevoir que si le format de la colonne A du fichier csv est au format texte, la macro que j'utilisais à la base renvoie la date sous la forme convenu.

Je me suis donc poser le problème de comment changer le format de cette colonne avec l'importation. J'ai donc écrit ceci:


Dim derligne1 As Long
Dim derligne2 As Long, derligne3 As Long, derligne4 As Long, derligne5 As Long, derligne6 As Byte
Dim tablo1 As Variant, tablo2 As Variant, tablo3 As Variant
Dim ecart_date As Integer
Dim I As Long, k As Long, u As Byte, f As Long
Dim Tablo() As Variant, CelSource As Variant
Dim Cel As Range
Dim ladate1 As Date, ladate2 As Date
Dim Source
Dim Temp As String
Dim TabloOK  As Boolean
Dim fs
Dim toto As Range, tableau

'Importer les données de plusieurs classeurs

Application.ScreenUpdating = False
Set fs = CreateObject("Scripting.FileSystemObject")

TabloOK = False
  derligne2 = Sheets("releve_erreur").Range("A" & Rows.Count).End(xlUp)(2).Row 'definit la derniere ligne de la colonne A
  ladate1 = DTPicker1.Value
  ladate2 = DTPicker2.Value
Temp = Dir(ActiveWorkbook.Path & "\*.csv")
Do While Temp <> ""
    Workbooks.Open Filename:=ThisWorkbook.Path & "" & Temp

      With Sheets(1)
        derligne3 = Cells(Rows.Count, 1).End(xlUp).Row
        For Each Cel In .Range("A2:A" & derligne3)
        CelSource = Split(Cel.Value, ";")
          If Cel = ";;;;" Then GoTo suite:
              
              Set toto = Range("A2:A" & derligne3)
              CelSource = toto
              toto.NumberFormat = "@"
                  For p = 1 To UBound(CelSource)
                     Celsource(p, 1) = CStr (Celsource(p, 1))
                  Next p
              toto = Celsource


          If CelSource(0) >= ladate1 Then
          If CelSource(0) <= ladate2 Then
          TabloOK = True
          f = f + 1
            ReDim Preserve Tablo(1 To 5, 1 To f)
            Tablo(1, f) = CelSource(0)
            Tablo(2, f) = CelSource(1)
            Tablo(3, f) = CelSource(2)
            Tablo(4, f) = CelSource(3)
            Tablo(5, f) = CelSource(4)
          End If
          End If
        Next Cel
      End With
suite:
  ActiveWindow.Close SaveChanges:=False
  If TabloOK True Then Range(Cells(derligne2, 1), Cells(derligne2 + f - 1, 5)).Value _
                      Application.WorksheetFunction.Transpose(Tablo)
  Temp = Dir
Loop

set toto = Nothing
MsgBox "Les données sont transférées"
Application.ScreenUpdating = True


Tout se passe bien car je vois bien que le format de la colonne A est modifié quand le fichier csv s'ouvre mais j'ai l'erreur l'indice n'appartient pas à la sélection à la ligne
If CelSource(0) >= ladate1 Then


Je ne vois pas comment rentrer déclarer le Celsource par la suite. Je vois bien qu'il ne comprend pas le 0.


Robin