Transformer un fichier Excel en fichier txt spécifique

Bonjour

j'ai un fichier excel comprenant un tas d'information sur des titres de musique ,auteur etc....on me demande une liste sous forme txt avec un nombre d'intervalle régulier .voici le fichier txt:

1AP00000220200101080000 10 OT SHAME SHAME CHT000415 NEUUMUS 000000000254 0000000000 000000NU U
1AP00000220200101080000 20 INTFOO FIGHTER
1AP00000220200101080000 30 CD

Sur mon fichier excel j'ai les infos dans des colonnes différentes :

titre :SHAME SHAME

Durée: 4:15

joué 2540 fois

interprète : FOO FIGHTER

Comment pourrais je faire pour passer du excel au txt .

Merci



Essayez ceci :

8musique.xlsm (19.95 Ko)

Le fichier portera le même nom avec l'extension TXT et sera sauvegardé dans le dossier de la macro.

Bonjour,

Optimix que je salue, à fait le boulot

moi, je ne vous propose que l'étape d'avant puisque différente de celle d'OPTIMIX, c'est à dire, la transposition du format de données Excel au format destinée à être traduit en . TXT . le résultat avant enregistrement au format TXT se trouve dans la feuille "Feuille_TXT".

Les zéros non significatifs concernant la durée et le nombre de fois joué sont recalculés en fonction de cette durée et de ce nombre de fois joué.

Sub Conversion_Txt()
    Dim f1 As Worksheet, f2 As Worksheet
    Dim DerLig_f1 As Long, DerLig_f2 As Long, NbZero As Long, NbJoue As Long
    Dim Duree As String, Trouve As String
    Set f1 = Sheets("Feuil1")
    Set f2 = Sheets("Feuille_TXT")
    f2.Cells.ClearContents
    DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row
    DerLig_f2 = 1
    For i = 2 To DerLig_f1
        Duree = Replace(Mid(f1.Cells(i, "B"), 8, Len(f1.Cells(i, "B")) - 7), ":", "")
        NbZero = 6 - Len(Duree)
        f2.Cells(DerLig_f2, "A") = "1AP00000220200101080000 10 OT " & Mid(f1.Cells(i, "A"), 8, Len(f1.Cells(i, "A")) - 7) & " CHT" & Application.WorksheetFunction.Rept("0", NbZero) & Duree & "NEUUMUS"
        Trouve = InStr(1, f1.Cells(DerLig_f1, "C"), " fois", 1)
        NbJoue = Len(f1.Cells(i, "C")) - Trouve - 2
        NbZero = 13 - NbJoue
        f2.Cells(DerLig_f2 + 1, "A") = Application.WorksheetFunction.Rept("0", NbZero) & Mid(f1.Cells(i, "C"), 6, NbJoue) & "000000000 000000NU U "
        f2.Cells(DerLig_f2 + 2, "A") = "1AP00000220200101080000 20 INT" & Right(f1.Cells(i, "D"), Len(f1.Cells(i, "D")) - 13)
        f2.Cells(DerLig_f2 + 3, "A") = "1AP00000220200101080000 30 CD"
        DerLig_f2 = DerLig_f2 + 5
    Next i
    f2.Select
End Sub

Pour la partie enregistrement en txt, je ne là refais pas puisque déjà proposé par OPTIMIX

Cdlt

Bonjour.

Merci beaucoup .quel travail je suis impressionné.

Ca a l'air de fonctionner .

j'essaie de rentrer le reste des données ..

Merci encore

Après vérification c'est un bon début il reste juste quelques détails .en fichier joint le fichier tel qu'il doit être au résultat final .

La mise en page doit être strictement respectée

Attention ne pas prendre en compte les deux premières lignes qui sont des infos différentes que je pourrais rajouter après .

Ne pas prendre en compte la dernière ligne non plus .

en pièce jointe a suivre

un fichier montrant les info dont je dispose avec leur mise en forme .

