Mettre en place un macro qui va me generer un fichier txt

Résolu/Fermé
AHI_250 Messages postés 25 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 18 juin 2014 - 11 juin 2014 à 19:27
 KARROUMAYAGHALI - 26 janv. 2023 à 12:25
Bonjour ALL,

je suis vraiment nouveau dans la programmation, je suis à la recherche d'une procédure, un document ou une explication détaillé s'il vous plait qui va me permettre de mettre en place un macro dans un fichier Excel pour générer un fichier plat (txt) pour éviter la manipulation des données. j'aurai besoin d'un en tête (avec des informations délimitées par des |) dans le fichier et ensuite des lignes avec plusieurs colonnes délimité par des " |" .

merci d'avance.

CDT,
A voir également:

27 réponses

AHI_250 Messages postés 25 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 18 juin 2014
Modifié par pijaku le 18/06/2014 à 07:32
Bonjour Franck,

Depuis hier je cherchais à comprendre la fonction de traitement de la ligne d'entête. j'ai pas vraiment avancé dessus je vous prie de me comprendre c'est mes premiers pas dans la programmation.
Avec ce code
Function Format_Entete(Entete As String) As String
Dim ColB As String, ColBInit As String
Dim ColC As String, ColCInit As String
Dim ColD As String, ColDInit As String

    Entete = Left(Entete, Len(Entete) - 4)

    'traitement colonne B
    ColBInit = Split(Entete, " |")(1)
    ColB = ColBInit
    Do While Len(ColB) < 8
      ColB = "0" & ColB
    Loop
    Entete = Replace(Entete, ColBInit, ColB)

    'traitement colonne C
    ColCInit = Split(Entete, "|")(2) & "00"  'ici on ajoute les deux zéros après
    ColC = ColCInit
    Do While Len(ColC) < 12
        ColC = "0" & ColC
    Loop
    Entete = Replace(Entete, ColCInit, ColC)

  'Placer ici le traitement de la colonne D

    ColDInit = Split(Entete, "|")(3)
    ColD = ColDInit
    Do While Len(ColD) < 14
      'ColB = "0" & ColB
    Loop
    Entete = Replace(Entete, ColDInit, ColD)

    Format_Entete = Entete
End Function


voilà le résultat que j'obtiens

1 |80|450|23451765432876| au lieux de

1 |0000080|000000045000|23451765432876

Alors stp est ce que tu peux expliquer les informations d'une colonne pour que je puisse comprendre mieux? Aussi, j'aimerais s'il te plaît savoir

ColXInit=?

Len(ColX)=?

Merci infiniment.
CDT
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
18 juin 2014 à 07:49
Salut,

Toutes ces fonctions que j'utilise (Len, Left, Replace, Split), et bien d'autres, sont expliquées ICI.

    'traitement colonne B
'ICI on stocke la valeur comprise entre les deux premiers  |, donc la colonne B
'cette variable ColBInit sert à la fonction Replace. En effet, il faut savoir quoi remplacer...
    ColBInit = Split(Entete, " |")(1)
'ColB est la variable dont nous allons modifier la valeur pour obtenir le résultat voulu.
'Au départ ColB est égal à ColBInit
    ColB = ColBInit
'On veut 8 caractères dans la colonne B, donc on boucle tant que notre variable n'a pas 8 caractères
    Do While Len(ColB) < 8
'on ajoute des 0 avant
      ColB = "0" & ColB
    Loop
'on remplace, dans notre entête, la valeur initiale : ColBInit par ColB.
    Entete = Replace(Entete, ColBInit, ColB)


Ce n'est peut être pas la meilleure façon de procéder.
Voyons celle-ci :
Function Format_Entete(Entete As String) As String
Dim ColA As String, ColB As String, ColC As String, ColD As String

    Entete = Left(Entete, Len(Entete) - 4)

    ColA = Split(Entete, " |")(0)
'placer ici le traitement pour la colonne A

    'traitement colonne B
    ColB = Split(Entete, " |")(1)
    Do While Len(ColB) < 8
      ColB = "0" & ColB
    Loop

    'traitement colonne C
    'dans la colonne C, on veut d'abord ajouter deux 0 à la fin, dont acte :
    ColC = Split(Entete, " |")(2) & "00"
    Do While Len(ColC) < 12
        ColC = "0" & ColC
    Loop

  'traitement colonne D
    ColD = Split(Entete, " |")(3)
    Do While Len(ColD) < 14
      ColD = "0" & ColD
    Loop

    'On formate la chaine de caractères de "sortie"
    Format_Entete = ColA & " |" & ColB & " |" & ColC & " |" & ColD
