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
Y

Yeahou

Guest
Bonjour Benoit, le forum

je t'ai codé un truc qui fait cela avec les données de la feuille active en utilisant une écriture séquentielle.

Cordialement, A+

Private Sub CommandButton1_Click()
Dim Compteur As Integer, Demande_On As Integer
Dim Nom_Fichier As String
Application.ScreenUpdating = False
Do
Nom_Fichier = Application.GetSaveAsFilename(Nom_Fichier, FileFilter:="Fichiers pilotage (*.prn),*.prn", Title:="Enregistrement du fichier PRN")
If Not (Dir$(Nom_Fichier, vbNormal) = "") Then
Demande_On = MsgBox(LCase(Nom_Fichier) & " existe déja" & Chr(10) & "en date du " & DateValue(FileDateTime(Nom_Fichier)) & Chr(10) & "voulez vous l'écraser ?", vbYesNo + vbQuestion)
End If
Loop Until Demande_On < 7
If Nom_Fichier = "Faux" Then MsgBox "Fichier non enregistré !", vbOKOnly + vbInformation: Exit Sub
Open Nom_Fichier For Output As #1
For Compteur = 0 To Range("A1").End(xlDown).Row - 1
Print #1, Format(Range("A1").Offset(Compteur, 0).Value, "ddmmyyyy") & " " & Range("C1").Offset(Compteur, 0).Value & Format(Range("D1").Offset(Compteur, 0).Value, "0000000") & Format(Range("E1").Offset(Compteur, 0).Value, "+0000000.00;-0000000.00;") & " " & Trim(Range("G1").Offset(Compteur, 0).Value & " " & Range("H1").Offset(Compteur, 0).Value)
Next Compteur
Close #1
MsgBox "Fichier prn enregistré sous: " & Nom_Fichier, Title:="Fichier Prn"
End Sub
 

Pièces jointes

  • merci_le_forum.zip
    28.6 KB · Affichages: 42
  • merci_le_forum.zip
    28.6 KB · Affichages: 46
  • merci_le_forum.zip
    28.6 KB · Affichages: 47
O

Olivierd

Guest
Bonjour le Forum, bonjour Yeahou,

Merci beaucoup pour ton intervention;

Le fichier prn généré conserve le même défaut, à savoir qu'il ne conserve pas une longueur fixe d'enregistrement de 68 caractères ( voir copie écran en PJ du fichier généré) quand les dernières données ne sont pas au format attendu de 20 + 7 caractères...

Aussi, Application.GetSaveAsFilename génére une erreur 1004 sous excel Mac

Qaund pensez-vous ?

Amicalement

Benoit
 

Pièces jointes

  • ecran.gif.zip
    7.2 KB · Affichages: 30
Y

Yeahou

Guest
Bonjour Olivier, le forum

Au temps pour moi, j'avais mal compris pour les 68 caractères. J'ai enlevé le getsaveas et spécifié directement le nom de fichier en c:\test.prn

Private Sub CommandButton1_Click()
Dim Compteur As Long
Dim Val_Ligne As String
Application.ScreenUpdating = False
Open "c:\test.prn" For Output As #1
For Compteur = 0 To Range("A1").End(xlDown).Row - 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, "+0000000.00;-0000000.00;") & String(6, " ") & _
Range("G1").Offset(Compteur, 0).Value & String(17, " ") & Range("H1").Offset(Compteur, 0).Value _
& String(39, " "), 68)
Print #1, Val_Ligne
Next Compteur
Close #1
End Sub
 
Y

Yeahou

Guest
Re à tous

La même avec une gestion d'erreurs assurant la fermeture du fichier

Cordialement, A+

Private Sub CommandButton1_Click()
Dim Compteur As Long
Dim Val_Ligne As String
Application.ScreenUpdating = False
On Error Goto Fin
Open "c:\test.prn" For Output As #1
For Compteur = 0 To Range("A1").End(xlDown).Row - 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, "+0000000.00;-0000000.00;") & String(6, " ") & _
Range("G1").Offset(Compteur, 0).Value & String(17, " ") & Range("H1").Offset(Compteur, 0).Value _
& String(39, " "), 68)
Print #1, Val_Ligne
Next Compteur
Fin:
Close #1
End Sub
 
Y

Yeahou

Guest
Re à tous

Olivier, pour le getsaveasfilename
essaye cela

