Problème de retour chariot intempestif

Bonjour,

J'ai créé un code en vue de convertir un tableau excel en fichier txt mais j'ai un problème de retour chariot quand je l'ouvre en txt. il me rajoute un saut de ligne en fin de fichier ce qui fait que j'ai une ligne blanche.

Il me faudrait juste mes ligne "pleines" et non pas de ligne blanche à la fin.

Ps: le code génère une sauvegarde de fichier donc par défaut le chemin est le c:\

J'espère que vous pourrez m'aider car je ne vois pas comment résoudre ce souci

Merci d'avance .

26test.xlsm (18.11 Ko)

Bonjour Kaliyuga

Dans un premier temps, ton code est illisible (manque d'indentation, déclaration partout dans le code)

Dans un deuxième temps pourrais-tu décrire UNE des lignes souhaitées dans le fichier TXT final !

Dans un troisième temps, il me semble que tu te compliques la vie : lorsque tu veux faire un fichier TXT il faut utiliser les fonctions de gestion des fichiers du même nom (pas une méthode tordue d'impression sur disque)

Sub GestionDesFichiersTxtAvecExcel()

    ' Pour écrire en écrasant un fichier existant
    Open "monFichierTxt" For Output As 1
        Print #1, "ceQueVeuxVoirDansLeFichierTxt"
    Close #1

    ' Pour écrire en ajoutant à une fichier existant (création automatique si absent)
    Open "nomFichierTxt" For Append As 1
        Print #1, "ceQueVeuxVoirDansLeFichierTxt"
    Close #1

    ' ------------------------------------------------------------------

    ' Pour relire un fichier (format générique)
    Open "nomFichierTxt" For Input As 1
        Input #1, ceQuiEstDansLeFicheirTxt
    Close #1

    ' Dans le cas réel
    Open "nomFichierTxt" For Input As 1
        While Not EOF(1)
            Input #1, ceQuiEstDansLeFicheirTxt
        Wend
    Close #1

End Sub

Bonjour NCC,

Nul doute que le code n'est pas parfait et que je me suis compliqué la tache mais j'ai du retraité un fichier Word envoyé par le client le retraduire en Excel pour coller à un Template type pour respecter les champs à remplir pour une intégration en automatique via flux cft. Mais ce fichier doit être en format txt.

Je ne suis pas un expert en macro loin de là. Dès que j'ai le temps je fais une vrai formation car là je fais de la cuisine ^^

Une ligne type doit être comme celle ci avec une fin de ligne simple et pas un saut de ligne.

<trade>2|QS0354439ATT|SUB|12/07/2017|18/07/2017|4.0344|61.967|EUR|250|EUR|250|||||N||||N||PBG034|</trade>

soit en code la concaténation suivante... oui y a énormément de variable et de champs à remplir:

Sheets("Load").Cells(U, 1).Value = V & A & X & B & X & C & X & D & X & E & X & F & X & G & X & H & X & I & X & J & X & K & X & L & X & M & X & N & X & O & X & P & X & Q & X & R & X & S & X & T & X & Abis & X & Bbis & X & Z

et une fois la dernière ligne générée pas de saut de ligne supplémentaire en fin de fichier.

Le rendu là est correct malgré tous les défauts c'est juste le dernier retour à la fin qui bloque l'intégration automatique.

Il faudrait que je le supprime manuellement à chaque génération mais je veux à tout prix éviter cela.

Merci d'avance

Bonjour Kaliyuga

Kaliyuga a écrit :

Je ne suis pas un expert en macro loin de là. Dès que j'ai le temps je fais une vrai formation car là je fais de la cuisine ^^

Là ce n'est pas faux, et je crois que même en cuisine...

Voici donc une recette correction, de ta cuisine procédure :

Sauf à préciser quelques ingrédients éléments que je n'aurais pas bien mélangés compris normalement tu ne devrais plus voir ce retour-charriot récalcitronant en fin de cuisson fichier

La procédure n'est pas tout à fait écrite... je te laisse compléter selon les "bonnes colonnes" à mettre

Sub Conversion()
Const baliseSep = "|"
Const baliseDeb = "<trade>"
Const baliseFin = "</trade>"

Dim ligFic As String

Dim nomFicTxt As String
Dim extFicTxt As String
Dim datFicTxt As String
Dim savFicTxt As String

Dim wsRecap As Object

Dim ligFin, ligCpt

    nomFicTxt = "DSF.SUBRED.BDFFCP."
    extFicTxt = ".txt"
    datFicTxt = Format(Date, "YYYYMMDD")

    savFicTxt = nomFicTxt & datFicTxt & "." & datFicTxt & extFicTxt

    Set wsRecap = Worksheets("RECAP LOAD")
    With wsRecap
        ligFin = .Cells(Rows.Count, 1).End(xlUp).Row
        If ligFin > 1 Then
            Open savFicTxt For Output As 1
                For ligCpt = 1 To ligFin
                    ligFic = baliseDeb
                    ligFic = ligFic & .Cells(ligCpt, 1) & baliseSep
                    ligFic = ligFic & .Cells(ligCpt, 2) & baliseSep
                    ligFic = ligFic & .Cells(ligCpt, 3) & baliseSep
                    ligFic = ligFic & .Cells(ligCpt, 4) & baliseSep
                    ligFic = ligFic & .Cells(ligCpt, 5) & baliseSep
                    ligFic = ligFic & .Cells(ligCpt, 6) & baliseSep
                    ligFic = ligFic & .Cells(ligCpt, 7) & baliseSep
                    ligFic = ligFic & "EUR" & baliseSep
                    ligFic = ligFic & .Cells(ligCpt, 9) & baliseSep
                    ligFic = ligFic & "EUR" & baliseSep
                    ' etc...
                    ligFic = ligFic & baliseFin
                    Print #1, ligFic
                Next
            Close #1
        Else
            MsgBox "RECAP LOAD est vide !", vbCritical, "Attention"
        End If
    Set wsRecap = Nothing

End Sub

PS/ Puisque tu souhaites "apprendre un jour", voici ton premier cours : les règles d'écriture

  1. Les Constantes et Déclarations de variables toutes et toujours au début de la procédure ou fonction
  2. Des Constantes ou Variables dont les noms disent à quoi elles servent
  3. Indentation du code à chaque entrée dans une boucle/un test/un traitement...

Bonjour NCC,

Merci pour ce code qui est fonctionne à merveille faut juste que je rajoute une sauvegarde de celui-ci à un endroit spécifique.

En tout cas tu as de l'humour, je suis bien meilleur en cuisine qu'en macro ... la cuisine est une passion et les macros je m'y intéresse de plus en plus.

Encore merci

Bonjour

Kaliyuga a écrit :

Merci pour ce code qui est fonctionne à merveille

Je suis heureux d'apprendre que tu cuisines mieux que tu codes... quant à l'humour c'est une arme précieuse... Elvis à dit un jour "Je ne connais absolument rien à la musique, mais dans mon domaine ce n'est pas nécessaire." et pourtant... peut-être qu'un jour, toi aussi tu chanteras coderas aussi bien que tu cuisines. Et là, nous organiserons un concours...

Kaliyuga a écrit :

Encore merci

Merci à toi

PS/ La cuisine est une passion, l'informatique est un moyen... La seule chose absolue dans un monde comme le nôtre, c'est l'humour. (Albert Einstein)

Bonjour NCC,

La macro fonctionne très bien mais le support m'affirme d'un autre petit souci qui serait lié à un problème lié à leur outil d'intégration qui utilise des fichiers TXT au format INUX alors que là mon fichier est au format TXT mais Windows.

Je vais essayer de trouver une parade par moi même mais si tu vois comment faire j'accepte volontiers ton aide

Cordialement Kaliyuga ^^

Bonjour

Désolé j'ai été un peu "surbooké" ces temps-ci...

Il me semblait en regardant la méthode du départ, qu'il devait s'agir d'une compatibilité UNIX... en effet les fichiers TXT ne sont pas tout a fait interprétés de la même manière que sous Windows...

J'avoue que je ne me souviens comment je "contournais" ce problème "dans le temps"

à tenter peut-être écrire le fichier en mode caractère avec il me semble un LF pour marquer les fins de lignes mais je ne suis pas certain

Bonjour NCC,

Je suis également surbooké en ce moment mais merci malgré tout de prendre le temps de répondre.

J'ai réussi à trouvé une parade pour les retour chariot et ça marche parfaitement je ne sais pas si c'est la solution la plus propre mais elle fonctionne très bien.

La fin du code m'a permis de résoudre mon problème.

'Conversion du fichier Excel en fichier texte

Const baliseSep = "|"

Const baliseDeb = "<trade>"

Const baliseFin = "</trade>"

Dim ligFic As String

Dim nomFicTxt As String

Dim extFicTxt As String

Dim datFicTxt As String

Dim savFicTxt As String

Dim finFicTxt As String

Dim wsRecap As Object

Dim ligFin, ligCpt, Src

nomFicTxt = "C:\********\DSF.SUBRED.BNPPAMSG2E."

extFicTxt1 = ".txt"

extFicTxt2 = ".mf"

datFicTxt = Format(Date, "YYYYMMDD")

savFicTxt = nomFicTxt & datFicTxt & "." & datFicTxt & extFicTxt1

finFicTxt = nomFicTxt & datFicTxt & "." & datFicTxt & extFicTxt2

Set wsRecap = Worksheets("RECAP LOAD")

With wsRecap

ligFin = .Cells(Rows.Count, 1).End(xlUp).Row

If ligFin > 1 Then

Open savFicTxt For Output As 1

For ligCpt = 2 To ligFin

ligFic = baliseDeb

ligFic = ligFic & .Cells(ligCpt, 1) & baliseSep

ligFic = ligFic & .Cells(ligCpt, 2) & baliseSep

ligFic = ligFic & .Cells(ligCpt, 3) & baliseSep

ligFic = ligFic & .Cells(ligCpt, 4) & baliseSep

ligFic = ligFic & .Cells(ligCpt, 5) & baliseSep

ligFic = Replace(ligFic & .Cells(ligCpt, 6).Value, ",", ".") & baliseSep

ligFic = Replace(ligFic & .Cells(ligCpt, 7).Value, ",", ".") & baliseSep

ligFic = ligFic & "EUR" & baliseSep

ligFic = Replace(ligFic & .Cells(ligCpt, 9).Value, ",", ".") & baliseSep

ligFic = ligFic & "EUR" & baliseSep

ligFic = Replace(ligFic & .Cells(ligCpt, 11).Value, ",", ".") & baliseSep

ligFic = ligFic & baliseSep

ligFic = ligFic & baliseSep

ligFic = ligFic & baliseSep

ligFic = ligFic & .Cells(ligCpt, 15) & baliseSep

ligFic = ligFic & .Cells(ligCpt, 16) & baliseSep

ligFic = ligFic & baliseSep

ligFic = ligFic & baliseSep

ligFic = ligFic & baliseSep

ligFic = ligFic & .Cells(ligCpt, 16) & baliseSep

ligFic = ligFic & baliseSep

ligFic = ligFic & .Cells(ligCpt, 17) & baliseSep

ligFic = ligFic & baliseFin

Print #1, ligFic

Next

Close #1

Else

MsgBox "RECAP LOAD est vide !", vbCritical, "Attention"

End If

Set wsRecap = Nothing

End With

'Conversion du fichier Windows en fichier Linux

Open savFicTxt For Input As 1

Open finFicTxt For Output As 2

Src = Input(LOF(1), #1)

Src = Replace$(Src, vbCrLf, vbLf)

Print #2, Src

Close

'Suppression du fichier Windows

Kill (savFicTxt)

Sheets("BD").Select

End Sub

Merci encore pour toute ton aide très précieuse.

Nulle doute que je te contacterai pour de nouveaux problèmes VBA

Au plaisir NCC.

Kaliyuga.

Bonjour Kaliyuga

Kaliyuga a écrit :

Je suis également surbooké en ce moment

et oui, ça arrive

Merci à toi pour

Kaliyuga a écrit :

mais merci malgré tout de prendre le temps de répondre.

Kaliyuga a écrit :

Merci encore pour toute ton aide très précieuse.

Kaliyuga a écrit :

Nulle doute que je te contacterai pour de nouveaux problèmes VBA

très volontiers
Kaliyuga a écrit :

Au plaisir NCC.

il sera partagé

Quant à "ta" solution, elle est pertinente... et fonctionnelle, il y aurait légèrement plus simple, sans être obligé de "ré-écrire" le fichier une deuxième fois, mais puisque ça fonctionne comme "tu le fais" le jeu n'en vaut pas la chandelle... Bravo en tout cas

Rechercher des sujets similaires à "probleme retour chariot intempestif"