End Function
0
AHI_250 Messages postés 25 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 18 juin 2014
Modifié par pijaku le 18/06/2014 à 13:08
Bonjour FRANCK,

Honnêtement je te remercie pour l'explication je comprends de plus en plus mais je rencontre des problèmes j'ai l'impression la fonction de traitement de la ligne d'entête n'est pas pris en compte parce que avec ce code j'ai un fichier txt comme ceci 1 |30|500|201406181 je ne sais pas si j'ai oublié quelque chose d'important.

Sub Main_CreationFichierTxt()
Dim MesDonnees()
Dim Chemin As String, Ligne As String
Dim num As Integer
Dim i As Long, j As Long, DernLigne As Long
num = FreeFile
With Sheets("Feuil1") ' A ADAPTER le nom de la feuille contenant les données
  'A ADAPTER au cas ou la colonne A ne serait pas la plus "longue"
  DernLigne = .Range("D" & Rows.Count).End(xlUp).Row
  'A ADAPTER ici ne traite que les colonnes de A à E
  MesDonnees = .Range("A1:D" & DernLigne).Value
End With
'A ADAPTER : chemin d'accès complet pour le stockage du fichier txt
Chemin = "C:\Users\MOI-MEME\Desktop"
'A ADAPTER le nom du fichier txt à créer
Open Chemin & "\MonFichierTexte.txt" For Output As #num
'Boucle sur la liste des mots
For i = LBound(MesDonnees, 1) To UBound(MesDonnees, 1)
  For j = LBound(MesDonnees, 2) To UBound(MesDonnees, 2)
    If j = LBound(MesDonnees, 2) Then
      Ligne = MesDonnees(i, j) & "  |"
    Else
      Ligne = Ligne & MesDonnees(i, j) & "|"
    End If
  Next j
  'Ici on appelle la fonction de traitement d'entêtes...
  If i = LBound(MesDonnees, 1) Then Format_Entete Ligne
  'Ecrit dans le fichier texte ligne par ligne
  Print #1, Ligne
  Ligne = ""
Next i
'Fermeture
Close #num
End Sub

Function Format_Entete(Entete As String) As String
Dim ColA As String, ColB As String, ColC As String, ColD As String

    Entete = Left(Entete, Len(Entete) - 4)

    ColA = Split(Entete, "|")(0)
'placer ici le traitement pour la colonne A

    'traitement colonne B
    ColB = Split(Entete, "|")(1)
    Do While Len(ColB) < 8
    ColB = "0" & ColB
    Loop

    'traitement colonne C
    'dans la colonne C, on veut d'abord ajouter deux 0 à la fin, dont acte :
    ColC = Split(Entete, "|")(2) & "00"
    Do While Len(ColC) < 12
        ColC = "0" & ColC
    Loop

  'traitement colonne D
    ColD = Split(Entete, "|")(3)
    Do While Len(ColD) < 14
     ColD = "0" & ColD
    Loop

    'On formate la chaine de caractères de "sortie"
    Format_Entete = ColA & "  |" & ColB & "|" & ColC & "|" & ColD
    End Function


CDT
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
18 juin 2014 à 13:10
Supprime ton fichier texte, enregistre ton classeur excel, ferme tout et relance la macro.
0
AHI_250 Messages postés 25 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 18 juin 2014
18 juin 2014 à 14:48
S'il te plaît peut être qu'il faudra essayer le code voir je viens de faire ce que tu as demandé j'ai le même résultat j'ai même essayer sur le laptop d'un collègue on a le même résultat. je sais pas dans ce code on n'a pas utilisé de variable du genre "ColBInit " est ce que c'est pas ce qui fait que malgré ce code j'ai pas les "0" avant ColB.


'traitement colonne B
ColB = Split(Entete, "|")(1)
Do While Len(ColB) < 8
ColB = "0" & ColB
Loop



CDT,
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
18 juin 2014 à 14:55
Donne moi un exemple concret d'entête avant/après
0
AHI_250 Messages postés 25 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 18 juin 2014
18 juin 2014 à 15:41
je comprends pas bien exemple d'entête avant/après mais bon voilà ce que j'ai avec mon code 1 |30|500|20140618102 or il était sensé me donner

1 |00000030|000000050000|20140618102830

