SERIEUXETCOOL
Messages postés336Date d'inscriptiondimanche 3 avril 2011StatutMembreDernière intervention12 juin 2012
-
21 avril 2012 à 19:36
SERIEUXETCOOL
Messages postés336Date d'inscriptiondimanche 3 avril 2011StatutMembreDernière intervention12 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.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 22 avril 2012 à 09:17
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
SERIEUXETCOOL
Messages postés336Date d'inscriptiondimanche 3 avril 2011StatutMembreDernière intervention12 juin 20121 22 avril 2012 à 13:48
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