考虑一个场景,我有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 *
任何建议?
如果您需要任何额外的细节来解决上述问题,请随意使用!
答案 0 :(得分:4)
试试这个。
3
和130000 rows in Col A
花了10000 rows in Col B
秒。输出在Col C
生成。
注意:我采用了worst
案例场景,其中Col B中的所有10000
值都出现在Col A中
这就是我的数据的外观。
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
这就是结果
答案 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
我无法在工作时下载您的电子表格,因此如果它错过了标记,请忽略它。