ColA sur 3 positions
ColB sur 8 positions
ColC sur 12 positions
ColD sur 14 positions du genre la date (DDMMYYYYHHMMSS)

CDT,
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
Modifié par pijaku le 18/06/2014 à 15:43
Ce que j'entendais pas là :
avant (sur Excel) j'ai :
col A : 1
Col B : 30
Col C : 500
Col D : 2014618102830

Je veux obtenir, dans mon fichier txt :
1 |00000030|000000050000|20140618102830
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
18 juin 2014 à 15:50
Sub Main_CreationFichierTxt()
Dim MesDonnees()
Dim Chemin As String, Ligne As String
Dim num As Integer
Dim i As Long, j As Long, DernLigne As Long
num = FreeFile
With Sheets("Feuil1") ' A ADAPTER le nom de la feuille contenant les données
  'A ADAPTER au cas ou la colonne A ne serait pas la plus "longue"
  DernLigne = .Range("D" & Rows.Count).End(xlUp).Row
  'A ADAPTER ici ne traite que les colonnes de A à E
  MesDonnees = .Range("A1:D" & DernLigne).Value
End With
'A ADAPTER : chemin d'accès complet pour le stockage du fichier txt
Chemin = "C:\Users\MOI-MEME\Desktop"
'A ADAPTER le nom du fichier txt à créer
Open Chemin & "\MonFichierTexte.txt" For Output As #num
'Boucle sur la liste des mots
For i = LBound(MesDonnees, 1) To UBound(MesDonnees, 1)
  For j = LBound(MesDonnees, 2) To UBound(MesDonnees, 2)
    If j = LBound(MesDonnees, 2) Then
      Ligne = MesDonnees(i, j) & " |"
    Else
      Ligne = Ligne & MesDonnees(i, j) & " |"
    End If
  Next j
  Ligne = Left(Ligne, Len(Ligne) - 2)
  'Ici on appelle la fonction de traitement d'entêtes...
  If i = LBound(MesDonnees, 1) Then Format_Entete Ligne
  'Ecrit dans le fichier texte ligne par ligne
  Print #1, Ligne
  Ligne = ""
Next i
'Fermeture
Close #num
End Sub
Function Format_Entete(Entete As String) As String
Dim ColA As String, ColB As String, ColC As String, ColD As String

    ColA = Split(Entete, " |")(0)
    Do While Len(ColA) < 3
      ColA = " " & ColA
    Loop

    'traitement colonne B
    ColB = Split(Entete, " |")(1)
    Do While Len(ColB) < 8
      ColB = "0" & ColB
    Loop

    'traitement colonne C
    'dans la colonne C, on veut d'abord ajouter deux 0 à la fin, dont acte :
    ColC = Split(Entete, " |")(2) & "00"
    Do While Len(ColC) < 12
      ColC = "0" & ColC
    Loop

  'traitement colonne D
    ColD = Split(Entete, " |")(3)
    Do While Len(ColD) < 14
      ColD = "0" & ColD
    Loop

    'On formate la chaine de caractères de "sortie"
    Format_Entete = ColA & " |" & ColB & " |" & ColC & " |" & ColD
End Function


De plus, j'ai l'impression que selon les fichiers traités ce ne doit pas être la même chose.....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
AHI_250 Messages postés 25 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 18 juin 2014
18 juin 2014 à 15:51
HA ok désolé c'est exactement ça.

CDT,
0
AHI_250 Messages postés 25 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 18 juin 2014
18 juin 2014 à 17:00
S'est bizard mais il ne fonctionne pas j'ai toujours

1 |30|500|201461810283 avec le code
0
AHI_250 Messages postés 25 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 18 juin 2014
18 juin 2014 à 19:48
Bonsoir Pijaku,

Tu peux s'il te plaît testé le code ?il ne marche pas chez moi.

CDT,
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
19 juin 2014 à 07:35
Salut,

Je l'ai testé, il fonctionne exactement comme tu me l'avais demandé.
Colonne A : 3 caractères : exemple : deux espaces et un 1
Colonne B : 8 caractères : des zéros puis l'ancien champs de la colonne B
Colonne C : 12 caractères : des zéros puis l'ancien champs de la colonne C puis 2 zéros
Colonne D : 14 caractères.

Tu as tout pour réussir :
- le code,
- les explications,
- des liens de cours sur la manipulation des chaines de caractères.

Je ne peux donc rien faire de plus pour toi.

Pour moi ce sujet est clos.

Cordialement,
Pijaku
0