Le but étant de passer de l'un a l'autre sans trop de difficultés .

Salut,

Je pense que le mieux pour cela est de définir un type de variable

Type Enregistrement
    Champ1 As String * 23
    Champ2 As String * 2
    Champ3 As String * 3
    Champ4 As String * 144
    Champ5 As String * 9
    Champ6 As String * 14
    Champ7 As String * 7
    Champ8 As String * 13
    Champ9 As String * 12
    Champ10 As String * 8
    Champ11 As String * 10
End Type

ensuite tu peux écrire dedans

Dim vEnregistrement As Enregistrement
Dim Counter As Integer, numFich As Long
    ' // On ouvre le fichier
    numFich = FreeFile
    Open "TonChemin\TestPrint.txt" For Output As #numFich
    ' // On charge notre variable
    Counter = 10
    With ActiveSheet
        With vEnregistrement
            .Champ1 = "1AP00000120200101080000"
            .Champ2 = Space(Len(.Champ2))
            .Champ3 = IIf(Counter = 30, 10, Counter + 10)
            .Champ4 = Space(Len(.Champ2))
            .Champ5 = Range("B2")
            '...
            '...
            ' // et on écrit dedans
            Print #numFich, .Champ1, .Champ2, .Champ3
        End With
    End With
    Close #numFich

Par contre la première entrée 1AP00000220200101080000 correspond à quoi le chiffre n'est pas toujours le même

J'ai bien peur que le fichier texte proposé ne possède pas une structure régulière qui permettrait d'utiliser une variable "Type" comme on le fait communément en accès aléatoire. Tout simplement parce qu'entre l'octet 35 et le 74, les plages sont occupées de façon irrégulière (pas de cycle).
Pour illustrer le truc, voici une représentation graphique de ce fichier.

6structure.xlsx (73.23 Ko)

Il est composé de 39 lignes numérotées de 3 à 41 puisque les 2 premières et la dernière ne sont pas prises en compte. Chaque ligne du fichier est représenté par une colonne et dans chaque colonne les espaces vides sont en rouge. Le reste est en jaune. On voit tout de suite le problème de structure.

Salut à tous,

suis pas un expert en écriture de fichier mais j'ai fais un test avec ce code et le résultat me parais bon.

Type Enregistrement
    Champ1 As String * 23
    Champ2 As String * 2
    Champ3 As String * 2
    Champ4 As String * 3
    Champ5 As String * 144
    Champ6 As String * 9
    Champ7 As String * 14
    Champ8 As String * 7
    Champ9 As String * 13
    Champ10 As String * 12
    Champ11 As String * 8
    Champ12 As String * 10
End Type
Sub testPrintFile()
Dim FullPathFile As String

