longueur fixe d'un enregistrement

  • Initiateur de la discussion Benoit
  • Date de début
B

Benoit

Guest
Bonjour à tous,

A partir d'un fichier excel, je souhaite réaliser un fichier au format texte dont La longueur totale d’un enregistrement ( d'une ligne ) est fixée à 68 caractères.

J'ai essayé de formater chaque colonne avec format cellule et le nombre de # correspondante,
puis en format, colonne, largeur, j'ai mis le nombre de caractères correspondant
et,
Mais:

A- les premières lignes ne comportent pas de données en H ( dernière colonne ) et la conversion au format texte .prn ne tient pas compte de mes paramètrages ci-dessus et marque le retour à la ligne dès la fin de la donnée G ( voir pièce jointe xls)

B- la dernière colonne H ne comportant pas toujours les 7 caractères attendus, mon paramètrage ne remplace pas les données inférieures à 7 caractères par des espaces correspondant avant la marque de retour à la ligne...


Les longueurs spécifiées ne sont pas des longueurs maximales, mais des longueurs fixes exactes:

A-date (8)
B-pièce (6)
C-ce (2) "code écriture ex :OD"
D-compte (7)
E-signe (1) " + ou -" montant (11)
F-echeance (6)
G-libelle (20)
H-section analytique (7)
Total: 68 caractères

les champs alphabétiques comme le libellé sont complétés à droite par des espaces

nota:J'utilise la fonction Word, préférences, caractères non imprimables, afficher pour visualiser le nombre de caractères du fichier prn ( voir pièce jointe prn)

J'ai joint un fichier d'exemple xls et sa conversion prn si l'un de vous à envie de me donner un coup de main sur ce coup là....je lui en serais reconnaissant toute ma vie

En vous remerciant d'avance

Très cordialement

Benoit
 

Pièces jointes

  • merci_le_forum.zip
    20.5 KB · Affichages: 42
  • merci_le_forum.zip
    20.5 KB · Affichages: 40
  • merci_le_forum.zip
    20.5 KB · Affichages: 37
O

Olivierd

Guest
re à tous,

Merci beaucoup Yeahou pour ta disponibilité et ta gentillesse.

je vais lire et relire ton travail pour essayer de comprendre et effectuer les essais en fonctions des différents cas de figure et essayer de me dépatouiller de ce bourbier

Très cordialement

Olivierd
 
Y

Yeahou

Guest
Re à tous

pas de problème Olivier, la seule façon de comprendre est de mettre les mains dans le cambouis. Rassure toi, les accés fichiers séquentiels ou binaire sont difficiles à comprendre au début pour tout le monde mais ils ont l'avantage de tout permettre car on maitrise totalement l'écriture ou la lecture du début à la fin.

Si tu rencontres d'autres problèmes, n'hésites pas à poser des questions. Si c'est sur le même sujet ou le même programme, reste dans le même fil.

Cordialement, A+
 
O

Olivierd

Guest
bonjour à tous, bonjour Yeahou,

encore un petit détail à régler sur lequel je bute,
pour éviter une recopie vers le bas de 1000 lignes ( cela génère des tab dans le fichier texte final ),

pourrais-tu SVP m'indiquer comment
recopier A1 vers le bas si D n'est pas vide => " jusqu'au dernier enregistrement de D "

Actuellmeent je passe par:

'Insert en A1 la date du jour SI D n'est pas vide
Sheets("COMPTA").Select
Range("A1").Select
ActiveCell.FormulaR1C1 = "=IF(RC[3]<>"""",NOW(),"""")"
' Selectionne A1 (date) pour un formatage JJMMAAA et recopie vers le bas ( 1000 lignes )
Sheets("COMPTA").Select
'Range("A1").Select
'Selection.NumberFormat = "ddmmyyyy"
'Selection.AutoFill Destination:=Range("A1:A1000"), Type:=xlFillDefault
Range("A1").AutoFill Destination:=Range("A1:A" & Range("A65536").End(xlUp).Row), Type:=xlFillDefault


Très cordialement

Olivierd
 

Pièces jointes

  • integral-doc.zip
    6.6 KB · Affichages: 21
Y

Yeahou

Guest
Bonjour Olivier, le forum

voici ton code, documenté cette fois! les sélections sont inutiles et couteuses en temps machine, il vaut mieux les éviter en général.

A+


