Autres VBA Export en fichier TXT delimité - avec Taille & Position

cheribibi33

XLDnaute Nouveau
Bonjour,

je dois créer un fichier txt (DOS/WINDOWS) depuis un fichier excel. C'est pour réaliser un fichier CFONB (transmission de données banque).

Dans mon exemple j'ai cette macro qui me crée le fichier.

Par contre mon problème est que je dois respecter des tailles et des positions de champs. C'est la que je bloque.

Code:
Sub SaveAsTXT()
Dim Range As Object, Line As Object, Cell As Object
Dim StrTemp As String
Dim Nomfichier As String
Dim chemin As String
Dim Separateur As String

    ActiveWorkbook.Save
    Sheets("DEPOT").Select

Nomfichier = InputBox("Veuillez entrer le nom de fichier pour la SVG" & Chr(13) & Chr(10) & "Ajouter N° Bordreau_AAMMJJ ", "Nom fichier ?")
chemin = ThisWorkbook.Path & "\FICHIERS\TXT_"
Separateur = ""
Set Range = ActiveSheet.UsedRange
Open chemin & Nomfichier & ".txt" For Output As #1
For Each Line In Range.Rows
StrTemp = " "
For Each Cell In Line.Cells
StrTemp = StrTemp & CStr(Cell.Text) & Separateur
Next
Print #1, StrTemp '= " "
Next
Close
End Sub

Ligne 1 reprend ces données : Enregistrement émetteur
Code:
N°    CHAMP                TAILLE    POSITION    DESCRIPTION
1    TYPE D'ENREGISTREMENT        9 (02)    1 à 2        Initialisé à 03
2    CODE OPERATION            9 (02)    3 à 4        Initialisé à 60
3    NUMEROTAGE            9 (08)    5 à 12        N° d'ordre de l'enr ( facultatif )
4    FILLER                9 (06)            13 à 18    Initialisé à blanc
5    FILLER                X (06)            19 à 24    Initialisé à blanc
6    DATE DE REMISE            9 (06)    25 à 30        Date de constitution du fichier
7    RAISON SOCIALE DU CEDANT    X (24)    31 à 54        Votre raison sociale
8    DOMICILIATION BANCAIRE        X (24)    55 à 78        Nom de votre banque
9    CODE ENTREE            9 (1)    79        Code du type de remise
10    CODE DAILLY            X (01)    80    
11    MONNAIE DE LA REMISE        X (01)    81        E pour Euro
12    CODE BANQUE DU CEDANT        9 (05)    82 à 86   
13    CODE GUICHET DU CEDANT        9 (05)    87 à 91        Code guichet du cédant
14    N° DE COMPTE DU CEDANT        X (11)    92 à 102    N° de compte du cédant
15    FILLER                X (16)    103 à 118    Initialisé à blanc
16    DATE DE VALEUR            9 (06)    119 à 124    Date de Valeur
17    FILLER                X (10)    125 à 134   
18    IDENTIFIANT ADHERENT        X (10)    135 à 144    N° d’adh.t (sur 7) + N°contrat (sur 3)
19    FILLER                X (16)    145 à 160    Initialisé à blanc

Ligne 2 à X lignes selon le nombre de clients : ENREGISTREMENT DESTINATAIRE
Code:
N°    CHAMP                TAILLE    POSITION    DESCRIPTION
1    TYPE D'ENREGISTREMENT        9 (02)    1 à 2        Initialisé à 06
2    CODE OPERATION            9 (02)    3 à 4        Initialisé à 60
3    NUMEROTAGE            9 (08)    5 à 12        N° d'ordre de l'enr.(facultatif)
4    FILLER                X (06)    13 à 18        Initialisé à blanc
5    FILLER                X (02)    19 à 20        Initialisé à blanc
6    REFERENCE TIRE            X (10)    21 à 30        Votre n° de débiteur
7    RAISON SOCIALE DU TIRE        X (24)    31 à 54        Raison sociale du tiré
8    DOMICILIATION BANCAIRE        X (24)    55 à 78        Domiciliation bancaire du tiré
9    CODE ACCEPTATION        9 (01)    79        Code acceptation
10    FILLER                X (02)    80 à 81        Initialisé à blanc
11    CODE BANQUE DU TIRE        9 (05)    82 à 86        Code banque du tiré
12    CODE GUICHET DU TIRE        9 (05)    87 à 91        Code guichet du tiré
13    N° DE COMPTE DU TIRE        X (11)    92 à 102    N° de compte du tiré
14    MONTANT                9 (12)    103 à 114    Montant de l’effet
15    FILLER                X (04)    115 à 118    Initialisé à blanc
16    DATE D'ECHEANCE            9 (06)    119 à 124    Date d'échéance de l’effet
17    DATE DE CREATION        9 (06)    125 à 130    Date de création de l’effet
18    FILLER                X (20)    131 à 150    Initialisé à blanc
19    REFERENCE TIREUR        X (10)    151 à 160