Dim vEnregistrement As Enregistrement
Dim Counter As Integer, numFich As Long
Dim lstRows As ListRows
Dim lstRow As ListRow
    FullPathFile = "C:\Users\Dad\Desktop\" 
    Set lstRows = Range("Tableau1").ListObject.ListRows

    ' // On ouvre le fichier
    numFich = FreeFile
    Open FullPathFile & "TestPrint.txt" For Output As #numFich
    ' // On écrit les deux premières lignes
    Print #numFich, "1AP000000202001012020123100   DIP4HMEDIAMAG"
    Print #numFich, "1AP00000020200101000000  01   2020010120201231000000235959UC           00000000      GAMM VERT                     GAMM VERT"
    ' // On charge notre variable
    Counter = 10
    With ActiveSheet
        For Each lstRow In lstRows
            For Counter = 10 To 30 Step 10
                With vEnregistrement
                    .Champ1 = "1AP00000120200101080000" ' // Là il faut voir quoi mettre dedans
                    .Champ2 = Space(Len(.Champ2))
                    .Champ3 = Counter
                    .Champ4 = Space(Len(.Champ2))
                    Select Case Counter
                        Case 10
                            .Champ5 = lstRow.Range(, 3).Value
                            .Champ6 = "CHT0004153"
                            .Champ7 = Space(Len(.Champ7))
                            .Champ8 = "NEUUMUS"
                            .Champ9 = Space(Len(.Champ9))
                            .Champ10 = "000000000254"
                            .Champ11 = Space(Len(.Champ11))
                            .Champ12 = Space(Len(.Champ12))
                        Case 20
                            .Champ5 = lstRow.Range(, 2).Value
                            .Champ6 = Space(Len(.Champ6))
                            .Champ7 = Space(Len(.Champ7))
                            .Champ8 = Space(Len(.Champ8))
                            .Champ9 = Space(Len(.Champ9))
                            .Champ10 = Space(Len(.Champ10))
                            .Champ11 = Space(Len(.Champ11))
                            .Champ12 = Space(Len(.Champ12))
                        Case 30
                            .Champ5 = "CD"
                            .Champ6 = Space(Len(.Champ6))
                            .Champ7 = Space(Len(.Champ7))
                            .Champ8 = Space(Len(.Champ8))
                            .Champ9 = Space(Len(.Champ9))
                            .Champ10 = Space(Len(.Champ10))
                            .Champ11 = Space(Len(.Champ11))
                            .Champ12 = Space(Len(.Champ12))
                    End Select

                    ' // et on écrit dedans
                    Print #numFich, .Champ1, .Champ2, .Champ3, .Champ4, .Champ5, .Champ6, .Champ7, .Champ8, .Champ9, .Champ10, .Champ11, .Champ12
                End With

            Next Counter
        Next
    End With

    Close #numFich

End Sub

et voilà le résultat

image

Bien entendu il faut peaufiner et savoir comment gérer certaines colonnes notamment "1AP00000120200101080000", "CHT000304" et "000000000394" qui change selon les titres.

Pour les tests j'ai pris son tableau, je l'ai transformé en tableau structuré au nom de Tableau1

Ta démarche semble la bonne. Mais à utiliser une variable type, je mettrais 14 champs et m'en explique à partir du tableau ci-dessous :

1structure.xlsm (89.36 Ko)

J'ai mis :
- en bleu clair les champs constants (1,4,7,10,12 et 14)
- en rouge et jaune les champs variables (4,11 et 13)
- en gris et blanc les cycles calculables (2,3 et 6)
- en vert les espaces purs (5 et 8)

En fait, chaque enregistrement prend 3 lignes (champ n° 6) et fait donc 600 x 3 = 1800 octets. On a ici 13 CD.

Salut Optimix

Aurais-je mal compris:

j'ai un fichier excel comprenant un tas d'information sur des titres de musique ,auteur etc....on me demande une liste sous forme txt avec un nombre d'intervalle régulier .voici le fichier txt:

Quand tu fais Open fichier For Input As #1 tu vas lire le fichier texte, et le transposer dans le tableur, ce n'est pas ce qui est demandé je pense.

D’après ce que j'en ai compris il a des données sous forme de tableau et on lui demande de les sortir dans un fichier texte structuré.

J'aurais pu éviter de mettre certain champs et les remplacer par des espace comme ceci

Print #numFich, .Champ1, Space(2), .Champ3,

Mais je trouve que le changement d'un champ est plus simple en faisant par exemple:

.Champ6 = Format(lstRow.Range(, 2).Value, "Short Date") En lieux et place de .Champ6 = Space(Len(.Champ6))

J'attends son retour notamment sur le format de certaines colonnes qui restent pour moi un mystère.

Je rajoute le fichier pour le test

Bonjour à tous .

D’après ce que j'en ai compris il a des données sous forme de tableau et on lui demande de les sortir dans un fichier texte structuré.

c'est ça oui !

J'attends son retour notamment sur le format de certaines colonnes qui restent pour moi un mystère.

Que veux tu savoir ?

