如何通过VBA优化从excel中非常大的文本文件中提取数据的性能



我想根据一行中的关键单元格值获取有关值的数据。问题是文件真的很大,我有一个 .txt 文件,大约有 54000 行和 14 列,因此文本文件本身是 20 mb,除此之外,我需要根据 F 列中的值获取 D 列的值。F 列中的值是唯一的。

到目前为止,我已经尝试了直接方法.txt从文件中提取数据并将其复制到工作表中,然后运行循环以获取附加值。

但是,即使等待 15 分钟,代码也无法从.txt文件中提取数据。

  Do While bContinue = True
  outRow = 1
  sInputFile = Application.GetOpenFilename("Text Files (*.txt), *.txt")
  If sInputFile = "False" Then
     bContinue = False
     Reset 'close any opened text file
     Exit Sub
  Else
     outCol = outCol + 2
     'process text file
     fNum = FreeFile
     Open sInputFile For Input As #fNum
     Do While Not EOF(fNum)
        outRow = outRow + 1
        Line Input #fNum, sInputRecord
        Sheets("Sheet1").Cells(outRow, outCol).Value = sInputRecord
     Loop
     Close #fNum
  End If
  Loop
  errHandler:
  Reset 
  End Sub

我预计这需要一些时间,但运行这段代码需要很长时间,这会扼杀使用宏的目的。我只是问是否有人有更好的方法来解决这个问题。

缺少代码的第一部分,但我想你声明了变量。如果没有,这可能会对性能有所帮助。

您也可以尝试在流程开始时关闭计算,然后在最后切换回计算。

Application.Calculation = xlCalculationManual
'...
Application.Calculation = xlCalculationAutomatic

说您只需要文本中的第 4 列和第 6 列,但您将整行放入一个单元格中。

如果您真的只想将行的这两个部分放入工作表中,则可能需要执行以下操作:

 With Sheets("Sheet1")
     Do While Not EOF(fNum)
        outRow = outRow + 1
        Line Input #fNum, sInputRecord
        .Cells(outRow, outCol).Value = Split(sInputRecord,";")(3)
        .Cells(outRow, outCol+1).Value = Split(sInputRecord,";")(5)
     Loop
 End With

将分号更改为分隔符在 txt 文件中的任何字符。

请尝试此操作并反馈。

Sub TryMe()
Dim cN As ADODB.Connection '* Connection String
Dim RS As ADODB.Recordset '* Record Set
Dim sQuery As String '* Query String
On Error GoTo ADO_ERROR
cN = New ADODB.Connection
cN.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:temp;Extended Properties=""text;HDR=Yes;FMT=Delimited(,)"";Persist Security Info=False"
cN.ConnectionTimeout = cN.Open()
RS = New ADODB.Recordset
sQuery = "Select * From VBA.csv ORDER BY ID"
RS.ActiveConnection = cN
RS.Source = sQueryRS.Open()
If RS.EOF <> True Then
    While RS.EOF = False
    Open "c:tempvba_sorted.csv" For Append As 1
    Print #1, RS.Fields(0) & "," & RS.Fields(1); RS.MoveNext()
    Close #1
End If
If Not RS Is Nothing Then RS = Nothing
If Not cN Is Nothing Then cN = Nothing
ADO_ERROR:
If Err <> 0 Then
Debug.Assert (Err = 0)
MsgBox (Err.Description)
Resume Next
End If
End Sub

相关内容

  • 没有找到相关文章

最新更新