【发布时间】:2020-05-21 12:53:36
【问题描述】:
我有一个代码可以对电子表格中的数千行进行排序,当它在两个不同的列中找到具有特定匹配项的行时,它会在第三列中返回一个值。然而,这个 UDF 被使用了数千次,每次运行数千个循环,它非常慢。有没有办法加快或提高效率?
Dim SearchSheet As Worksheet
Dim PN As Integer
Dim MdlCol As Integer
Dim Mdl As String
Dim Result As Integer
Dim FinalRow As Integer
Dim i As Integer
Application.Volatile True
Select Case True
Case Number < WorksheetFunction.CountA(Sheet2.Range("A:A")) And Model = "1A"
Set SearchSheet = Sheet2
PN = 3
MdlCol = 5
Mdl = "1A"
Result = 30
Case Number < WorksheetFunction.CountA(Sheet2.Range("A:A")) And Model = "1B"
Set SearchSheet = Sheet2
PN = 3
MdlCol = 6
Mdl = "1B"
Result = 30
Case Number < WorksheetFunction.CountA(Sheet2.Range("A:A")) And Model = "1C"
Set SearchSheet = Sheet2
PN = 3
MdlCol = 7
Mdl = "1C"
Result = 30
Case Number >= WorksheetFunction.CountA(Sheet2.Range("A:A")) And Model = "1A"
Set SearchSheet = Sheet3
PN = 2
MdlCol = 18
Mdl = "-1A"
Result = 80
Case Number >= WorksheetFunction.CountA(Sheet2.Range("A:A")) And Model = "1B"
Set SearchSheet = Sheet3
PN = 2
MdlCol = 19
Mdl = "-1B"
Result = 80
Case Number >= WorksheetFunction.CountA(Sheet2.Range("A:A")) And Model = "1C"
Set SearchSheet = Sheet3
PN = 2
MdlCol = 20
Mdl = "-1C"
Result = 80
End Select
FinalRow = WorksheetFunction.CountA(SearchSheet.Range("A:A")) + 10
For i = 2 To FinalRow
If SearchSheet.Cells(i, PN) = PartNumber And SearchSheet.Cells(i, MdlCol) = Mdl Then
If SearchSheet.Cells(i, Result).Value = "X" Then
CalibrationRequired = "Y"
Else
CalibrationRequired = SearchSheet.Cells(i, Result).Value
End If
Exit For
End If
Next i
End Function ```
【问题讨论】:
-
If SearchSheet.Cells(i, PN) = PartNumber And SearchSheet.Cells(i, MdlCol) = Mdl Then... 你可以在这里使用WorksheetFunction.CountIfs。你不需要循环。 -
我不确定我是否遵循。这会给我匹配标准的出现次数,但是我需要返回该行和特定列(结果)的值。
-
然后你会做一个lookup on two columns 来实现与
CalibrationRequired = SearchSheet.Cells(i, Result).Value相同的事情。 -
我从索引匹配开始以引用两个标准,但更糟糕的是,这就是我转向 UDF 的原因。它的计算速度比所有索引匹配数组都快,但仍然很慢。
-
那么我建议只使用
Variant数组而不是逐个单元格地循环。
标签: excel vba for-loop user-defined-functions