Bonjour à vous deux.
Pour moi le besoin était clair. Pour toi aussi. Le pb, c'est que nous n'avions pas le fichier Excel ; un seul enregistrement de CD sous Excel aurait suffi. Alors, j'ai procédé à l'envers. A partir du fichier texte proposé, essayer d'en retrouver la structure.

Dans le dernier diagramme que j'ai proposé, on voit qu'on peut tout reconstituer sauf le contenu des champs rouge et jaune que seul le tableau Excel peut nous donner.

Sur le 1er enregistrement, par exemple, s'agit de :
Champ 3 : "OT CAT S PYJAMAS"
Champ 11 : 254
Champ 13 : 254

A partir de là on peut recréer les 1800 octets de chaque enregistrement avec tes variables "Type".

Salut Alex,

D'abord as tu regardé et testé ma solution ?

Après pour aller un peux plus loin sur le premier champ "1AP......." sais -tu à quoi cela corresponds certains chiffres de la chaine change de cd en cd. Idem pour les champ "CHT..." ou encore le dernier avec un format sur 12 chiffres qui changes aussi "000000000254"

Bonjour Jean Paul .

Je te remercie pour ton aide .

D'abord as tu regardé et testé ma solution ?

Non je n'ai pas testé car je ne sais même pas ou placer ce programme dans excel.

Je suis novice sur ce programme ....

Après pour aller un peux plus loin sur le premier champ "1AP......." sais -tu à quoi cela corresponds certains chiffres de la chaine change de cd en cd. Idem pour les champ "CHT..." ou encore le dernier avec un format sur 12 chiffres qui changes aussi "000000000254"

les deux première lignes et la dernière ligne du fichier txt ont des codes spécifique qui change a chaque fois.

je les mettrai a la mains a postériori ;

Pour chaque ligne de déclaration de titres(chanson) nous avons ce champ :

1AP00000120200101080000

le chiffre en rose est le variable : il correspond au titre déclaré .Dans l'exemple c'est 1 , ce qui signifie que c'est le titre declaré numero 1 .

il y a 3 lignes avec ce champ par titre:

1AP00000120200101080000 10

1AP00000120200101080000 20

1AP00000120200101080000 30

Pour le deuxième titre ça donnera

1AP00000220200101080000 10

1AP00000220200101080000 20

1AP00000220200101080000 30

les 10, 20et 30 correspondent au numero de ligne des declaration par titre :

10=1 er ligne

20=2 eme ligne

30=3eme ligne

pour le reste de infos on a le champ CHT000327 ;

ça correspond a la durée de la chanson : exemple si j'ai un chanson qui dure 3:27 ca s'écrira CHT000327 ;

Pour le champ 000000000203 ,

ça signifie que le titre a été joué 2030 fois .

#Alex1979
Tu écris : 1AP00000120200101080000
le chiffre en rose est le variable : il correspond au titre déclaré .Dans l'exemple c'est 1 , ce qui signifie que c'est le titre declaré numero 1.

Sur mon diagramme il y a aussi le chiffre juste avant (en vert souligné) qui varie :
1AP00000120200101080000

Oui tu as raison . C’est le chiffre des dixaines .

Parce que sur le fichier excel complet il y a plus de 1000 titres à déclarer . Donc 1AP00000120200101080000

Dans notre cas Les chiffre en vert clair vont varier .

Je pense qu'on aurait gagné pas mal de temps et d'énergie en ayant l'extrait du fichier donnant ces 13 ou 39 enregistrements. Ce n'est pas possible ?

Bonjour Optimix

Je ne comprends pas ta question.....

Il faut savoir que ca n’est pas un besoin ponctuel mais un besoin regulier . J'aurai a faire cette conversion plusieurs fois par an .avec des tableau excell différents. Il me faut donc un programme qui puisse me faire passer du excel au txt facilement ...

Rechercher des sujets similaires à "transformer fichier txt specifique"