Ligne X (dernière ligne) selon nombre de ligne Clients : ENREGISTREMENT TOTAL
Code:
N°    CHAMP    TAILLE            POSITION        DESCRIPTION
1    TYPE D'ENREGISTREMENT        9 (02)    1 à 2        Initialisé à 08
2    CODE OPERATION            9 (02)    3 à 4        Initialisé à 60
3    NUMEROTAGE            9 (08)    5 à 12        N° d'ordre de l'enre. ( facultatif )
4    FILLER                X (06)    13 à 18        Initialisé à blanc
5    FILLER                X (84)    19 à 102    Initialisé à blanc
6    MONTANT TOTAL            9 (12)    103 à 114    MT =Somme des enreg.  de code 06
7    FILLER                X (46)    115 à 160    Initialisé à blanc

Merci par avance pour les réponses.
Cdt
 

Pièces jointes

  • CFONB-FICHIER.xlsm
    21.3 KB · Affichages: 13

patricktoulon

XLDnaute Barbatruc
bonsoir une chose de ce genre?
VB:
Sub test()
    Nomfichier = InputBox("Veuillez entrer le nom de fichier pour la SVG" & Chr(13) & Chr(10) & "Ajouter N° Bordreau_AAMMJJ ", "Nom fichier ?")
    chemin = ThisWorkbook.Path & "\FICHIERS\TXT_"
    Separateur = ""
    Set rang = ActiveSheet.UsedRange
    x = FreeFile
    Open chemin & Nomfichier & ".txt" For Output As #x

    For i = 1 To rang.Rows.Count
        
        texte = ""
        For c = 1 To rang.Columns.Count
            texte = texte & Left(Trim(rang.Cells(i, c).Text) & String(20, Chr(160)), 20)

        Next
        Print #1, texte & vbCrLf
    Next
Close x
End Sub
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil,

cheribibi33
Ce n'est pas que cela dérange.
C'est juste que l'usage (en tout cas jadis), c'est de signaler par un lien que la question a été "multipostée"
Cela permets de suivre la résolution de la question sur N forums et donc ne pas perdre son temps à résoudre une question peut-être déjà résolue ailleurs.
(Et accessoirement cela permet (le fait d'avoir un lien) de découvrir plusieurs façons de résoudre une question.)

A propos des temps jadis... ;) (Et donc d'où vient cet usage ;))
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Pour être sûr d'implanter des données à la bonne position et pour la bonne longueur dans un String préalablement initialisé à la bonne longueur totale par String$ ou Space$, j'utiliserais plutôt l'instruction Mid$. Elle fonctionne comme la fonction Mid$ mais à l'envers, initialisant une partie du String selon la valeur affectée, de telle sorte qu'on retrouverait celle ci ensuite par la fonnction Mid$ avec les mêmes arguments.
VB:
Sub Test()
   Dim Enreg As String * 80, Pos&, Lon&, Texte$, Champ$
   Enreg = String(80, "."): Pos = 7: Lon = 4: Texte = "Toto"
   Mid$(Enreg, Pos, Lon) = Texte
   Champ = Mid$(Enreg, Pos, Lon)
   MsgBox "Mid$(Enreg, " & Pos & ", " & Lon & ") = """ & Texte & """" & vbLf & "==> Enreg = """ & Enreg & """" _
      & vbLf & "Champ = Mid$(Enreg, " & Pos & ", " & Lon & ")" & vbLf & "==> Champ = """ & Champ & """"
   End Sub
Votre procédure pourrait alors ressembler à ça :
VB:
Sub SaveAsTXT()
   Dim NomFichier As String, Chemin As String, TDon(), L&, C&, Enreg As String, Pos As Long, Lon As Long
   NomFichier = InputBox("Veuillez entrer le nom de fichier pour la SVG" & vbLf & "Ajouter N° Bordreau_AAMMJJ", "Nom fichier ?")
   Chemin = ThisWorkbook.Path & "\FICHIERS\TXT_"
   TDon = Sheets("DEPOT").UsedRange.Value
   Open Chemin & NomFichier & ".txt" For Output As #1
   For L = 1 To UBound(TDon, 1)
      Enreg = Space$(144)
      Pos = 1
      For C = 1 To UBound(TDon, 2)
         Lon = Choose(C, 2, 2, 8, 6, 6, 7, 9, 12, 1, 1, 5, 5, 11, 10, 16, 6, 10, 20, 7) ' Important: Longueurs à rectifier !
         Mid$(Enreg, Pos, Lon) = Trim$(CStr$(TDon(L, C)))
         Pos = Pos + Lon: Next C
      Print #1, Enreg: Next L
   Close #1
   End Sub
 
Dernière édition:
Haut Bas