/ / Como melhorar uma macro VBA que está lendo um arquivo lentamente - excel, vba, file, split

Como melhorar uma macro VBA que está lendo um arquivo lentamente - excel, vba, file, split

Em um projeto recente, preciso ler de um arquivo que contém cerca de 5 mil linhas.

Cada linha tem campos diferentes e eu preciso coletar alguns deles em células específicas no excel. Exemplo de uma linha:

dados1; dados2; dados3; .....; dataNr

N pode ser tão grande quanto 600.

Atualmente estou abrindo o arquivo e percorrendo cada linha, dividindo por ";" e salvando.

O que eu preciso é de um exemplo:

avarSplit = Split(sBuf, ";")

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

Isso tende a ser extremamente lento e eu já tenho,

Application.Calculation = xlCalculationManual

Respostas:

1 para resposta № 1

Eu recomendo pedir ao VBA para abrir o arquivo como umarquivo de texto delimitado (o equivalente a Arquivo-> Abrir, selecione, em seguida, escolhendo "delimitado" e ";" no assistente de arquivo de texto aberto). Se você precisar ver como fazer isso no VBA, grave uma macro e abra-a manualmente. Em seguida, você tem seus valores divididos em uma pasta de trabalho temporária e pode copiá-los em sua planilha como antes.


1 para resposta № 2

5k linhas, mesmo com 600 colunas não devem ser tomadastanto tempo É provável que o hold up esteja gravando os valores nas células. Seria melhor preencher um array de saída bidimensional e gravar os valores na planilha de uma só vez. Aqui está um exemplo.

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