/ / Come migliorare una macro VBA che sta leggendo un file lentamente - Excel, VBA, file, diviso

Come migliorare una macro VBA che sta leggendo un file lentamente - excel, vba, file, split

In un recente progetto ho bisogno di leggere da un file che contiene circa 5K righe.

Ogni riga ha campi diversi e ho bisogno di raccoglierne alcuni in celle specifiche in Excel. Esempio di una riga:

data1; data2; dati3; .....; dataNr

N può essere grande quanto 600.

Attualmente sto "aprendo il file e scorrendo ciclicamente ogni riga, dividendo per"; "e salvando.

Quello di cui ho bisogno è un esempio:

avarSplit = Split(sBuf, ";")

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

Questo tende ad essere estremamente lento e ho già,

Application.Calculation = xlCalculationManual

risposte:

1 per risposta № 1

Consiglio di chiedere a VBA di aprire il file comefile di testo delimitato (l'equivalente di File-> Apri, selezionare, quindi scegliere "delimitato" e ";" nella procedura guidata di apertura del file di testo). Se devi vedere come farlo in VBA, registra una macro, quindi aprila manualmente. Quindi hai i tuoi valori divisi in una cartella di lavoro temporanea e puoi copiarli nel tuo foglio di lavoro come prima.


1 per risposta № 2

5k righe, anche con 600 colonne, non dovrebbero prenderecosì lungo. È probabile che il hold stia scrivendo i valori nelle celle. Sarebbe meglio riempire un array di output a due dim e scrivere i valori sul foglio di calcolo tutto in una volta. Ecco un esempio.

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