在Excel VBA中需要最快的搜索方法

时间:2013-11-07 16:13:43

标签: excel vba excel-vba

考虑一个场景,我有2列(列“A”和列“B”)。

A列有大约130000行/字符串 B列有大约10000行/字符串

我想从列“A”中搜索每列“B”列。

正如您所看到的,数据量非常高。我已经尝试过Range.Find()方法。但是要花很多时间才能完成。我正在寻找一种方法/方式,可以让我的周转时间缩短。

*更多关于我的要求的澄清 *

(1)A栏和A栏B包含字符串值,而不是NUMBER。字符串可以非常大

(2)对于“B”栏中的每个单元格,“A”栏中可能会出现多次

(3)我想在带有行号的“A”列中取出所有出现的“B”列

(4)对于“B”栏中的字符串。它可以在列“A”

中的任何单元格的子字符串中找到

下载文件链接 - wikisend.com/download/431054/StackOverFlow_Sample.xlsx *

任何建议?

如果您需要任何额外的细节来解决上述问题,请随意使用!

2 个答案:

答案 0 :(得分:4)

试试这个。

3130000 rows in Col A花了10000 rows in Col B秒。输出在Col C生成。

注意:我采用了worst案例场景,其中Col B中的所有10000值都出现在Col A中

这就是我的数据的外观。

enter image description here

Sub Sample()
    Debug.Print Now

    Dim col As New Collection
    Dim ws As Worksheet
    Dim i As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")

    Application.ScreenUpdating = False

    With ws
        .Range("C1:C10000").Value = "No"

        For i = 1 To 130000
            On Error Resume Next
            col.Add .Range("A" & i).Value, CStr(.Range("A" & i).Value)
            On Error GoTo 0
        Next i

        On Error Resume Next
        For i = 1 To 10000
            col.Add .Range("B" & i).Value, CStr(.Range("B" & i).Value)
            If Err.Number <> 0 Then .Range("C" & i).Value = "Yes"
            Err.Clear
        Next i
    End With

    Application.ScreenUpdating = True

    Debug.Print Now
End Sub

这就是结果

enter image description here

答案 1 :(得分:0)

A列130000个100个字符的字符串,B列10000个30个字符的字符串,27分钟。

列C填充了B列字符串出现的行位置。 列D填充了B列字符串的出现次数。

Public Sub searchcells()
    Dim arrA(1 To 130000) As String, arrB(1 To 10000) As String, t As Date, nLen As Integer
    t = Now
    Me.Range("c:d") = ""

    For i = 1 To 130000
        arrA(i) = Me.Cells(i, 1)
    Next
    For i = 1 To 10000
        arrB(i) = Me.Cells(i, 2)
    Next

    For i = 1 To 130000
        nLen = Len(arrA(i))
        For j = 1 To 10000
            If InStrRev(arrA(i), arrB(j), nLen - Len(arrB(j)) + 1) > 0 Then Me.Cells(j, 4) = Me.Cells(j, 4) + 1: Me.Cells(j, 3) = Me.Cells(j, 3) & i & "; "
        Next
        Me.Cells(1, 5) = i
    Next

    Debug.Print CDbl(Now - t) * 24 * 3600 & " seconds"
End Sub

可以使用以下内容轻松填充单元格,更改每个部分中所需字符串数和字符串长度的i和j限制。

Public Sub fillcells()
    Dim temp As String
    Randomize

    For i = 1 To 13000
        temp = ""
        For j = 1 To 100
            temp = temp & Chr(70 + Int(10 * Rnd()))
        Next
        Me.Cells(i, 1) = temp
    Next
    For i = 1 To 10000
        temp = ""
        For j = 1 To 30
            temp = temp & Chr(70 + Int(10 * Rnd()))
        Next
        Me.Cells(i, 2) = temp
    Next
End Sub

我无法在工作时下载您的电子表格,因此如果它错过了标记,请忽略它。