Bonjour,
Je dois régulièrement transformer des feuilles Excel en fichier .TXT avec comme caractéristique de conserver le format des nombres choisi dans Excel. Si par exemple la cellule est une date, je veux que le nombre soit écrit en format DATE dans le .TXT.
Voici le script (simplifié) que j'utilise :
Cependant, mes fichiers sont parfois très volumineux (plusieurs 10aines de milliers de lignes, plusieurs feuilles Excel, ...) et la macro prend donc un temps non négligeable pour s'effectuer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 Sub ecrireFichierTxt() 'macro qui transforme une feuille Excel en fichier .txt 'avec conservation du format choisi par l'utilisateur dans Excel Dim Time As Single Time = Timer strFichier = "test.txt" 'Efface le fichier s'il existe car parfois plantage On Error Resume Next Kill strFichier On Error GoTo 0 Open strFichier For Output As #1 'Ecriture ligne par ligne For i = 1 To 5000 Texte = "" For j = 1 To 10 'recuperation de la valeur et du format Texte = Texte & Right$(Space$(10) & Format(Cells(i, j).Value, Cells(i, j).NumberFormat), 10) Next j Print #1, RTrim(Texte) Next i 'fermeture du fichier .txt Close #1 Debug.Print "tps non opti : " & Timer - Time 'temps d'exécution = 1.8s End Sub
Après renseignement sur internet, j'ai lu que l'accès à la feuille Excel était très gourmand en temps, et qu'il valait mieux n'utiliser qu'une commande pour aller chercher toutes les valeurs dans le classeur Excel. J'ai donc remplacé la partie centrale de mon code par :
Ca fonctionne très bien (temps divisé par 2 voir plus). Cependant le format n'est pas recopié... et ça ne me convient pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 valeursExcel = Range(Cells(1, 1), Cells(5000, 10)) 'Ecriture ligne par ligne For i = 1 To 5000 Texte = "" For j = 1 To 10 ' cette technique ne fonctionne pas avec NumberFormat... ' Texte = Texte & Right$(Space$(10) & Format(valeursExcel(i, j).Value, valeursExcel(i, j).NumberFormat), 10) Texte = Texte & Right$(Space$(10) & valeursExcel(i, j), 10) Next j Print #1, RTrim(Texte) Next i 'temps d'exécution = 0.7s
J'ai donc opté pour une 3eme solution, qui est un compromis des 2 précédentes, mais naturellement la vitesse d'exécution est peu satisfaisante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 valeursExcel = Range(Cells(1, 1), Cells(5000, 10)) 'Ecriture ligne par ligne For i = 1 To 5000 Texte = "" For j = 1 To 10 ' Texte = Texte & Right$(Space$(10) & Format(valeursExcel(i, j).Value, valeursExcel(i, j).NumberFormat), 10) Texte = Texte & Right$(Space$(10) & Format(valeursExcel(i, j), Cells(i, j).NumberFormat), 10) Next j Print #1, RTrim(Texte) Next i 'temps d'exécution = 1.5s
Je joins un fichier exemple avec les 3 variantes de ma macro.
Question :
La 2eme méthode expliquée ci-dessus est beaucoup plus rapide, mais ne permet pas de prendre en compte le format.
Comment puis-je faire pour recopier le format efficacement ?
Existe-t-il une méthode analogue à celle utilisé pour récupérer toutes les valeurs d'un coup mais avec le format ?
Merci d'avance,
Corentin
Partager