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
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
Là ce n'est pas faux, et je crois que même en cuisine...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 ^^
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
- Les Constantes et Déclarations de variables toutes et toujours au début de la procédure ou fonction
- Des Constantes ou Variables dont les noms disent à quoi elles servent
- 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
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... chanteras coderas aussi bien que tu cuisines. Et là, nous organiserons un concours...
Merci à toiKaliyuga a écrit :Encore merci
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
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
et oui, ça arriveKaliyuga a écrit :Je suis également surbooké en ce moment
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.
très volontiersKaliyuga a écrit :Nulle doute que je te contacterai pour de nouveaux problèmes VBA
il sera partagéKaliyuga a écrit :Au plaisir NCC.
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