/ / Jak ulepszyć makro VBA, które powoli odczytuje plik - excel, vba, file, split

Jak ulepszyć makro VBA, które powoli odczytuje plik - excel, vba, file, split

W ostatnim projekcie muszę odczytać plik zawierający około 5 wierszy.

Każda linia ma różne pola i muszę zebrać niektóre z nich w określone komórki w programie Excel. Przykład jednej linii:

dane1; dane2; dane3; .....; dataNr

N może wynosić nawet 600.

Obecnie otwieram plik i zapętlam każdą linię, dzieląc ją przez „;” i zapisując.

Potrzebuję przykładu:

avarSplit = Split(sBuf, ";")

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

To jest zwykle bardzo powolne i już mam,

Application.Calculation = xlCalculationManual

Odpowiedzi:

1 dla odpowiedzi № 1

Polecam VBA, aby otworzył plik jakorozdzielany plik tekstowy (odpowiednik Plik-> Otwórz, wybierz, a następnie wybierz „rozdzielony” i „;” w kreatorze otwartego pliku tekstowego). Jeśli chcesz zobaczyć, jak to zrobić w VBA, zapisz makro, a następnie otwórz je ręcznie. Następnie masz podzielone wartości w tymczasowym skoroszycie i możesz skopiować je do swojego arkusza, jak poprzednio.


1 dla odpowiedzi nr 2

5k linii, nawet z 600 kolumnami nie powinno się zajmowaćtak długo. Prawdopodobnie wstrzymanie zapisuje wartości w komórkach. Lepiej byłoby wypełnić tablicę wyjściową z dwoma dimmami i zapisać wartości w arkuszu kalkulacyjnym za jednym razem. Oto przykład.

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