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 :

Problème à l'importation d'un fichier CSV via Workbooks.OpenText [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur recherche materiau
    Inscrit en
    Novembre 2019
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur recherche materiau

    Informations forums :
    Inscription : Novembre 2019
    Messages : 26
    Par défaut Problème à l'importation d'un fichier CSV via Workbooks.OpenText
    Bonjour le forum,

    j'appelle à l'aide concernant l'application workbooks.opentext
    Je me sers de cette fonction pour ouvrir un fichier cvs. Ce fichier contient différents data (caractères et nombre), séparés par des espaces ou virgules. Ensuite les data peuvent être constituées de 2 parties: "une information":"une valeur"

    voici un exemple de ligne:
    20.11.2019 07:02:19 Bal2 W:2.2,Bal1 W:2.1,Ink W:0.1, ID:1234567891234567891

    L'ouverture en différentes colonnes sous excel ne pose pas de soucis. En effet, j'utilise l'espace et la virgule comme séparateur, auxquels j'ajoute le caractère ":", ce qui donne:

    20.11.2019 07 02 19 Bal2 W 2.2 Bal1 W 2.1 Ink W 0.1 ID 1234567891234567891

    Cependant, la dernière data de chaque ligne est une suite de 19 chiffres, que je veux utiliser comme caractère. Seulement, lors de l'ouverture, cette data est considérée comme un nombre (du moins je pense) et est "transformée" (changement dans l'écriture et perte de données). En effet, la dernière data est transformé en :
    1234567891234567891 --> 1234567891234560000
    ou pire
    1234567891234567891 --> 1,23456E+18

    Comment faire pour conserver la suite "1234567891234567891" en un caractère que je souhaite manipuler ensuite, pour retrouver les informations contenues dedans (date, ID, position et autre).

    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    sub test
    Dim MP3 as Variant
    Dim C1 as Workbook
     
    Set C1 = ThisWorkbook
     
    MP3 = Application.GetOpenFilename(, , , , False) 'recupération du chemin
    If MP3 = False Then Exit Sub
     
    Workbooks.OpenText Filename:=MP3, DataType:=xldelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Comma:=True, Space:=True, Other:=True, OtherChar:=":"
     
    end sub
    En espérant que le sujet soit claire. J'ai bien essayé de chercher, sans réponse pour le moment. J'ai toujours la possibilité de ne pas "convertir" les data csv et de tout garder sur une ligne, pour ne manipuler qu'une suite de caractère. Mais la manipulation est fastidieuse dans ce cas.
    J'ai essayé de mettre toute les cellules en format "texte" avant d'exécuter la macro, sans succès.

    Merci d'avance de votre retour ,
    Cdt,
    johann

    PS: j'en profite également pour demander si le
    est obligatoire ou non, et si un autre moyen que "ThisWorkbook" est possible pour la manipulation.

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Proposition:
    Ne pas faire la conversion à l'ouverture du fichier pour conserver l'intégralité de la data en colonne "A", extraire la partie date directement dans sa colonne de destination "O" puis, faire la conversion sur la data en colonne "A" amputée de la date.Ce qui donne:
    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
    Sub test()
        Dim MP3 As Variant
        MP3 = Application.GetOpenFilename(, , , , False) 'recupération du chemin
        If MP3 = False Then Exit Sub
        'Ouverture du fichier sans conversion
        Workbooks.OpenText Filename:=MP3, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Comma:=False, Space:=False, Other:=False, OtherChar:=False
     
        DerLig = Cells(Rows.Count, "A").End(xlUp).Row
        'On extrait les dernières valeurs en colonne O
        Range("O1:O" & DerLig).FormulaR1C1 = "=MID(RC[-14],FIND(""ID"",RC[-14],1)+3,20)"
        'on met la colonne O au format texte
        Columns("O:O").NumberFormat = "@"
        Range("O1:O" & DerLig).Value = Range("O1:O" & DerLig).Value
        For i = 1 To DerLig
            'on retire les dernières valeurs des datas en colonne A
            Cells(i, "A") = Replace(Cells(i, "A"), Cells(i, "O"), "", 1)
        Next i
        'on applique la conversion dsur les datas amputés des dernières valeurs
        Range("A1:A" & DerLig).TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
            Semicolon:=False, Comma:=True, Space:=True, Other:=True, OtherChar:=":", 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)), TrailingMinusNumbers:=True
    End Sub
    Set C1 = ThisWorkbook n'est jamais utilisé donc inutile.

    Cdlt

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur recherche materiau
    Inscrit en
    Novembre 2019
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur recherche materiau

    Informations forums :
    Inscription : Novembre 2019
    Messages : 26
    Par défaut
    Bonjour Arturo,

    Merci de ta réponse et de ton aide.
    C'est bien ce que je commençais à faire... mais pas de façon aussi élaborée que toi (mélange de MiD et FIND!!).

    J'intègre ton code (dans la matinée, dsl du délai) et fais un retour.

    Après, si on peut régler le problème dès l'ouverture, je suis preneur

    Cdt,
    johann

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour

    Regarde le paramètre FieldInfo de la méthode Workbooks.OpenText

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur recherche materiau
    Inscrit en
    Novembre 2019
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur recherche materiau

    Informations forums :
    Inscription : Novembre 2019
    Messages : 26
    Par défaut
    Bonjour mercartog,

    Merci du retour. Après essai, cela ne fonctionne toujours pas.
    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks.OpenText Filename:=Mass_P3, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Comma:=True, Tab:=True, Space:=True, Other:=True, OtherChar:=":", FieldInfo:=Array(Array(15, 2)), Local:=True
    Le résultat affiché est toujours:
    1,234 E+18 en première vue
    et si je clique dessus: 1234567891234560000 (et non 1234567891234567891) ==> donc perte d'informations.

    Cdt,
    johann

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur recherche materiau
    Inscrit en
    Novembre 2019
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur recherche materiau

    Informations forums :
    Inscription : Novembre 2019
    Messages : 26
    Par défaut
    Bonjour le forum, bonjour le fil

    Je me permets un petit up du sujet, car toujours pas trouvé de solution. Et avec le confinement, j'en ai passé du temps
    Je joins le fichier de base en format csv (enfin, je n'arrive pas à la joindre), un fichier , mais en .txt, et les fichiers "excel" extrait pour chacun des formats.
    En effet, j'ai remarqué que l'ouverture du fichier est différente selon le format. En .txt, le code fonctionne bien. En.csv, problème.

    J'utilise le code suivant:
    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
     
    Set classeur = ThisWorkbook
     
        IVdata = Application.GetOpenFilename(, , , , True)
        If IsArray(IVdata) Then GoTo Import Else Exit Sub
     
    '////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    'Import des data
    Import:
     
        Application.ScreenUpdating = False                                 'non rafraichissement écran pour gain de temps
     
        '---- Importation des data par copy/paste
        l = 1                                                                               'initialisation de l (indice des fichiers à traiter du printer P3) à 1
        For l = 1 To UBound(IVdata)                                                          
            Workbooks.OpenText Filename:=IVdata(l), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=False, Comma:=True, Space:=False, Other:=False, DecimalSeparator:=".", FieldInfo _
            :=Array(Array(1, 4), Array(2, 1), Array(3, 9), Array(4, 9), Array(5, 9), Array(6, 9), _
             Array(7, 2), 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, 9), Array _
            (20, 9), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), _
            Array(27, 1), Array(28, 9), Array(29, 1), Array(30, 1))
    nextl
    end sub
    Le paramètre FieldInfot me permet de faire apparaitre ou non des colonnes, de les traiter comme du txt ou non, mais ne fonctionne que pour le .txt.
    En plus, j'ai l'impression que le traitement n'est pas répétable dans le temps.
    Vous allez me dire, pourquoi je me prends la tête, si le code marche en .txt? Simplement que le fichier initial est en. csv.
    Voilà, en espérant être suffisamment précis pour avoir un peu d'aide,
    Bien à vous,
    Johann
    Fichiers attachés Fichiers attachés

  7. #7
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour le Fil,

    Je constate aussi le même problème avec OpenText : pour un fichier même fichier si l'extension est .txt, pas de problème mais si l'extension est .csv la définition des champs avec FieldInfo ne fonctionne pas correctement.
    La solution est simple, (c'est le commentaire du code d'Arturo qui m'a mis sur la piste) :
    - Ouverture du fichier sans conversion (Sic.)
    - Conversion du fichier avec TextToColomns qui lui, fonctionne parfaitement

    Pour le fichier initial.csv
    Code VBA : 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
    Sub test()
    Dim wbk As Workbook
    Dim rng As Range
    Dim nom As Variant
     
        nom = Application.GetOpenFilename(, , , , False)
        If nom = False Then Exit Sub
        Set wbk = Workbooks.Open(Filename:=nom, Format:=5)
        Set rng = wbk.Worksheets(1).Range("A1").CurrentRegion
        rng.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True, _
            ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Space:=False, Other:=False, FieldInfo:=Array( _
            Array(1, 4), Array(2, 4), Array(3, 2), Array(4, 2), Array(5, 2), Array(6, 2), Array(7, 2), Array(8, 1), _
            Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(14, 1), _
            Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 2), _
            Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), Array(27, 2), Array(28, 4), _
            Array(29, 1), Array(30, 1)), DecimalSeparator:=".", TrailingMinusNumbers:=True
     
    End Sub

    Remarque : dans le cas (peu fréquent) de fichiers textes (txt ou csv) dont des cellules contiennent un texte avec retour à la ligne, ces lignes seront découpées en plusieurs lignes.

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

Discussions similaires

  1. Problème de lecture d'un fichier CSV via DataSet
    Par frearnaud dans le forum C#
    Réponses: 3
    Dernier message: 22/12/2014, 12h33
  2. [XL-2007] importer données de fichiers csv via macro
    Par paul311 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/09/2012, 17h53
  3. Réponses: 1
    Dernier message: 29/02/2012, 17h42
  4. Réponses: 1
    Dernier message: 29/04/2008, 12h54
  5. [Wamp] Problème à l'import d'un fichier csv
    Par Pokerstar dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 25/05/2007, 09h15

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