/ / Wie man ein VBA-Makro verbessert, das eine Datei langsam liest - Excel, VBA, Datei, Split

So verbessern Sie ein VBA-Makro, das eine Datei langsam liest: Excel, VBA, Datei, Split

Bei einem kürzlich durchgeführten Projekt muss ich aus einer Datei lesen, die ungefähr 5 KB Zeilen enthält.

Jede Zeile hat unterschiedliche Felder und ich muss einige davon in Excel-Zellen zusammenfassen. Beispiel einer Zeile:

Daten1; Daten2; Daten3; .....; DatenNr

N kann so groß wie 600 sein.

Derzeit öffne ich die Datei und durchlaufe jede Zeile, indem ich sie mit ";" aufspalte und speichere.

Was ich brauche, ist ein Beispiel:

avarSplit = Split(sBuf, ";")

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

Dies ist in der Regel sehr langsam und ich habe bereits,

Application.Calculation = xlCalculationManual

Antworten:

1 für die Antwort № 1

Ich würde empfehlen, VBA zu bitten, die Datei als zu öffnenTextdatei mit Trennzeichen (entspricht Datei-> Öffnen, wählen Sie und wählen Sie dann "Trennzeichen" und ";" im Assistenten zum Öffnen von Textdateien). Wenn Sie sehen möchten, wie das in VBA gemacht wird, zeichnen Sie ein Makro auf und öffnen Sie es manuell. Dann haben Sie Ihre geteilten Werte in einer temporären Arbeitsmappe und können sie wie zuvor in Ihr Arbeitsblatt kopieren.


1 für die Antwort № 2

5k Zeilen, auch mit 600 Spalten sollten nicht dauernso lang. Es ist wahrscheinlich, dass der Hold-up die Werte in die Zellen schreibt. Es ist besser, ein zweidimensionales Ausgabearray zu füllen und die Werte auf einmal in die Tabelle zu schreiben. Hier ein Beispiel.

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