/ / Comment améliorer une macro VBA lisant un fichier lentement - excel, vba, file, split

Comment améliorer une macro VBA lisant un fichier lentement - excel, vba, fichier, fractionner

Sur un projet récent, je dois lire un fichier contenant environ 5 000 lignes.

Chaque ligne a des champs différents et je dois en rassembler certains dans des cellules spécifiques dans Excel. Exemple d'une ligne:

data1; data2; data3; .....; dataNr

N peut être aussi grand que 600.

Actuellement, je suis en train d'ouvrir le fichier et de parcourir chaque ligne en boucle, en scindant par ";" et en enregistrant.

Ce dont j'ai besoin, c'est d'un exemple:

avarSplit = Split(sBuf, ";")

Range("C" & i).Value = CDbl(avarSplit(meter))

Cela a tendance à être extrêmement lent et j'ai déjà,

Application.Calculation = xlCalculationManual

Réponses:

1 pour la réponse № 1

Je vous recommande de demander à VBA d’ouvrir le fichier en tant quefichier texte délimité (l'équivalent de Fichier-> Ouvrir, sélectionnez, puis choisissez "délimité" et ";" dans l'assistant de fichier texte ouvert). Si vous avez besoin de savoir comment faire cela dans VBA, enregistrez une macro, puis ouvrez-la manuellement. Ensuite, vous avez vos valeurs fractionnées dans un classeur temporaire et vous pouvez les copier dans votre feuille de calcul comme auparavant.


1 pour la réponse № 2

5k lignes, même avec 600 colonnes ne devraient pas prendrec'est long. Il est probable que le blocage consiste à écrire les valeurs dans les cellules. Il serait préférable de remplir un tableau de sortie à deux dimanches et d’écrire les valeurs dans la feuille de calcul en une seule fois. Voici un exemple.

Sub ReadTextFile()

Dim sFile As String
Dim lFile As Long
Dim vaLines As Variant, vaSplit As Variant
Dim aOutput() As String
Dim i As Long
Dim sInput As String

sFile = MyDocs & "Book4.csv"
lFile = FreeFile

"Read in data
Open sFile For Input As lFile
sInput = Input$(LOF(lFile), lFile)
"Split on new line
vaLines = Split(sInput, vbNewLine)

"Set up output array - split is zero based
"but you want 1-based to write to cells
ReDim aOutput(1 To UBound(vaLines, 1) + 1, 1 To 1)

"loop through lines
For i = LBound(vaLines) To UBound(vaLines)
If Len(vaLines(i)) > 0 Then
"split on delimiter
vaSplit = Split(vaLines(i), ";")
"store want you want in the output array
aOutput(i + 1, 1) = vaSplit(15)
End If
Next i

"write the output array to a range
Sheet1.Range("A2").Resize(UBound(aOutput, 1), UBound(aOutput, 2)).Value = aOutput

End Sub