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 :

[VBA - EXCEL] Pb de conversion fichier txt avec methode TextToColumns


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut [VBA - EXCEL] [PAS RESOLU-abandonné] Pb de conv.fichier txt avec TextToColumns
    Bonjour,

    Je cherche à me faire une petite macro en VB (excel toute versions), qui me convertit un fichier CSV (sep. = point virgule).
    Dans certaines colonnes, j'ai des valeur hexa 16 bits, qui sont interprétée comme des nombre, et la c'est le drame: une valeur 07E5 est traduite par 70000... logique
    J'ai donc essayé de spécifier le format de chaque colonne avec le champ FieldInfo (oui, j'ai bien lu l'aide )
    Le problème est que j'ai 168 colonnes à traiter, et si j'écris des trucs du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Selection.TextToColumns Destination:=Range("A1"), _
    DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
    ConsecutiveDelimiter:=False, Tab:=False, _
    Semicolon:=True, Comma:=False, 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, 2), Array(9, 2), Array(10, 2), _
    Array(11, 2), Array(12, 2), Array(13, 2 ), Array(14, 2), Array(15, 2), _
    Array(16, 2), Array(17, 2), Array(18, 2), Array(19, 2)), etc...
    et bien je dépasse les capacités de l'éditeur apparemment !



    Donc, j'ai tenté d'écrire un truc plus intelligent:
    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
     
    Dim TableauDeCol(256) As Variant
    Dim TableauDeFormats As Variant
    Dim i As Integer
    TableauDeFormats = Array(1, 1, 1, 1, 1, 1, 1, _
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _
    1, 1, 1, 1, 1, 1, 1, 1, 1, _
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _
    1, 1, 1, 1, 1, 1, 1, _
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
    1, 1, 1, 1, 1, 1, 1, 1)
     
        iNbCol = UBound(TableauDeFormats)
        For i = 1 To iNbCol
            TableauDeCol(i) = Array(i, TableauDeFormats(i))
        Next i
     
        Columns("A:A").Select
        Selection.TextToColumns Destination:=Range("A1"),  _
    DataType:=xlDelimited, _
       TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            FieldInfo:=TableauDeCol, _
            Semicolon:=True, Comma:=False, Space:=False, Other:=False
    En clair, je construit un tableau de tableau contenant les formats de chaque colonne (1 pour standard, 2 pour texte).

    Mais ca coince: erreur -13 incompatibilité de type.


    Si qqun à une idée, merci d'avance.

  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
    Points : 15 546
    Points
    15 546
    Par défaut
    Sans aller plus loin, tu n'es pas obligé de préciser tes n colonnes. Il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Workbooks.Open Filename:="D:\xls\Fichier.csv"
    Ensuite, je ne comprends pas cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           TableauDeCol(i) = Array(i, TableauDeFormats(i))
    Un tableau de tableau dont tu n'auras qu'une valeur ?
    Peux-tu préciser ta pensée ?
    1+

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse.

    Citation Envoyé par ouskel'n'or
    Sans aller plus loin, tu n'es pas obligé de préciser tes n colonnes. Il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Workbooks.Open Filename:="D:\xls\Fichier.csv"
    Alors j'ai évidemment tenté ça il y a bien longtemps, mais le format d'importation est "Standard" (Valeur 1 dans mes tableaux), et c'est justement la qu'apparait le probleme des traductions auto des valeurs HEXA.

    Citation Envoyé par ouskel'n'or
    Ensuite, je ne comprends pas cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           TableauDeCol(i) = Array(i, TableauDeFormats(i))
    Un tableau de tableau dont tu n'auras qu'une valeur ?
    Peux-tu préciser ta pensée ?
    Je n'ai fais qu'enregistrer une macro en auto pour voir ce que fait excel quand il convertit: et justement, il ecrit ce genre de choses, avec des tableaux de tableau...
    Ma bouclette ne fait que construire dynamiquement le tableau attendu de FieldInfo.
    J'ai à priori juste un problème de syntaxe sur l'utilisation du champ FieldInfo.

    Voila mes sombres pensées.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Je précise à toutes fins utiles que ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Selection.TextToColumns Destination:=Range("A1"), _
    DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
    ConsecutiveDelimiter:=False, Tab:=False, _
    Semicolon:=True, Comma:=False, 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, 2), Array(9, 2), Array(10, 2), _
    Array(11, 2), Array(12, 2), Array(13, 2 ), Array(14, 2), Array(15, 2), _
    Array(16, 2), Array(17, 2), Array(18, 2), Array(19, 2)), etc...
    c'est généré par l'enregistrement de macro d'excel, et qu'il se plante tout seul parce que justement, je lui demande de faire ça sur trop de colonne, et que ca lui créé" une ligne de code trop grande.

    J'espère avoir été plus clair.

  5. #5
    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
    Points : 15 546
    Points
    15 546
    Par défaut
    Teste ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub LaMacro()
        Name "D:\xls\TonFichier.csv" As "D:\xls\TonFichier.txt"
        Workbooks.OpenText Filename:="D:\xls\TonFichier.txt", Origin:= _
            xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlNone, _
            ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:=False _
            , Space:=False, Other:=False
    End sub
    Mon test m'a ouvert le fichier en format scientifique
    Tu dis

    Edit
    Tu peux sans doute simplifier cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Workbooks.OpenText Filename:="D:\xls\TonFichier.txt", Origin:= xlWindows, _
     StartRow:=1, DataType:=xlDelimited, Tab:=False, Semicolon:=True
    Re : Testé, ok.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ouskel'n'or
    Teste ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub LaMacro()
        Name "D:\xls\TonFichier.csv" As "D:\xls\TonFichier.txt"
        Workbooks.OpenText Filename:="D:\xls\TonFichier.txt", Origin:= _
            xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlNone, _
            ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:=False _
            , Space:=False, Other:=False
    End sub
    Mon test m'a ouvert le fichier en format scientifique
    Tu dis

    Edit
    Tu peux sans doute simplifier cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Workbooks.OpenText Filename:="D:\xls\TonFichier.txt", Origin:= xlWindows, _
     StartRow:=1, DataType:=xlDelimited, Tab:=False, Semicolon:=True
    Re : Testé, ok.
    Cette fonction fait exactement le meme genre d'erreur que TextToColums



    Je vais reformuler ma question:

    comment fait-on pour définir le champ FieldInfo (de la fonction OpenText ou TextToColums) en indiquant que l'on veut que la colonne 1 soit considérée lors de l'import de type standard (=1), la 2eme colonne de type texte (=2), etc... sur 168 colonnes. Et ce, sans planter l'interpréteur VB

    Merci

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    un exemple de fichier que je voudrais traiter:
    30/01/07;10:27:23;NG6;S119565_001_;PROD;17006;1;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;;;;;;;;;;;;;;;;;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;0000;;;;;;;;;;;;;;;;;0.00;0;0.00;0;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-99999.000;-99999;-99999.000;-99999;;;;;;;;;;;;;;;;;;;;;;;;;;;0.000;0;0.000;0;-1;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;
    30/01/07;09:39:27;NGV;S119566_001_;PROD;416;7;0083;FC2F;0000;0000;6850;CE5F;FAF8;4046;0704;00FF;8B7A;0332;95D4;0170;FF88;15E8;;;;;;;;;;;;;;;;;FE76;F9A3;0000;0000;EF18;CB61;FAF8;4046;0704;00FF;8B7A;02F3;91D4;0094;02F3;C66D;;;;;;;;;;;;;;;;;195.66;1;365.24;1;1;1;148.0;148.0;1;1264;EDCE;0120;F2D2;F406;131E;FE62;EE0B;121B;12A4;F266;F456;0.0;0.0;0;;;;;;;;;;;;;;;;;;;;96.692;0;106.497;0;;;;;;;;;;;;;;;;;;;;;;;;;;;0.000;0;0.000;0;-1;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;
    30/01/07;09:43:29;NGV;S119566_001_;PROD;418;7;01E2;FE43;0000;0000;27DD;CB60;FAF8;4046;0704;00FF;8B7A;0332;95D4;FF2C;FFE4;8ADE;;;;;;;;;;;;;;;;;0953;08C1;0000;0000;B6DF;CA71;FAF8;4046;0704;00FF;8B7A;02F3;99D4;FD86;FEEC;668F;;;;;;;;;;;;;;;;;189.64;1;361.87;1;1;1;134.0;140.0;1;1BAF;E31D;029D;EDC7;F172;20A2;03E2;E75C;2174;25CD;F2FB;F397;0.0;0.0;0;;;;;;;;;;;;;;;;;;;;110.834;0;107.763;0;;;;;;;;;;;;;;;;;;;;;;;;;;;0.000;0;0.000;0;-1;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;
    30/01/07;09:43:35;NGV;S119566_001_;PROD;419;6;FBCA;FE9F;0000;0000;E88A;D45C;FAF8;4046;0704;00FF;8B7A;0332;92D4;000C;0138;EE9D;;;;;;;;;;;;;;;;;0B8E;FFA0;0000;0000;7D6A;BB6B;FAF8;4046;0704;00FF;8B7A;02F3;9DD3;FCDF;011E;74DC;;;;;;;;;;;;;;;;;188.68;1;357.93;1;1;1;150.0;146.0;1;0F3C;EB3C;FE3B;F496;F5B5;1453;04F6;F17E;179A;1629;F572;F4DC;0.0;0.0;0;;;;;;;;;;;;;;;;;;;;112.184;0;106.154;0;;;;;;;;;;;;;;;;;;;;;;;;;;;0.000;0;0.000;0;-1;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;
    30/01/07;09:44:24;NGV;S119566_001_;PROD;420;6;0822;FFC4;0000;0000;A218;C85E;FAF8;4046;0704;00FF;8B7A;0332;94D3;FD03;FEDA;480E;;;;;;;;;;;;;;;;;0F1C;05D7;0000;0000;8D62;C06B;FAF8;4046;0704;00FF;8B7A;02F3;9BD3;FB76;FFB9;6190;;;;;;;;;;;;;;;;;186.06;1;364.36;1;1;1;146.0;148.0;1;14A7;F022;0310;F436;F4FB;1441;0648;F2D0;18BF;18CF;F839;F789;0.0;0.0;0;;;;;;;;;;;;;;;;;;;;109.826;0;110.400;0;;;;;;;;;;;;;;;;;;;;;;;;;;;0.000;0;0.000;0;-1;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;0.000;


    A partir de la 8eme colonne, je veux imposer le format "texte"...

  8. #8
    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
    Points : 15 546
    Points
    15 546
    Par défaut
    Je lis ça sur "Assistant importation de Texte - Etape 3/3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L'option standard convertit les valeurs numériques en nombre, les dates en date et les autres valeurs en texte
    Pas taper !

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    oui mais 01E2, il prend ça pour un nombre = 100 par defaut.
    J'abandonne

  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
    Points : 15 546
    Points
    15 546
    Par défaut
    Bon ! On va le régler, ce problème !
    Ouvre ton fichier en fichier text et remplis tes colonnes
    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
    Sub RéglerLeProblème()
    Dim NoLigne as integer, i as integer
    Dim LesCellules, LaLigne  
        Close
        Open "c:\LeFichier.csv" For Input As #1
        While Not EOF(1)
            Line Input #1, LaLigne
            NoLigne = NoLigne + 1
            LesCellules = Split(LaLigne, ";")
            For i = 0 To UBound(LesCellules)
                Cells(NoLigne, i + 1).Value = LesCellules(i)
            Next
        Wend
        Close
    End Sub
    A défaut de grive, on mange des merles...
    Je ne suis sûr de rien mais, au niveau de désespoir auquel tu es parvenu, ça coûte rien d'essayer. Tu adaptes... Nom de la feuille, ligne de départ... etc.
    Tu dis
    A+

Discussions similaires

  1. Réponses: 10
    Dernier message: 02/03/2009, 18h24
  2. [VBA Excel] Extraction de données fichier txt vers Excel et mise en forme
    Par newcodeur dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 23/05/2008, 12h45
  3. Réponses: 11
    Dernier message: 13/09/2007, 16h25
  4. ouverture de fichier txt avec excel
    Par blondelle dans le forum C++Builder
    Réponses: 5
    Dernier message: 24/05/2006, 12h33
  5. Réponses: 28
    Dernier message: 22/05/2006, 17h25

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