Dim Cellule_en_Cours As Range
Sheets("COMPTA").Select 'sélectionne la feuille compta
With ActiveSheet 'definit les .instruction comme se rapportant à la feuille active
For Each Cellule_en_Cours In .Range("D1:D" & .Range("D65536").End(xlUp).Row) 'pour chaque cellule de la plage de D utilisée
If Not (Cellule_en_Cours.FormulaR1C1 = "") Then 'si cellule_en_cours non vide
Cellule_en_Cours.Offset(0, -3).FormulaR1C1 = "=NOW()" 'cellule_en_cours décalée de 3 vers la gauche = aujourd'hui
Cellule_en_Cours.Offset(0, -3).NumberFormat = "ddmmyyyy" 'format sur cellule_en_cours décalée de 3 vers la gauche
End If 'fin si cellule_en_cours non vide
Next Cellule_en_Cours 'boucle sur cellule_en_cours
End With
 
O

Olivierd

Guest
Re-bonjour Yeahou, re-bonjour le Forum,

C'est génial, cela marche parfaitement, comme l'ensemble de tes codes !
Je te remercie autant de fois qu'il y a de cellules dans une feuille excel.

A+

Cordialement

Olivier
 
Y

Yeahou

Guest
Re bonjour

cela fait 16 777 216 mercis, à deux merci par secondes, tu en as pour 8388608 secondes soit 97 jours, deux heures, dix minutes, 8 secondes.
Fais attention avant de prendre des engagements pareils! ;-))

Cordialement, A+
 
O

Olivierd

Guest
le retour: longueur fixe d'un enregistrement

Bonsoir Yeahou, bonsoir le Forum,

J'essaie vainement de modifier une partie du dernier code...
En effet, je dois enlever le format actuel 0000000 en colonne D
pour le remplacer par 7 caractères attendus ( dont des espaces à droites pour les données inférieures à 7 caractères )

J'ai bien essayé plusieurs combinaisons sans succès, aurais-tu encore envie de me dépatouiller ce problème ?

Très cordialement

Olivierd

THE code:

Sub Yeahou()

Dim Compteur As Long 'définit compteur de type long pour gérer les valeurs supérieures à 32768
Dim Val_Ligne As String 'définit Val_Ligne en texte
On Error GoTo Fin 'si erreur rencontrée, va à la ligne Fin:
Open "ECRITURES.txt" For Output As #1 ' création d'un canal fichier en écriture séquentielle, écrase fichier existant sans confirmation
'toutes les références suivantes sont faites à la feuille active

With ActiveSheet
For Compteur = 0 To .Range("A1").End(xlDown).Row - 1 'boucle sur les lignes existantes, compteur=numéro de ligne -1

Val_Ligne = Left(Format(.Range("A1").Offset(Compteur, 0).Value, "ddmmyyyy") & String(6, " ") _
& .Range("C1").Offset(Compteur, 0).Value & Format(.Range("D1").Offset(Compteur, 0).Value, "0000000") _
& Format(.Range("E1").Offset(Compteur, 0).Value, "+00000000.00;-00000000.00;") & String(6, " ") & _
Left(.Range("G1").Offset(Compteur, 0).Value & String(20, " "), 20) & .Range("H1").Offset(Compteur, 0).Value _
& String(39, " "), 68)

Print #1, Val_Ligne ' écriture de la ligne supplémentaire
Next Compteur 'fin de la boucle sur les lignes de données
End With
Fin: 'gestion des erreurs
Close #1 'fermeture du fichier
End Sub
 
Y

Yeahou

Guest
Re: le retour: longueur fixe d'un enregistrement

Bonjour Olivier, le forum

après une semaine sabatique, c'est avec plaisir, d'autant que je repars pour une autre.

Cordialement, A+

Sub Yeahou()

Dim Compteur As Long 'définit compteur de type long pour gérer les valeurs
supérieures à 32768
Dim Val_Ligne As String 'définit Val_Ligne en texte
On Error GoTo Fin 'si erreur rencontrée, va à la ligne Fin:
Open "ECRITURES.txt" For Output As #1 ' création d'un canal fichier en
écriture séquentielle, écrase fichier existant sans confirmation
'toutes les références suivantes sont faites à la feuille active

With ActiveSheet
For Compteur = 0 To .Range("A1").End(xlDown).Row - 1 'boucle sur les lignes
existantes, compteur=numéro de ligne -1

Val_Ligne = Left(Format(.Range("A1").Offset(Compteur, 0).Value, "ddmmyyyy")
& String(6, " ") _
& .Range("C1").Offset(Compteur, 0).Value &
Left(.Range("D1").Offset(Compteur, 0).Value & String(7, " ") , 7) _
& Format(.Range("E1").Offset(Compteur, 0).Value,
"+00000000.00;-00000000.00;") & String(6, " ") & _
Left(.Range("G1").Offset(Compteur, 0).Value & String(20, " "), 20) &
..Range("H1").Offset(Compteur, 0).Value _
& String(39, " "), 68)

