2017-09-19 52 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

    謝謝丹尼爾,我會試試看。我只希望我的內存能夠處理它。 –

    相關問題