2017-09-19 51 views
1

我有下一个问题,我需要将约127,000行的excel文件与大约1'500,000行的文本文件进行比较。文本文件中的每一行都被八个管道分开,在Excel中有8列。我需要在文本行中的第五列与我的Excel文件中的特定列做一个VLookUp。从文本文件导入大数据到Excel

我一直在做的是:

  1. 我坐第一排的我的excel文件,我看它在文本文件中,我只导入线,然后我适合行了在excel中的相应列,最后我做了VLookUp。

Sub test() 
Dim textline As String, rw As Long, lRow As Long, rw1 As Long 
Dim sPath As String, text As Variant 

rw1 = 1 
sPath = "My_path" 

With ActiveWorkbook.Sheets("Sheet1") 
    For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row 
     text = range("A" & rw).Value2 
     Open sPath For Input As #1 
     Do Until EOF(1) 
      Line Input #1, textline 
      If InStr(textline, CStr(text)) Then 
       Sheets(2).Cells(rw1, 1) = textline 
       Sheets(2).range("A" & rw1).TextToColumns Destination:=range("A" & rw1 & ":H" & rw1), DataType:=xlDelimited, _ 
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _ 
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _ 
        :="|", TrailingMinusNumbers:=True 
       rw1 = rw1 + 1 
       Exit Do 
      End If 
     Loop 
     Close #1 
    Next rw 
End With 
End Sub 
  • 我导入所有的文本文件到Excel,然后我适合线在各自的列,并在端我做VLOOKUP。

  • Sub test() 
    Dim textline As String, rw As Long, lRow As Long, rw1 As Long 
    Dim sPath As String, text As Variant, sh As String, c As Integer 
    
    sh = "Sheet" 
    c = 1 
    rw = 1 
    rw1 = 1 
    sPath = "My_path" 
    
    
    With ActiveWorkbook.Sheets("Sheet1") 
         Open sPath For Input As #1 
         Do Until EOF(1) 
          Line Input #1, textline 
          Sheets("Sheet1").range("A" & rw) = textline 
           Exit Do 
          End If 
          rw = rw + 1 
         Loop 
         Close #1 
    End With 
    
    With ActiveWorkbook.Sheets(1) 
        For rw1 = 1 To .Cells(Rows.Count, 1).End(xlUp).Row 
         Sheets("Sheet1").range("A" & rw1).TextToColumns Destination:=range("A" & rw1 & ":H" & rw1), DataType:=xlDelimited, _ 
          TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _ 
          Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _ 
          :="|", TrailingMinusNumbers:=True 
        Next rw1 
    End With 
    End Sub 
    Now 
    

    的问题是,这两种方法花费的时间太长,没有人知道一个更好的解决方案,可以帮助我吗?

    感谢您的建议

    +2

    [性能](https://fastexcel.wordpress.com/2011/10/26/match-vs-find-vs-variant-array-vba-performance-shootout/)与[变体数组] (https://stackoverflow.com/questions/23868137/which-the-fastest-way-to-sum-two-range/23869738#23869738)而不是范围。 – danieltakeshi

    +0

    使用'Split(textline,“|”)'获取一个数组的数组可能会比使用TextToColumns更快。其他改进可能取决于(例如)匹配的字段在工作表和/或文本文件中是唯一的 –

    +0

    好主意Tim,谢谢。我猜想,而不是数组我会使用一个矩阵使用相同的变体数组的概念。最好的问候 –

    回答

    0

    既然你是在正常的行限制,我推荐使用Get & Transform(对于Excel 2016)或Power Query(为Excel 2010和2013年),如果你在使用Excel设置。

    +1

    问题在于我必须使用Excel 2007,公司使用的是什么 –

    +0

    将所有工作表数据首先放入数组中,然后遍历该数组,您将获得体面的性能提升。然后你只能从工作表中读取一次而不是100k +次。但它仍然会很慢; Excel 2007实际上并不是要处理超过100万行数据。 –

    +0

    谢谢丹尼尔,我会试试看。我只希望我的内存能够处理它。 –

    相关问题