Charger un fichier .txt plus rapidement dans Excel (optimisation de code) [Résolu]

Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
- - Dernière réponse : SERIEUXETCOOL
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
- 22 avril 2012 à 13:48
Bonjour le Forum,

Il y a un an (lors de mes premiers pas sous vba) j'avais un premier morceau de code qui me permettait de charger le contenu d'un fichier texte vers une feuille Excel.

Pour mes premières applications le code était super car le nombre de données à charger était moyen (6 colonnes pour 8 000 lignes en général). Récemment je rencontre une difficulté supplémentaire...J'ai des fichiers Texte "Gourmands" à charger vers Excel (toujours 5 ou 6 colonnes mais 90 000 lignes)

Le code que j'utilise rame donc pour charger tout ça. Récemment j'ai appris que les tableaux dynamiques permettaient un gain de temps pour charger des éléments. Je me pose alors la question si mon code est optimisé ou non ?

Le code serait il plus rapide s'il chargeait les éléments du fichier texte directement vers un tableau, puis ensuite seulement on réinjecterait le contenu vers la feuille Excel ?

Bref qu'elle solution est la plus efficace dans mon cas ?


Voici le code que j'utilise actuellement :

Option Explicit

Public Sub IMPORT()

Dim i As Long 'Variables
Dim Chemin As String, IMPORT As String

i = 1 'Initialise la première ligne
Chemin = "TEST" 'Pour que la boucle ne s'arrête pas tout de suite
Chemin = Application.GetOpenFilename("Texte, *.txt")  'Boite de dialogue

If InStr(Chemin, "") = 0 Then 'Si Chemin n'a pas de \ donc que l'opérateur a fait annuler
GoTo Fin 'Va à l'étiquette Fin:
End If 'Fin du test
Open Chemin For Input As #1 'Ouvre un fichier en lecture
Do While Not EOF(1) 'Tant qu'on est pas à la dernière ligne
Line Input #1, IMPORT 'Lit la ligne et la stocke dans Import
Range("A" & i & ":E" & i).Value = Split(Replace(IMPORT, ",", "."), Chr(9))
'Copie dans la ligne I colonnes A à E la ligne importée où les "," sont remplacées par des "."
'et Split crée un tableau en fonction des tabulations (Chr(9))
'C'est là qu'on pourrait faire appel aux 2 dernières valeurs du tableau, mais ce serait plus lourd
i = i + 1 'On augmente le N° de la ligne
Loop 'On boucle dans le fichier
Close #1 'On ferme le fichier
Fin: 'Etiquette pour quand on sort de la boucle
If i = 1 Then Exit Sub 'Si on a pas importer de fichier, on quitte la Sub
'Le problème, c'est que le Split envoie des nombres au format texte, d'où le traitement complémentaire
Range("I1") = 1 'Met 1 en I1
Range("I1").Copy 'Copie I1
Range("A1:E" & i - 1).PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
SkipBlanks:=False, Transpose:=False
'Collage spécial en multiplication par 1 qui transforme les valeurs textes en nombres
Application.CutCopyMode = False 'Désactive la sélection du copier
Range("I1").Clear 'Ote le 1 en I1

End Sub


Merci à ceux qui pourront m'apporter des éléments de réponse.

Bien cordialement,

André
Afficher la suite 

2/22 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
215
0
Merci
Ah non pardon : tu multiplies chaque valeur par 1
Je verrai cela après avoir voté.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
0
Merci
Salut Ucfoutu, le Forum,

Je viens de tester la petite modif que tu propose

Range("A1:E" & i - 1).Value = Range("A1:E" & i - 1).Value


Effectivement c'est fonctionnel ! Et voila comment faire les choses plus simplement. J'ai lu ce bout de code je ne sais combien de fois, et je n'ai pas noté ce subterfuge !!! Misère lol

Merci. Je vais faire des modifs dans mes applis. Ça sera mieux ainsi. Le collage spécial ne me plaisais pas trop en plus^^

Pour le mec qui crie "A voté !" à tue tête, j'irais voir cet après midi si c'est de même dans ces contrées . Je pense que oui...


Bon du coup je vais ouvrir une nouvelle discussion de suite pour essayer d'améliorer ma procédure de mise en forme. C'est vraiment elle qui pénalise mon code. Elle joue le rôle de goulet d'étranglement, et c'est donc elle qui détermine en partie l’efficacité maximal du code.

Je pense que pour cette discussion on a fait le tour des questions principales. J'en suis grandement satisfait


On se voit sur l'autre post...

Bon dimanche à tous, et votez !!!!!!!!!!!


André
Commenter la réponse de SERIEUXETCOOL