Bonjour tout le monde,
Voilà j'ai un problème d'importation d'un gros fichier texte de plus de 65000 lignes dans Excel (2000 sous windows 2000).
Je m'explique : j'ai une liste générée (par SAP) au format texte, jusqu'à maintenant j'importais ça sous Excel avec une QueryTable. Cout de l'opération : une dizaine de secondes pour importer à peu près 50.000 lignes.
Le problème est que cette liste grandit avec le temps... et va bientôt dépasser les fameuses 65.536 lignes max.
N'ayant pas trouvé comment dire à Excel d'importer les données dans plusieurs onglets si ça dépasse, je me suis résolu à écrire une macro d'importation qui lit le fichier texte et 'range' les lignes dans différents onglets d'après un critère.
Je suis dans la première phase... et j'ai déjà un problème de perf.
Je mets 11 secondes à lire un fichier de 52.000 lignes et 150 secondes pour le lire et écrire les lignes dans un classeur.
La fonction native d'Excel mets 12 secondes pour le tout!
Quelqu'un a une idée pour booster tout ça?
Le fichier en question est un fichier texte dont les champs sont de longueur fixe, longueur d'une ligne = 198 caractères, séparateur "|".
Seuls quelques champs (non contigus) sont utiles.
Voici une partie du code utilisé :
Code :
- Public Type Contrat
- Num_Cli As String * 10
- Nom_Cli As String * 40
- Statut As String * 5
- Num_PDL As String * 14
- End Type
- Public Sub ImporterListeContrats(cheminFic as String)
- Dim FSO As Scripting.FileSystemObject, txtStr As Scripting.TextStream
- Dim strFic As String, ctr As Contrat, i As Long, nb As Single
- Dim rgDest As Range
- QuickMode (True) 'paramétrage d'Excel pour aller plus vite
- On Error GoTo gestion_err
- Set FSO = CreateObject("Scripting.FileSystemObject" )
- Set rgDest = ThisWorkbook.Sheets("Test" ).Range("A2" )
- Set txtStr = FSO.OpenTextFile(cheminFic, ForReading)
- For i = 1 To 10 'Les 10 premières lignes d'en-tête
- txtStr.SkipLine
- Next i
- 'Pour mesurer le temps d'exécution
- Dim dDeb As Date
- dDeb = Now
- nb = 0
- Do Until txtStr.AtEndOfStream
- If txtStr.Read(1) = "-" Then
- txtStr.ReadLine 'Lignes de présentation
- Else
- txtStr.Skip (39) 'Informations inutiles
- ctr.Num_Cli = txtStr.Read(11)
- ctr.Nom_Cli = txtStr.Read(41)
- txtStr.Skip (22) 'Informations inutiles
- ctr.Statut = txtStr.Read(5)
- txtStr.Skip (64) 'Informations inutiles
- ctr.Num_PDL = txtStr.Read(14)
- txtStr.ReadLine 'Au suivant!
- nb = nb + 1 'Une ligne de plus!
- 'Ecriture ligne par ligne des informations...
- 'avec rgDest.Value = blabla : il y a peut être mieux
- EcireLigne ctr.Num_Cli, ctr.Nom_Cli, ctr.Statut, ctr.Num_PDL, rgDest
- End If
- Loop
- 'Pour mesurer le temps d'exécution
- MsgBox ("Opération exécutée en " & DateDiff("s", dDeb, Now) & " s." & vbCrLf & _
- nb & " lignes lues" )
- QuickMode (False)
- txtStr.Close
- Set FSO = Nothing
- Set txtStr = Nothing
- End Sub
|
J'ai essayé de remplacer les lignes 30 à 37 par un
Code :
- strBuff = txtStr.readLine
|
Mais je n'ai pas gagné une seule seconde!
Si quelqu'un a déjà été confronté à un problème de ce genre, je suis preneur de tout conseil utile pour optimiser ce code
Merci d'avance.
Message édité par jeanValjean34 le 20-01-2005 à 13:39:26
---------------
"Engagez-vous... Rengagez-vous" qu'y disaient!