Nom_Fichier = Application.GetSaveAsFilename(InitialFilename:=Nom_Fichier, FileFilter:="Fichiers pilotage (*.prn),*.prn", Title:="Enregistrement du fichier PRN")

sinon vérifie dans l'aide quel est l'argument ou la syntaxe qui ne passe pas sous MAC et supprime le.

Cordialement, A+
 
O

Olivierd

Guest
Merci c'est génial... cela marche sous Windows, je vais essayer de trouver le bogue pour l'utilisation finale sous Mac

par contre, quelqu'un pourrait-il " décoder" le superbe travail de Yehaou ci-dessous en mettant une 'description à chaque action ( afin d'essayer de comprendre la magie de l'action )

Private Sub CommandButton1_Click()
Dim Compteur As Long
Dim Val_Ligne As String
Application.ScreenUpdating = False
On Error Goto Fin
Open "c:\test.prn" For Output As #1
For Compteur = 0 To Range("A1").End(xlDown).Row - 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, "+0000000.00;-0000000.00;") & String(6, " ") & _
Range("G1").Offset(Compteur, 0).Value & String(17, " ") & Range("H1").Offset(Compteur, 0).Value _
& String(39, " "), 68)
Print #1, Val_Ligne
Next Compteur
Fin:
Close #1
End Sub

Amicalement
 
Y

Yeahou

Guest
Re bonjour à tous

Olivier, si tu désires des explications sur mon code, demande le moi. Si j'ai été capable de le coder, je serai capable de l'expliquer.
Le code suivant est expliqué pas à pas en détaillant chaque action. J'ai décomposé l'incrémentation de val_ligne pour l'explication mais on peut le faire en une seule ligne comme le code précédent. Les valeurs récupérées étant pures et sans format, je l'applique si necessaire au moment de l'ajout à Val_ligne.

Cordialement, A+

Private Sub CommandButton1_Click()
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
Application.ScreenUpdating = False 'désactive l'affichage écran pour gagner en rapidité, un peu inutile ici
On Error GoTo Fin 'si erreur rencontrée, va à la ligne Fin:
Open "c:\test.prn" 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 = Format(.Range("A1").Offset(Compteur, 0).Value, "ddmmyyyy") 'on place dans Val_Ligne la valeur de (A1 décalée de compteur) formatée
Val_Ligne = Val_Ligne & String(6, " ") 'on ajoute à Val_Ligne 6 espaces
Val_Ligne = Val_Ligne & .Range("C1").Offset(Compteur, 0).Value 'on ajoute à Val_Ligne la valeur de (C1 décalée de compteur)
Val_Ligne = Val_Ligne & Format(.Range("D1").Offset(Compteur, 0).Value, "0000000") 'on ajoute à Val_Ligne la valeur de (D1 décalée de compteur) formatée
Val_Ligne = Val_Ligne & Format(.Range("E1").Offset(Compteur, 0).Value, "+0000000.00;-0000000.00;") 'on ajoute à Val_Ligne la valeur de (E1 décalée de compteur) formatée
Val_Ligne = Val_Ligne & String(6, " ") 'on ajoute à Val_Ligne 6 espaces
Val_Ligne = Val_Ligne & .Range("G1").Offset(Compteur, 0).Value 'on ajoute à Val_Ligne la valeur de (G1 décalée de compteur)
Val_Ligne = Val_Ligne & String(17, " ") 'on ajoute à Val_Ligne 17 espaces
Val_Ligne = Val_Ligne & .Range("H1").Offset(Compteur, 0).Value 'on ajoute à Val_Ligne la valeur de (H1 décalée de compteur)
Val_Ligne = Val_Ligne & String(39, " ") 'on ajoute à Val_Ligne 39 espaces pour porter le nombre de caractères à plus de 68 quelque soit le cas de figure
Val_Ligne = Left(Val_Ligne, 68) 'on tronque Val_Ligne aux 68 caractères de gauche
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
Auteur: Yeahou (62.160.169.---)
Date:   03-08-04 13:17

Re bonjour à tous
Olivier, si tu désires des explications sur mon code, demande le moi.


**********

merci, j'ai pas osé de le demander directement ( par timidité )

A+
 
O

Olivierd

Guest
re-bonjour le Forum, re-bonjour Yehaou,

Merci pour ce détail expliqué;
en fait dans certain cas ( notamment si le libellé en G fait plus de 3 caractères )
la gestion des deux dernières colonnes G et H se fait différemment ( tout en conservant 68 caractères par ligne )

