仅在最后一个实例上查找下一个方法速度慢

Find Next Method Slow on Last Instance only

所有。

我是运行这个代码:

    Sub ISN_Flyer_Performance()
Dim FlyerSh As Worksheet
Dim QlikSh As Worksheet
Dim SKURng As Range
Dim QlikSKURng As Range
Dim SKU As Range
Dim qlr As Long
Dim QlikSKU As Range
Dim TotalSales As Double
Dim FirstQlikSku As Range

Set FlyerSh = ActiveSheet
i = 2
lr = FlyerSh.Range("A" & Rows.Count).End(xlUp).Row
Set QlikSh = Application.InputBox("Click any cell on the Qlikview Sheet you want to lookup against", "Find Qlikview Sheet", Type:=8).Worksheet

qlr = QlikSh.Range("A" & Rows.Count).End(xlUp).Row
Set QlikSKURng = Range(Cells(2, QlikSh.Rows(1).Find(What:="Item Number", LookAt:=xlWhole).Column), Cells(qlr, QlikSh.Rows(1).Find(What:="Item Number", LookAt:=xlWhole).Column))


Set SKURng = Range(FlyerSh.Cells(i, 1), FlyerSh.Cells(lr, 1))
Set SKU = FlyerSh.Cells(i, 1)
For Each SKU In SKURng
Set QlikSKU = QlikSKURng.Find(What:=SKU.Value, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
If QlikSKU Is Nothing Then
    SKU.Offset(0, 2).Value = 0
    GoTo NextSku
        Else
    TotalSales = QlikSKU.Offset(0, 5).Value
    Set FirstQlikSku = QlikSKU
        Do
        Set QlikSKU = QlikSKURng.FindNext(QlikSKU)
        If QlikSKU.Address = FirstQlikSku.Address Then Exit Do
        TotalSales = TotalSales + QlikSKU.Offset(0, 5).Value
        Loop
    SKU.Offset(0, 2) = TotalSales
        End If
NextSku:
Next SKU


End Sub

它本质上就像一个 XLookup,它在一个工作簿上获取要搜索的内容,然后在一秒钟内找到它,将值发送回第一个工作簿,然后移动到下一个项目。我会使用 XLookup,但不幸的是,我的 sheet 总是有重复项,我需要同时计算两者。

所以我正在使用这个 findnext 循环来遍历一个大约有 16k 行的范围 (QlikSKURange)。 findNext 相当快,不到一秒钟,除了最后一个实例,当它回到开头并再次找到第一个实例时。该实例可能需要十多秒钟。

知道为什么会这样吗?

如果您需要有关代码的更多信息,请告诉我。

我试图在当前迭代后只“查找”,而不是查找下一个,它的速度也一样慢。

VBA 使用查找方法查找

  • 这只是基本思路。有很多缺陷,例如如果您取消输入框,如果您 select 'wrong' 工作表(例如 header 列未找到),如果存在错误值、空白单元格等
Option Explicit

Sub ISN_Flyer_Performance()
    
    ' Flyer
    Dim fws As Worksheet: Set fws = ActiveSheet ' improve!
    Dim fLR As Long: fLR = fws.Range("A" & fws.Rows.Count).End(xlUp).Row
    Dim frg As Range
    Set frg = fws.Range(fws.Cells(2, "A"), fws.Cells(fLR, "A"))
    'Debug.Print fws.Name, fLR, frg.Address
    
    ' Qlikview
    Dim qws As Worksheet: Set qws = Application.InputBox( _
        "Click any cell on the Qlikview Sheet you want to lookup against", _
        "Find Qlikview Sheet", Type:=8).Worksheet
    Dim qLR As Long: qLR = qws.Range("A" & qws.Rows.Count).End(xlUp).Row
    Dim qC As Long
    With qws.Rows(1) ' assuming that "Item Number" is surely in the first row
        qC = .Find("Item Number", .Cells(.Cells.Count), _
            xlFormulas, xlWhole).Column
    End With
    Dim qrg As Range
    Set qrg = qws.Range(qws.Cells(2, qC), qws.Cells(qLR, qC))
    'Debug.Print qws.Name, qLR, qC, frg.Address

    Application.ScreenUpdating = False
    
    Dim fCell As Range
    Dim qCell As Range
    Dim qFirstAddress As String
    Dim TotalSales As Double
    
    ' Loop.
    For Each fCell In frg.Cells
        Set qCell = qrg.Find(fCell.Value, qrg.Cells(qrg.Cells.Count), _
            xlFormulas, xlWhole)
        If qCell Is Nothing Then
            fCell.Offset(0, 2).Value = 0
        Else
            qFirstAddress = qCell.Address
            Do
                TotalSales = TotalSales + qCell.Offset(0, 5).Value
                Set qCell = qrg.FindNext(qCell)
            Loop Until qCell.Address = qFirstAddress
            fCell.Offset(0, 2).Value = TotalSales
            TotalSales = 0
        End If
    Next fCell

    Application.ScreenUpdating = True

    MsgBox "Lookup done.", vbInformation

End Sub

在进行更多挖掘后,有人提出问题是我的一张床单是 table。它在 header 行上有过滤器。我在几秒钟内删除了那些(和连续的条件格式以查找重复项,我的代码 运行。隔离这两个后,结果证明条件格式是罪魁祸首。