VBA Exporter fichier TXT - Délimité & Position

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 VBA utilisé :

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

Constitution du fichier TXT

Ligne 1 reprend ces données : Enregistrement émetteur

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

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

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

97cfonb-fichier.xlsm (21.35 Ko)

Bonjour,

.../...

je dois respecter des tailles et des positions de champs. C'est la que je bloque.

.../...

Mais plus précisément ?

Vous pourriez donner les tailles et positions souhaités ?

Sinon essayez de jouer avec Separateur = vbTab , vbTab étant une tabulation.

A+

Bonjour,

Merci pour votre suivi

les tailles et positions sont précisées dans mon message voici un textrait :

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

Colonne 1 Taille 02 Position 1à2

Colonne 2 Taille 02 Position 3à4

Colonne 3 Taille 08 Position 5à12

Cdt

Patrick

Oui, mais...

quelles colonnes du classeur correspondent aux colonnes du fichier ?

Bonjour,

Dans mon classeur joint :

colonne A est = TYPE D'ENREGISTREMENT (Taille 02 Position 1à2)

colonne B est = CODE OPERATION (Taille 02 Position 3à4)

colonne C est = NUMEROTAGE (Taille 08 Position 5à12)

Cdt

Bonjour,

cela me parait loin d'être suffisant pour remplir une ligne 1, n lignes 2 et une ligne x.Tout au plus de quoi remplir les trois premiers champs de ces lignes. Mais je doute que la banque puisse en faire quoi que ce soit.

en supposant que les colonnes sont dans le même ordre, un essai

Sub SaveAsTXT()
Dim StrTemp As String
Dim Nomfichier As String
Dim chemin As String
Dim D,  x As Long, Espace, Plage As Range, Cel As Range
    'ActiveWorkbook.Save
    'Sheets("DEPOT").Select

'Tableau dimension
D = Array(2, 2, 8, 6, 2, 10, 24, 24, 1, 2, 5, 5, 11, 12, 4, 6, 6, 20, 10)

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_"

Set Plage = Worksheets("DEPOT").UsedRange.Rows
Open chemin & Nomfichier & ".txt" For Output As #1

'  ligne émetteur
For Each Cel In Plage(1).Cells
     ' à réaliser
Next

'lignes destinataire
For j = 2 To Plage.Count - 1
    StrTemp = ""
    For Each Cel In Plage(j).Cells
        Espace = IIf(D(x) - Len(CStr(Cel)) < 0, D(x), D(x) - Len(CStr(Cel)))
        StrTemp = StrTemp & CStr(Cel) & Space(Espace)
    Next
    Print #1, StrTemp '= " "
Next

'ligne finale
For Each Cel In Plage(Plage.Count).Cells
   'Print #1, ' à adapter
Next

Close #1
End Sub

Attention dans le classeur, des lignes et colonnes vides sont prises en compte par UsedRange. il y a lieu de les supprimer avant traitement, sous peine de plantage...

Il ne faut pas utiliser des mots réservés VBA comme nom de variable, par ex:

Set Range = ActiveSheet.UsedRange

il vaut mieux déclarer les variables avec le type idoine:

Dim Range As Object, Line As Object, Cell As Object

plutôt

Dim  Plage As Range, Cel As Range

Bonjour,

Merci pour le code.

J'ai testé votre VBA, la ligne 1 n'est pas prise en compte

Attention dans le classeur, des lignes et colonnes vides sont prises en compte par UsedRange. il y a lieu de les supprimer avant traitement, sous peine de plantage..

Les colonnes vides doivent être prises en compte il faut respecter l'ordre déterminé dans les champs indiqué au début de mon message.

Cdt

Patrick

La première et la dernière ligne ne sont pas traitées. Il reste à le faire en adaptant le modèle des lignes destinataire.

Quand je parle des lignes et colonnes vides, je parle des lignes et colonnes hors données utiles:

en démarrant sur le classeur , la plage déterminée par UsedRange était A1:V38 alors qu'elle aurait dû être A1:S6

Le tableau D donne la dimension à attribuer pour chaque colonne de la feuille dans le fichier sortie. donc 19 éléments. Si on prends 1 ou plusieurs colonnes en trop dans la plage, pour la 20ème colonne on ira chercher le 20ème élément du tableau; et comme il n'en possède que 19 => plantage

Les 3 types de lignes sont traités séparément puisque les dimensions des champs à inscrire dans le fichier sortie sont différents.

Pour la première ligne on part sur Plage(1) (soit la première ligne de la plage puisque la plage =Worksheets("DEPOT").UsedRange.Rows

Pour la dernière on utilise Plage(Plage.Count) et pour les lignes destinataires on boucle entre 2 et Plage.count -1

S'il y a des lignes inutiles en trop de sélectionnées dans la plages:

la vraie dernière ligne sera traitée comme une ligne destinataire et la dernière ligne de la plage ne donnera que des champs vides dans le fichier sortie.

Donc sélectionner ces lignes et colonnes super flux et les supprimer, ou bien, utiliser une autre méthode pour sélectionner la plage de travail

Mais a priori ça ne pose pas de problème chez vous ...

Rechercher des sujets similaires à "vba exporter fichier txt delimite position"