En fait, en colonne G, le nombre de caractères doit être de 20 quelque soit le nombre de caractères du libellé ( avec des espaces à droite pour les caractères manquants )

et en colonne H, le nombre de caractères doit être de 7 quelque soit le nombre de caractères du libellé( avec des espaces à droite pour les caractères manquants )

Val_Ligne = Val_Ligne & String(17, " ") 'on ajoute à Val_Ligne 17 espaces
Val_Ligne = Val_Ligne & .Range("H1").Offset(Compteur, 0).Value 'on ajoute à
Val_Ligne la valeur de (H1 décalée de compteur)
Val_Ligne = Val_Ligne & String(39, " ") 'on ajoute à Val_Ligne 39 espaces
pour porter le nombre de caractères à plus de 68 quelque soit le cas de figure
Val_Ligne = Left(Val_Ligne, 68) 'on tronque Val_Ligne aux 68 caractères de
gauche


Euh, je suis totalement incapable d'apporter cette correction...
Merci pour ta gentillesse
cordialement

olivierd
 
Y

Yeahou

Guest
Re bonjour

pour G, à la place des deux lignes:
Val_Ligne = Val_Ligne & .Range("G1").Offset(Compteur, 0).Value 'on ajoute à Val_Ligne la valeur de (G1 décalée de compteur)
Val_Ligne = Val_Ligne & String(17, " ") 'on ajoute à Val_Ligne 17 espaces

mets une seule ligne
Val_Ligne = Val_Ligne & left(.Range("G1").Offset(Compteur, 0).Value & string(20," "),20) 'on ajoute à Val_Ligne la valeur de (G1 décalée de compteur)

pour H, étant en dernier, pas de problème, cela fonctionne comme cela

A+
 
Y

Yeahou

Guest
Re à tous

la même avec val_ligne en une seule ligne, peut remplacer les onze lignes d'incrémentation de val_ligne dans le dernier code.

A+

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, "+0000000.00;-0000000.00;") & String(6, " ") & _
left(.Range("G1").Offset(Compteur, 0).Value & string(20," "),20) & .Range("H1").Offset(Compteur, 0).Value _
& String(39, " "), 68)
 
B

Benoit

Guest
oupps, j'ai déconnecté: cela va trop vite pour moi;

j'utilise
Sub Click_DE_YEAHOU()
Dim Compteur As Long
Dim Val_Ligne As String
On Error GoTo Fin
Open "ECRITURES.txt" For Output As #1
For Compteur = 0 To Range("A1").End(xlDown).Row - 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, " ") & _
Range("G1").Offset(Compteur, 0).Value & String(17, " ") & Range("H1").Offset(Compteur, 0).Value _
& String(39, " "), 68)
Print #1, Val_Ligne
Next Compteur

et si je modifie en

Sub Click_DE_YEAHOU_modifie()
Dim Compteur As Long
Dim Val_Ligne As String
On Error GoTo Fin
Open "ECRITURES.txt" For Output As #1
For Compteur = 0 To Range("A1").End(xlDown).Row - 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, "+0000000.00;-0000000.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
Next Compteur
Fin:
Close #1
End Sub

je plante sur des réferences incorrectes ( le ".Range" semble-t-il )

cordialement

Olivierd
 
O

Olivierd

Guest
non, vraiment, j'ai beau chercher, je ne vois pas pourquoi

la modif:

Sub Click_DE_YEAHOU_modifie()
Dim Compteur As Long
Dim Val_Ligne As String
On Error GoTo Fin
Open "ECRITURES.txt" For Output As #1
For Compteur = 0 To Range("A1").End(xlDown).Row - 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, "+0000000.00;-0000000.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
Next Compteur
Fin:
Close #1
End Sub

ne fonctionne pas...

cordialement

Olivierd
 
Y

Yeahou

Guest
Re à tous

c'est normal, je t'avais dit que cela pouvait remplacer l'instruction dans le dernier code pas ceux d'avant auquels il manquait le with activesheet. de plus, si tu ne mets pas le chemin avec le nom d'accés le fichier sera créé dans le répertoire actif au moment

A+

Private Sub CommandButton1_Click()
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
Application.ScreenUpdating = False 'désactive l'affichage écran pour gagner en rapidité, un peu inutile ici
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, "+0000000.00;-0000000.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
 

Discussions similaires

Statistiques des forums

Discussions
312 294
Messages
2 086 895
Membres
103 404
dernier inscrit
sultan87