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 :

importation d'un fichier texte: Pb format Date


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut importation d'un fichier texte: Pb format Date
    avez-vous des pb de format DATE (french-anglais)
    avec cette procedure
    car moi j'utilise celle-ci
    http://www.cpearson.com/excel/imptext.htm
    et les dates 08/03/2007 sont importées en 03/08/2007

    je ne sais comment faire, pour modifier la macro en consequence

    les parametres regionaux de Windows sont en JJ/MM/AAAA pourtant

    Merci.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour te répondre il faudrait connaître le format de date dans ton fichier texte. tu peux nous donner un exemple ?

    Pour importer les données d'un fichier texte, tu as plusieurs solutions. Ici tu en as une autre.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut
    08/03/2007
    dans le fichier Texte le format est JJ/MM/AAAA

    j'ai testé votre procedure, elle est ok pour les dates,

    contrairement à la mienne qui inverse certaines date (mais pas toutes !!), pour info :
    il ya inversion si le mois est inferieur à 12:
    08/03/2007 devient 03/08/2007
    alors que
    14/03/2007 reste 14/03/2007
    ca doit etre un probleme classique.

    Mais par contre dans votre procedure, j'ai un autre souci, car :
    mon 3eme champ necessite d'etre importé en Format-Excel "Texte"
    car sinon:
    0101232 devient chez vous 101232

    et (moins grave)
    les 6eme et 7eme Champs
    00000000285.25 reste 00000000285.25
    alors que dans ma procedure
    00000000285.25 devient 285.25

    Ma question est :
    dans ma procedure ou la votre
    y a t-il un moyen de forcer le type de certains champs à l'import.

    Merci
    je vais aussi regarder vos autres solutions.

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Oui, il y a moyen si tu mets une condition sur la colonne.
    J'ai mis la solution hier, tu cherches de ton côté, si je la trouve, je te mets l'url
    A+

    Edit
    J'ai relu ton message mais je ne comprends pas. Le problème semble se situer au niveau des formats de colonnes. Peux-tu nous mettre une ligne complète de ton fichier texte qu'on ait une idée ?
    A+

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut
    mais il n'y a pa de pb, puisque votre procedure importe correctement les dates

    c'est MA procedure qui n'importe pas correctement les dates.

    par ailleurs voici une ligne de mon txt:
    08/03/2007;VE;0101232 ;FC00702116;LE TANNEUR & CIE ;00000000285.25;00000000000.00;E

    quand vous parlez d'une condition sur la colonne, s'agit-il de la macro ou de la feuille ? et quelle serait la syntaxe d'une conversion ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut hourra
    je viens de tester cette Macro, LireFichierTxt()

    http://www.developpez.net/forums/sho...d.php?t=363643

    il ya le meme pb de date avec le mois/jour inversé

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Citation Envoyé par steph1964
    quand vous parlez d'une condition sur la colonne, s'agit-il de la macro ou de la feuille ? et quelle serait la syntaxe d'une conversion ?
    J'ai testé en passant par la macro mais le résultat n'est pas celui que j'attendais (!). Il reste donc la possibilité de formater les colonnes concernées. Il suffit de mettre après le "Close #1"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Columns("F:G").NumberFormat = "00000000000.00"
    En faisant ça, j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    03/08/2007  VE  101232  FC00702116  LE TANNEUR & CIE   00000000285,25	00000000000,00	E
    03/08/2007  VE  101232  FC00702116  LE TANNEUR & CIE   00000000285,25	00000000000,00	E
    03/08/2007  VE  101232  FC00702116  LE TANNEUR & CIE   00000000285,25	00000000000,00	E
    03/08/2007  VE  101232  FC00702116  LE TANNEUR & CIE   00000000285,25	00000000000,00	E
    A+

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut
    euh..
    somme nous bien d'accord ?

    si les Zeros disparaissent des champ Fet G, ce n'est pas plus mal.

    mais surtout vous remarquez la perte d'informations sur le champ C
    (qui doit etre importé en mode texte pour ne pas perdre le 0 du debut !!)

    et bien sur la date inversée 8/3 au lieu de 3/8

    par contre le reformatage que vous proposez peut me servir, car une des 3 macros n'inverse pas les dates, je peux donc y corriger les autres colonnes qui ne vont pas

    je vais tester tout ca.
    et je refais le point

    Merci

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut j'ai testé...
    non rien a faire
    la seule macro qui importe les dates correctement est celle-ci :
    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
    Sub Timport()
    '
     
    ImportText "k:\maxima\X-BILAN.txt", Range("A1")
     
    '
    End Sub
     
    Sub ImportText(FileName As String, PosImport As Range)
        Dim QT As QueryTable
        Set QT = ActiveSheet.QueryTables.Add(Connection:="TEXT;" & FileName, Destination:=PosImport)
        With QT
            .TextFileSemicolonDelimiter = True
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .Refresh
        End With
    End Sub
    mais perd le zero de la colonne "C"

    CETTE MACRO inverse la date, mais garde le la colonne "C" OK, à condition de préformater la colonne "C" en "texte" dans la feuille Cible
    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
    Sub LireFichierTxt()
    Dim Ligne As String, NoLigne As Long, NoCol As Integer
    Dim Tableau, Chemin, NomFich
    Chemin = "k:\maxima\"
    NomFich = "X-BILAN.txt" 'ou .txt
        i = 0
        Open Chemin & NomFich For Input As #1
        While Not EOF(1)
            Input #1, Ligne
            Tableau = Split(Ligne, ";") ' si le séparateur est un ";", sinon tu changes
            NoLigne = NoLigne + 1
            For NoCol = 0 To UBound(Tableau)
                 Cells(NoLigne, NoCol + 1).Value = Tableau(NoCol)
            Next
        Wend
        Close #1
    End Sub
    je suis perdu, je n'ai pas de solution
    - il faudrait reformater à l'import, avant le close c'est deja trop tard
    -mais pourquoi meme votre macro inverse-t-elle les dates ?

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Si la colonne C contient des nombres, tu peux lui appliquer la même formule que pour F et G en modifiant le format.
    Si c'est une chaîne de caractères de longueur fixe, tu peux pratiquer d'une autre manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            For NoCol = 0 to Ubound(Tableau)
                 if NoCol = 3 then
                      Cells(NoLigne, NoCol+1).value = right("0000000" & Tableau(NoCol),7)
                   else
                      Cells(NoLigne, NoCol+1).value = Tableau(NoCol)
                 endif
            Next
    Maintenant pour les dates, tu ne peux pas faire une chose et son inverse dans une même procédure. Soit elles ont le format anglais, soit le format français. Et en anglais, à par un bidouillage sur la chaîne date, je ne vois pas comment tu pourrais faire.
    Bon courage
    A+

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut ca commence à s'eclairer ...
    je sui en train de déboguer en pas à pas :

    sur cette ligne tout se joue :

    Cells(NoLigne, NoCol+1).value = Tableau(NoCol)

    dans Tableau il ya 08/03/2007

    et dans Cells il ya 03/08/2007 (si le format de la cellule de la feuille est DATE)
    mias il ya 08/03/2007 (si le format est TEXTE , ce qui est parfait pour moi)

    il me faut donc un attribut du genre

    Cells(NoLigne, NoCol+1).value.numberformat("@") = Tableau(NoCol)

    en gros je dois forcer l'affectation en mode texte pour cette colonne

    if Nocol= 0
    Cells(NoLigne, NoCol+1).value (en mode texte SVP) = Tableau(NoCol)



    PS: bug de la classe Cells ?
    tout ceci vient du fait que
    Cells importe les format date en anglais, au lieu de tenir compte de la configuration regionale de XP

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut Voila la solution, grace à votre aide Precieuse

    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
    Sub LireFichierTxt()
    Dim Ligne As String, NoLigne As Long, NoCol As Integer
    Dim Tableau, Chemin, NomFich
        Cells.Select
        Selection.ClearContents
    Chemin = "k:\maxima\"
    NomFich = "X-BILAN.txt" 'ou .txt
        i = 0
        Open Chemin & NomFich For Input As #1
        While Not EOF(1)
            Input #1, Ligne
            Tableau = Split(Ligne, ";") ' si le séparateur est un ";", sinon tu changes
            NoLigne = NoLigne + 1
            For NoCol = 0 To UBound(Tableau)
                If (NoCol = 0 Or NoCol = 2) Then '(Importation colonnes A, C au format "texte")
                Cells(NoLigne, NoCol + 1).NumberFormat = "@"
                'les date à importer sont au format francais jj/mm/aaa dans le fichier txt, DONC
                'en théorie nous devrions mettre pour la colonne A : NumberFormat="dd/mm/yyyy" 
                'mais, il ne faut surtout pas etre coherent !!!, mais plutot indiquer le format mm/dd/yyyy, pour que certaines dates ne soient pas inversées
                End If
                 Cells(NoLigne, NoCol + 1).Value = Tableau(NoCol)
            Next
        Wend
        Close #1
    End Sub

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut Pour comprendre ce BUG
    Observer les incoherence de ce qui s'affiche dans la colonne A, selon le format choisi, Standard, texte, Date. etc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Test()
        Cells.Select
        Selection.ClearContents
     
    'Cells(1, 1).NumberFormat = "mm/dd/yyyy"
    'Cells(1, 1).NumberFormat = "dd/mm/yyyy"
    'Cells(1, 1).NumberFormat = "@"
    Cells(1, 1).Value = "08/03/2007"
    Cells(2, 1).Value = "14/03/2007"
    End Sub
    et Merci pour votre aide.

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Jète un oeil et apporte ta contribution.
    (Une attention particulière à la réponse 5 )

  15. #15
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 344
    Par défaut
    J'ai le meme problème quand j'importe des données en VBA. Pour éviter ce genre de soucis, j'utilise cette macro que j'ai faite :

    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
    Private Sub ChangeDate(ColonneChanges As Long)
    On Error GoTo gestionerreur
    Dim j As String
    Dim m As String
    Dim a As String
    Dim heure As String
    Dim min As String
    Dim sec As String
    Dim i As Integer
    Dim k As Integer
    Dim MaDate As Date
    Dim MonHeure As Date
    Dim MonHeureT As String
    Set f = Worksheets(1)
    k = 2
    While Cells(k, 1).Value <> ""
        k = k + 1
    Wend
    For i = 2 To k - 1
        If Cells(i, ColonneChanges).Value = "" Then
            Cells(i, ColonneChanges).Value = ""
        ElseIf Cells(i, ColonneChanges).NumberFormat = "General" Then
            j = Left(Cells(i, ColonneChanges).Value, 2)
            m = Mid(Cells(i, ColonneChanges).Value, 4, 2)
            a = Mid(Cells(i, ColonneChanges).Value, 7, 4)
            MaDate = DateSerial(a, m, j)
            Cells(i, ColonneChanges).Value = CDate(MaDate)
        Else
            m = Left(Cells(i, ColonneChanges).Value, 2)
            j = Mid(Cells(i, ColonneChanges).Value, 4, 2)
            a = Mid(Cells(i, ColonneChanges).Value, 7, 4)
            MaDate = DateSerial(a, m, j)
            Cells(i, ColonneChanges).Value = CDate(MaDate)
        End If
        Cells(i, ColonneChanges).NumberFormat = "dd/mm/yyyy"
    Next i
    Exit Sub
    gestionerreur:
    If Err.Number = 13 Then
        Resume Next
    End If
    End Sub
    et cette fonction, si jamais dans ta cellule tu as les heures aussi :

    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
    Private Sub ChangeDate(ColonneChanges As Long)
    On Error GoTo gestionerreur
    Dim j As String
    Dim m As String
    Dim a As String
    Dim heure As String
    Dim min As String
    Dim sec As String
    Dim i As Integer
    Dim k As Integer
    Dim MaDate As Date
    Dim MonHeure As Date
    Dim MonHeureT As String
    Set f = Worksheets(1)
    k = 2
    While Cells(k, 1).Value <> ""
        k = k + 1
    Wend
    For i = 2 To k - 1
        If Cells(i, ColonneChanges).Value = "" Then
            Cells(i, ColonneChanges).Value = ""
        ElseIf Cells(i, ColonneChanges).NumberFormat = "General" Then
            j = Left(Cells(i, ColonneChanges).Value, 2)
            m = Mid(Cells(i, ColonneChanges).Value, 4, 2)
            a = Mid(Cells(i, ColonneChanges).Value, 7, 4)
            MaDate = DateSerial(a, m, j)
            MonHeureT = Right(Cells(i, ColonneChanges).Value, 8)
            heure = Left(MonHeureT, 2)
            min = Mid(MonHeureT, 4, 2)
            sec = Right(MonHeureT, 2)
            MonHeure = TimeSerial(heure, min, sec)
            Cells(i, ColonneChanges).Value = CDate(MaDate & " " & MonHeure)
        Else
            m = Left(Cells(i, ColonneChanges).Value, 2)
            j = Mid(Cells(i, ColonneChanges).Value, 4, 2)
            a = Mid(Cells(i, ColonneChanges).Value, 7, 4)
            MaDate = DateSerial(a, m, j)
            MonHeureT = Right(Cells(i, ColonneChanges).Value, 8)
            heure = Left(MonHeureT, 2)
            min = Mid(MonHeureT, 4, 2)
            sec = Right(MonHeureT, 2)
            MonHeure = TimeSerial(heure, min, sec)
            Cells(i, ColonneChanges).Value = CDate(MaDate & " " & MonHeure)
        End If
        Cells(i, ColonneChanges).NumberFormat = "dd/mm/yyyy hh:mm"
    Next i
    Exit Sub
    gestionerreur:
    If Err.Number = 13 Then
        Resume Next
    End If
    End Sub
    Voila

    DIT : j'ai rajouté cette macro en plus propre dans le scontributions sur le post que Ousk a mis en lien
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 13
    Par défaut NON, je ne suis pas d'accord
    il me semble que le pb n''est pas bien compris !

    le format importé n'est pas vraiment le format anglais, mais un format batard basé sur le format anglais:

    pour comprendre le pb :

    Cells(1, 1).Value = "08/03/2007".......devient 03/08
    Cells(2, 1).Value = "14/03/2007".......reste 14/03

    vous verrez que la 1ere cellule est inversée
    mais pas le 2eme

    ce qui exclut tout traitement a posteriori comme le fait votre macro. ( si je l'ai bien parcourue rapidement)

    d'autre part (moins important), le format "standard" reagit comme le format "date", avec inversion eventuelle (selon la date)
    seul le format "Texte" n'altere pas les données

  17. #17
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 344
    Par défaut
    tu as essayé ma macro sur la colonne voulue ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

Discussions similaires

  1. Import Fichier Texte non formaté
    Par Lna999Lna dans le forum QlikView
    Réponses: 0
    Dernier message: 30/11/2012, 10h06
  2. Réponses: 2
    Dernier message: 04/06/2007, 15h39
  3. nommer un fichier texte avec la date du jour
    Par avantoux dans le forum Windows
    Réponses: 4
    Dernier message: 02/02/2006, 09h57
  4. Comment écrire un fichier texte au format MS-DOS ?
    Par fredfred dans le forum Langage
    Réponses: 9
    Dernier message: 20/01/2005, 09h00
  5. importation d'un fichier texte vers excel
    Par darkpocket dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/01/2005, 11h47

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