Charger un fichier .txt plus rapidement dans Excel (optimisation de code)

Résolu
SERIEUXETCOOL Messages postés 336 Date d'inscription dimanche 3 avril 2011 Statut Membre Dernière intervention 12 juin 2012 - 21 avril 2012 à 19:36
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é

22 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 avril 2012 à 21:54
Ben ..
Ultra simple : tu lui donnes une extension csv et tu l'importes en tant que tel dans excel, puisqu'il utilise toujours le même séparateur (tabulation) !
Je me suis amusé à le faire avec ton bout de fichier, que j'ai appelé toto.csv.
J'ai utilisé l'enregistreur de macro ===>> regarde ce qu'il a écrit : ===>>
Sub Macro4()
'
' Macro4 Macro
'

'
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;D:\ANDRECOURBE\toto.csv", _
        Destination:=Range("$A$1"))
        .Name = "toto_1"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub


J'ai tout effacé sur la feuille, pour vérifier ===>> j'ai relancé la macro, pour voir ===>> impeccable !
Tu n'iras pas plus vite que ne le peut MLicrosoft (qui, lui-même, doit d'ailleurs passer en coulisse par un tableau dynamique)
Pense seulement à Inhiber puis remettre l'affichage (ScreenUpdating).
Plus vite, nul ne le pourrait.

________________________
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
3
Rejoignez-nous