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 :
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.
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
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 :
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 .
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 ...