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 :

Export délimité en TXT


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    novembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Export délimité en TXT
    Bonjour à tous,

    Je souhaite produire un fichier TXT avec un nombre précis de caractères pour chaque colonne.
    En effet, mon export devant aller être importer par un software et chaque colonne doit débuter à un endroit bien précis.

    J'ai réussi à dégoter un code sur internet qui fonctionne plutôt pas mal .... mais (ça serait pas drôle sinon), j'ai l'impression qu'il rajoute des espaces vides non désirés entre chaque colonne après le nombre de caractères souhaités.



    Un exemple sera beaucoup plus explicite :

    Je souhaite donc délimiter mes colonnes comme suit :

    Colonne A : 2
    Colonne B : 20
    Colonne C : 11
    Colonne D : 48

    Le résultat souhaité :

    C10000000000000000000056041017300MONIET

    On remarque donc bien que la colonne B qui reprend le code (00000000000000000000) démarre bien au 3ème caractère de ma ligne.
    La colonne C démarre bien aux 23eme caractère de ma ligne.

    Le résultat obtenu :


    Nom : Capture.PNG
Affichages : 46
Taille : 2,1 Ko

    Je ne comprends pas, comment avec une délimitage précis de mes colonnes, j'obtiens des espaces non désirés.
    Le message ne le montre pas clairement, mais j'obtiens :

    12 espaces entre la colonne A & B
    8 espaces entre la B & C
    3 espaces entre la C & D

    Je vous joints le code ainsi que le fichier contenant le code.
    D'avance merci pour votre aide.


    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
    Public Sub txtproduction()
    Dim myFile As String, rng As Range, cellValue As Variant, I As Integer, J As Integer
    Dim Nomfichier As String
    Dim chemin As String
    Dim S(29) As Integer
     
    Sheets("formating").Select
     
       S(0) = 2
       S(1) = 20
       S(2) = 11
       S(3) = 48
     
    Nomfichier = InputBox("Nom du fichier ?")
    chemin = ThisWorkbook.Path
     
     
    myFile = chemin & "\" & Nomfichier & ".txt"
    Set rng = ActiveSheet.UsedRange
    Open myFile For Output As #1
    For I = 1 To rng.Rows.Count
         For J = 1 To rng.Columns.Count
            cellValue = rng.Cells(I, J).Value
            cellValue = Left(cellValue, S(J - 1))
            cellValue = cellValue & String(S(J - 1) - Len(cellValue), Chr(32))
            If J = rng.Columns.Count Then
                Print #1, cellValue
            Else
                Print #1, cellValue,
            End If
        Next J
    Next I
    Close #1
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    16 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 16 602
    Points : 47 792
    Points
    47 792
    Billets dans le blog
    88
    Par défaut
    Salut.

    Voici quelque chose qui pourrait convenir, sur base bien sûr d'un tableau structuré.

    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
    Sub Test()
      Dim Filename As String
      Dim Channel As Long
      Dim i As Long
      Dim Value As String
      Dim r As Range
     
      Channel = FreeFile
      Filename = "c:\data\temp\Export.txt"
      Open Filename For Output As #Channel
        For i = 1 To Range("tableau1").Rows.Count
          Set r = Range("tableau1").ListObject.ListRows(i).Range
          Value = r(1).Value & r(2) & String(20 - Len(r(2).Value), "0") & _
            r(3) & String(11 - Len(r(3).Value), "0") & r(4) & String(48 - Len(r(4).Value), "0")
          Print #Channel, Value
        Next
      Close #Channel
    End Sub
    On pourrait configurer les colonnes du TXT dans un tableau structuré pour rendre la procédure un peu plus générique.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    novembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour Pierre,

    D'abord merci pour votre aide, mais lors du lancement du code, il m'indique "Run-time error 91" Object variable or with block variable not set lorsque j'atteins la ligne en bold du code ci-dessous.
    Sauriez vous pourquoi?

    D'avance merci


    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
    Sub Test()
      Dim Filename As String
      Dim Channel As Long
      Dim i As Long
      Dim Value As String
      Dim r As Range
     
      Channel = FreeFile
      Filename = "\\insim.biz\wpsGroups\BE\Groups\051099\Projecten\Project PeopleSoft 2018\Listing Tasks & Sources\INAMI\Testexportforum.txt"
      Open Filename For Output As #Channel
        For i = 1 To Range("A1:BZ300").Rows.Count
          Set r = Range("A1:BZ300").ListObject.ListRows(i).Range
          Value = r(1).Value & r(2) & String(20 - Len(r(2).Value), "0") & _
            r(3) & String(11 - Len(r(3).Value), "0") & r(4) & String(48 - Len(r(4).Value), "0")
          Print #Channel, Value
        Next
      Close #Channel
    End Sub

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    16 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 16 602
    Points : 47 792
    Points
    47 792
    Billets dans le blog
    88
    Par défaut
    Tu dois avoir délimité ta plage comme un tableau structuré pour pouvoir utiliser le ListObject. est-ce le cas?

    Normalement, les données que l'on va envoyer dans un txt sont issues d'un tableau structuré, et il est préférable d'utiliser le nom du tableau plutôt que son emplacement.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    novembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    effectivement cela fonctionne bien mieux avec un tableau structuré.

    Un tout grand merci pour votre intervention. Je m'y replonge

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    novembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Hello,

    je réouvre le sujet suite à une erreur rencontrée dans la génération du Txt.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r(X) & String(10 - Len(r(X).Value), Chr(32))


    Le TXT se produit de façon admirable lorsque le nombre fixé (ici 10) est supérieur au "Len(r(X).value". Il rajoute des 0 comme demandé.
    Cependant, si le nombre de caractères fixés est inférieur à la valeur que renvoit "Len(r(X).value", le message d'erreur suivant apparait :
    Run-time error : 5, Invalid call procedure or argument
    Quelle serait la solution pour que le code me renvoit que les 10 premiers caractères de ma cellules même si celle-ci en contient plus.

    D'avance merci

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    16 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 16 602
    Points : 47 792
    Points
    47 792
    Billets dans le blog
    88
    Par défaut
    text = Left(text & "0000000000", 10)


    Nom : 2020-11-24_162059.png
