如何改进缓慢读取文件的VBA宏

时间:2013-02-27 18:04:00

标签: excel vba file split

在最近的一个项目中,我需要从包含大约5K行的文件中读取。

每一行都有不同的字段,我需要将其中的一些收集到excel中的特定单元格中。一行示例:

  

DATA1; DATA2; DATA3; .....; dataN \ r

N可以大到600。

目前我打开文件并循环遍历每一行,按“;”拆分并保存。

我需要的是一个例子:

avarSplit = Split(sBuf, ";")

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

这往往非常慢,我已经有了,

Application.Calculation = xlCalculationManual

2 个答案:

答案 0 :(得分:1)

我建议让VBA将文件打开为分隔文本文件(相当于File-> Open,select,然后在打开文本文件向导中选择'delimited'和';')。如果您需要在VBA中查看如何执行此操作,请记录宏,然后手动打开它。然后,您将拆分值放在临时工作簿中,并可以像以前一样将它们复制到工作表中。

答案 1 :(得分:1)

5k行,即使有600列,也不应该花那么长时间。保持可能是将值写入单元格。最好填充双暗输出数组,并将值一次性写入电子表格。这是一个例子。

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