Problème de retour chariot intempestif

Y compris Power BI, Power Query et toute autre question en lien avec Excel
K
Kaliyuga
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 23 janvier 2017
Version d'Excel : Excel 2010

Message par Kaliyuga » 13 octobre 2017, 07:42

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 :).
Test.xlsm
(18.11 Kio) Téléchargé 18 fois
N
NCC 1701
Membre fidèle
Membre fidèle
Messages : 449
Appréciation reçue : 1
Inscrit le : 4 septembre 2016
Version d'Excel : 95..2013 PC FR

Message par NCC 1701 » 13 octobre 2017, 09:01

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
Cordialement
K
Kaliyuga
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 23 janvier 2017
Version d'Excel : Excel 2010

Message par Kaliyuga » 13 octobre 2017, 09:19

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
N
NCC 1701
Membre fidèle
Membre fidèle
Messages : 449
Appréciation reçue : 1
Inscrit le : 4 septembre 2016
Version d'Excel : 95..2013 PC FR

Message par NCC 1701 » 14 octobre 2017, 02:04

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... :lol:

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 :lol:

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...
Cordialement
K
Kaliyuga
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 23 janvier 2017
Version d'Excel : Excel 2010

Message par Kaliyuga » 16 octobre 2017, 15:22

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 :)
N
NCC 1701
Membre fidèle
Membre fidèle
Messages : 449
Appréciation reçue : 1
Inscrit le : 4 septembre 2016
Version d'Excel : 95..2013 PC FR

Message par NCC 1701 » 17 octobre 2017, 01:08

Bonjour
Kaliyuga a écrit :Merci pour ce code qui est fonctionne à merveille
:D :D

Je suis heureux d'apprendre que tu cuisines mieux que tu codes... :lol: 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 :D :D

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)

:btres:
Cordialement
K
Kaliyuga
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 23 janvier 2017
Version d'Excel : Excel 2010

Message par Kaliyuga » 17 octobre 2017, 14:29

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 ^^
N
NCC 1701
Membre fidèle
Membre fidèle
Messages : 449
Appréciation reçue : 1
Inscrit le : 4 septembre 2016
Version d'Excel : 95..2013 PC FR

Message par NCC 1701 » 23 octobre 2017, 03:42

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 ;;)
Cordialement
K
Kaliyuga
Nouveau venu
Nouveau venu
Messages : 9
Inscrit le : 23 janvier 2017
Version d'Excel : Excel 2010

Message par Kaliyuga » 26 octobre 2017, 07:23

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.
N
NCC 1701
Membre fidèle
Membre fidèle
Messages : 449
Appréciation reçue : 1
Inscrit le : 4 septembre 2016
Version d'Excel : 95..2013 PC FR

Message par NCC 1701 » 26 octobre 2017, 07:58

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.
:D
Kaliyuga a écrit :Merci encore pour toute ton aide très précieuse.
:D :D
Kaliyuga a écrit :Nulle doute que je te contacterai pour de nouveaux problèmes VBA
très volontiers :D :D :D
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 ;;)
Cordialement
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message