Affichages : 31
Taille : 5,5 Ko
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    novembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2020
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    text = Left(text & "0000000000", 10)



    Correction de mon message précédent, j'ai besoin d'espaces vides (et non pas des 0) lorsque j'ai des espaces manquants. D'où le Chr(32) dans le code vba que j'ai posté plus haut.

    Et comment puis-je intégrer votre ligne dans mon code pour le coup? Sachant que j'ai 4colonnes de 250lignes chacunes qui peuvent voir des cellules excéder la taille max.

    D'avance merci

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    16 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 16 602
    Points : 47 792
    Points
    47 792
    Billets dans le blog
    88
    Par défaut
    J'avais cru comprendre que tu voulais les caractères à droite, mais dans une des illustrations, je vois que tu les mets à gauche. De plus, pour éviter de compter les espaces, je préfères ceci qui ajoute les espaces à droite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Left(Text & String(10, " "), 10)
    Si tu veux les espaces à gauche, tu dois utiliser ceci (mais évidemment, ton texte sera éventuellement tronqué au début plutôt qu'à la fin)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Right(String(10, " ") & Text, 10)
    Tu dois utiliser cette technique à la place de l'autre, dans ta ligne r(X) & String(10 - Len(r(X).Value), Chr(32)) qui devient pour des espaces à droite!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Value = r(1).Value & Left(r(2) & String(20, " "), 20) & _
            Left(r(3) & String(11, " "), 11) & Left(r(4) & String(48, " "), 48)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    juin 2019
    Messages
    530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : juin 2019
    Messages : 530
    Points : 802
    Points
    802
    Par défaut
    Bonsoir,
    autre approche.
    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
    Sub test()
    Const Path As String = "C:\Test"
    Const Champs As String = "Col1=A Text Width 2" & vbCrLf & _
    "Col2=B Text Width 20" & vbCrLf & _
    "Col3=C Text Width 11" & vbCrLf & _
    "Col4=D Text Width 48" & vbCrLf
    Dim cible As String
    cible = "TOTO#CSV"
    ShemaIni Path, cible, "FixedLength", Champs, True
    Dim R As Range
    Set R = Sheets("Formating").Range("A1").CurrentRegion
     
     
    Dim Cn As Object
     Set Cn = CreateObject("ADODB.Connection")
      Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & Path & "' ;Extended Properties=""text;HDR=Yes;FMT=Delimited(,)"""
     
      For I = 1 To R.Rows.Count
      Cn.Execute (" insert into " & cible & "(A,B,C,D) values('" & R(I, 1) & "','" & R(I, 2) & "','" & R(I, 3) & "','" & R(I, 4) & "')")
      Next
       Cn.Close
      MsgBox "Fin"
    End Sub
     
     
    Public Sub ShemaIni(Rep As String, fichier As String, Delimited As String, Optional Champs As String = "", Optional NewCsv As Boolean = False)
    Dim txt As String
    txt = "[" & Replace(fichier, "#", ".") & "]" & vbCrLf & "Format=" & Delimited
    If Champs <> "" Then txt = txt & vbCrLf & Champs
    Dim fso, NewFichier
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set NewFichier = fso.OpenTextFile(Rep & "\schema.ini", 2, True)
    NewFichier.Write txt
    NewFichier.Close
    If NewCsv = True Then
        Set NewFichier = fso.OpenTextFile(Rep & "\" & Replace(fichier, "#", "."), 2, True)
        NewFichier.Write ""
        NewFichier.Close
     
     
    End If
    Set NewFichier = Nothing
    Set fso = Nothing 
    End Sub
    Après on peut imaginer une requête paramètrable!

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    16 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 16 602
    Points : 47 792
    Points
    47 792
    Billets dans le blog
    88
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    [...]
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 883
    Points : 4 796
    Points
    4 796
    Par défaut
    hello,
    Citation Envoyé par Bediro Voir le message
    Je souhaite produire un fichier TXT avec un nombre précis de caractères pour chaque colonne.
    J'ai réussi à dégoter un code sur internet qui fonctionne plutôt pas mal .... mais (ça serait pas drôle sinon), j'ai l'impression qu'il rajoute des espaces vides non désirés entre chaque colonne après le nombre de caractères souhaités.
    ton code initial est presque bon, le problème se situe au niveau de la ligne
    avec une virgule à la fin, le Print rajoute des espaces entre chaque colonne
    Par contre si tu mets un point-virgule à la fin tu n'auras pas d'espaces :
    Avec ce code :
    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
    Public Sub txtproduction()
    Dim myFile As String, rng As Range, cellValue As Variant, I As Integer, J As Integer
    Dim Nomfichier As String
    Dim chemin As String
    Dim Width As Variant
    Width = Array(2, 20, 11, 48, 12, 8, 7, 32, 4, _
                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _
                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
    '              4, 10, 7, 7, 40, 40, 1, 1, 15, 1, _
    '              8, 8, 1, 1, 1, 1, 2, 2, 1, 1)
     
     
    Sheets("formating").Select
     
    Nomfichier = InputBox("test n°?")
    chemin = ThisWorkbook.Path
     
     
    myFile = chemin & "\" & Nomfichier & ".txt"
    Set rng = ActiveSheet.UsedRange
    Open myFile For Output As #1
    For I = 1 To rng.Rows.Count
         For J = 1 To rng.Columns.Count
            cellValue = rng.Cells(I, J).Value
            cellValue = Left(cellValue, Width(J - 1))
            cellValue = cellValue & String(Width(J - 1) - Len(cellValue), Chr(32))
            If J = rng.Columns.Count Then
                Print #1, cellValue
            Else
                Print #1, cellValue;
            End If
        Next J
    Next I
    Close #1
    End Sub
    J'obtiens ceci :

    Nom : exportTxt.PNG
Affichages : 18
Taille : 25,9 Ko

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. [VBA]Export auto en txt avec nom du jour
    Par micktriathlon dans le forum SDK
    Réponses: 3
    Dernier message: 11/04/2007, 13h55
  2. exportation excel vers txt
    Par actaruss dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 06/09/2006, 10h38
  3. Problème d'export délimité
    Par Gretch_34 dans le forum Access
    Réponses: 6
    Dernier message: 08/08/2006, 15h30
  4. Export au format txt : gestion des NULL
    Par guidav dans le forum Access
    Réponses: 3
    Dernier message: 08/08/2006, 12h28
  5. [MSSqlServeur 2000] export vers fichier txt
    Par squal_13 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 30/11/2004, 13h19

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