Print #1, Val_Ligne ' écriture de la ligne supplémentaire
Next Compteur 'fin de la boucle sur les lignes de données
End With
Fin: 'gestion des erreurs
Close #1 'fermeture du fichier
End Sub
 
O

Olivierd

Guest
Re: le retour: longueur fixe d'un enregistrement

bonjour,

Yeahou,
s'il-te-plait: ne part pas en vacances, tu es indispensable au forum !:))


Merci beaucoup ( plus que 16 777 215 ) pour cette modification

Amicalement

Olivierd
 

FREDWOOPER

XLDnaute Nouveau
Question : longueur d'un enregistrement

Bonjour,

Après avoir lu les éléments de ce forum, j'essai de m'attaquer au formatage d'un fichier de rejet bancaire (enregistrement fixe de 240c)

Voici le format - enregistrement détail :
Code enregistrement : 34 2
N° séquentiel (=000001) 6
Code Opération OC (=88) 2
Date de création du précédent relevé JJMMAA 6
Code Chef de file Destinataire du rejet 5 (zone vide)
Code établissement destinataire 5
Code guichet destinataire 5
N° de compte du donneur d'ordre 11
Nom du client donneur d'ordre 24
N° National Emetter (NNE) 6
Code Chef de file émetteur du rejet 5 (zone vide)
Code établissement émetteur 5
Code guichet émetteur 5
N° de compte du destinataire 11
Nom du destinataire 24
Référence de la banque émettrice du rejet 6 (zone vide)
Libellé abréviatif de domiciliation 24 (zone vide)
Date de validation de l'ordre (JJMM) 4
CPOP 12
N° archivage adhésion chez le façonnier 6 (zone vide)
Nom abrégé du créancier 9 (zone vide)
Libellé 2 31 (zone vide)
Date de règlement de l'opération initiale JJMMAA 6
Réservée 4 (zone vide)
Code Centre Bancaire 2
Code motif du rejet 2
Montant compensé en centimes 12
Total de la zone : 240c

J'ai fait le code suivant en m'inspirant des exemples sur le site, mais cela ne fonctionne pas.
J'ai mon premier décalage au niveau de la zone "Nom du client donneur d'ordre" qui se termine à 72 au lieu de 66.
Je n'en trouve pas la raison, si quelqu'un peut m'aider svp...
J'avoue être plutôt niveau "débutant".

Voici mon code :
Private Sub CmdEnregistrer_Click()
Dim Compteur As Long
Dim Val_Ligne As String
Application.ScreenUpdating = False
On Error GoTo Fin
Open "c:\rejet.prn" For Output As #1
With ActiveSheet

For Compteur = 0 To .Range("A1").End(xlDown).Row - 1
Val_Ligne = Left(Format(.Range("A1").Offset(Compteur, 0).Value) & .Range("B1").Offset(Compteur, 0).Value _
& Format(.Range("C1").Offset(Compteur, 0).Value) & Format(.Range("D1").Offset(Compteur, 0).Value, "ddmmyy") _
& String(5, " ") & Format(.Range("E1").Offset(Compteur, 0).Value) & Format(.Range("F1").Offset(Compteur, 0).Value), 66) ' code banque
Val_Ligne = Val_Ligne & String(5, " ") '+ 5 blancs
Val_Ligne = Val_Ligne & Left(Format(.Range("G1").Offset(Compteur, 0).Value) & Format(.Range("H1").Offset(Compteur, 0).Value), 122) 'banque client
Val_Ligne = Val_Ligne & String(30, " ") '+ 30 blancs
Val_Ligne = Val_Ligne & Left(Format(.Range("I1").Offset(Compteur, 0).Value), 168) ' zone par défaut
Val_Ligne = Val_Ligne & String(46, " ") '+ 46 blancs
Val_Ligne = Val_Ligne & Format(.Range("J1").Offset(Compteur, 0).Value, "ddmmyy") 'date echéance
Val_Ligne = Val_Ligne & String(4, " ") '+ 4 blancs
Val_Ligne = Val_Ligne & Format(.Range("K1").Offset(Compteur, 0).Value) 'zones par défaut
Val_Ligne = Val_Ligne & Format(.Range("L1").Offset(Compteur, 0).Value, "0000000.00;0000000.00;")
Print #1,
End With
Fin:
Close #1
Si quelqu'un pouvait m'aider, cela m'enlèverait une grosse épine du pied.
Merci d'avance,
Cdt,
Wooper.
 

Discussions similaires

Statistiques des forums

Discussions
312 295
Messages
2 086 958
Membres
103 404
dernier inscrit
sultan87