【发布时间】:2019-10-06 22:35:20
【问题描述】:
此功能的当前性能很慢,目前我正在使用 sheet1 上 500 多个项目代码的列表。该函数在 sheet2 上的 200 000 + 项范围内搜索以查找所有匹配项,包括部分匹配项。这意味着我们在查找条件之前和之后包含通配符以查找所有匹配项。
目前需要 15 分钟以上才能完成。有没有更好的方法来做到这一点?要在 5 分钟内完成吗?
Function ConcatIf(ByVal compareRange As Range, ByVal xCriteria As Variant, _
Optional ByVal stringsRange As Range, Optional Delimiter As String) As String
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Dim i As Long, j As Long, criteriaMet As Boolean
Set compareRange = Application.Intersect(compareRange, _
compareRange.Parent.UsedRange)
If compareRange Is Nothing Then Exit Function
If stringsRange Is Nothing Then Set stringsRange = compareRange
Set stringsRange = compareRange.Offset(stringsRange.Row - _
compareRange.Row, stringsRange.Column - compareRange.Column)
For i = 1 To compareRange.Rows.Count
For j = 1 To compareRange.Columns.Count
If (Application.CountIf(compareRange.Cells(i, j), _
xCriteria)= 1) Then
ConcatIf = ConcatIf & Delimiter & _
CStr(stringsRange.Cells(i, j))
End If
Next j
Next i
ConcatIf = Mid(ConcatIf, Len(Delimiter) + 1)
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
End Function
例子:
+500 项目代码
Sheet1:
BCD
CDF
XLMH
XPT
ZPY
200 000 + 完整项目代码
Sheet2:
FDBCDGH
HSGDBCDSU
GFD-CDFGDTR
SBGCDFHUD
GKJYCDFFDS
DDFGFDXLMHGFD
SDGXLMHSDFS
SDGVSDXLMHFAMN
DDDSXPTDFGFD
JUYXPTFADS
DDDFFZPYDGDFDF
结果应该是:
表 1:
COLUMN A - COLUMN B
BCD - FDBCDGH,HSGDBCDSU
CDF - GFD-CDFGDTR,SBGCDFHUD,GKJYCDFFDS
XLMH - DDFGFDXLMHGFD,SDGXLMHSDFS,SDGVSDXLMHFAMN
XPT - DDDSXPTDFGFD,JUYXPTFADS
ZPY - DDDFFZPYDGDFDF
【问题讨论】:
-
您是否尝试过将您的
range.values存储为一个数组,然后使用InStr(),遍历您的数组(全部在VBA 中,这将使事情变得更快),并记录您的字符串ConcatIf以追加在 VBA 的东西之后? -
也考虑询问代码审查?
-
我会将 sheet1 放入 1 个数组中,将 sheet2 中的值放入字典中,然后在此处使用 answers 来检查部分匹配项。
标签: excel vba performance function excel-formula