performance - VBA 计算性能

标签 performance vba excel

我知道这很简单,但我不知道我哪里出错了——请帮忙

场景设置:
我目前在工作簿中有 3 个工作表

表1 – 包含将根据比赛的固定日期移动的原始数据

表2 - 由从表 1 复制的原始数据组成

查看 – 来自 sheet2 的数据 View

该过程是-用户将手动将夹具拖放到 sheet1 中,然后剪辑启用宏的按钮,该按钮将获取夹具的副本并在 sheet2 中添加带有数据的其他列

然后将单击最后一个按钮以在“ View ”表中创建此数据的 View 。
View 表所做的只是调用一个名为 VnthLookup 的已定义模块。用相对值填充每个单元格。

问题
目前,每个工作表的 VBA 和公式工作正常,并且在创建 View 时,如果我通过单击单元格并单击键盘上的返回按钮手动提示计算,它会更新并且工作正常。但是,当我尝试重新计算整个 View 表时,它会超时并且需要永远完成计算(最多一个小时 + 仅 30 行,8 个列标题)

vnthlookup 模块的编码是

Public Function VlookupNth(MyVal As Variant, MyRange As Range, Optional ColRef As Long, Optional Nth As Long = 1)
    Dim Count, i As Long
    Dim MySheet As Worksheet

    Count = 0
    Set MySheet = Sheets(MyRange.Parent.Name)

    If ColRef = 0 Then ColRef = MyRange.Columns.Count

    For i = MyRange.Row To MyRange.Row + MyRange.Rows.Count - 1
        If MySheet.Cells(i, MyRange.Column).Value = MyVal Then
            Count = Count + 1
            If Count = Nth Then
                VlookupNth = MySheet.Cells(i, MyRange.Column + ColRef - 1).Value
                Exit Function
            End If
        End If
    Next i

    VlookupNth = ""
End Function

我的 View 表在从 B 列到 J 列的每个单元格中都有以下公式 - 根据我从 sheet2 请求返回的值,“X”会有所不同。
=VlookupNth(1,Sheet2!C:AAA,X,2)

任何有助于理解为什么需要这么长时间的帮助将不胜感激。

p.s 很乐意发送工作簿,如果解释需要澄清,请给我一个转发地址。

最佳答案

你有两个问题:

  • 一个较小的问题是您使用工作表名称来引用您的范围。而是使用 MyRange你已经拥有的变量。
  • 一个更大的问题是你将整列传递给函数,函数会盲目地检查整列,直到最后一百万行(以防它没有足够早地找到你想要的值)。您需要将功能限制为工作表上存在的实际数据。

  • 改写如下:
    Public Function VlookupNth(ByVal MyVal As Variant, ByVal MyRange As Range, Optional ByVal ColRef As Long = 0, Optional ByVal Nth As Long = 1) As Variant
        Dim Count As Long, i As Long
    
        Count = 0
        If ColRef = 0 Then ColRef = MyRange.Columns.Count
    
        'Do not consider uninitialized rows
        Set MyRange = Application.Intersect(MyRange, MyRange.Parent.UsedRange)
    
        If Not MyRange Is Nothing Then
            For i = 1 To MyRange.Rows.Count
                If MyRange.Cells(i, 1).Value = MyVal Then
                    Count = Count + 1
                    If Count = Nth Then
                        VlookupNth = MyRange.Cells(i, ColRef).Value
                        Exit Function
                    End If
                End If
            Next i
        End If
    
        VlookupNth = ""
    End Function
    

    关于performance - VBA 计算性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14122580/

    相关文章:

    performance - Haskell 上的 ICFPC 2006 任务太慢

    c# - 内部报告所需的复杂小计

    excel - ByRef 参数与 Excel 中的 VBA 不匹配

    excel - CurrentRegion.SpecialCells(xlCellTypeVisible) 太慢 - 提高性能的提示?

    vba - 从 Excel VBA 发送电子邮件 - 名称无法识别

    vba - Excel VBA将多个匹配项导入同一行的不同列

    java - 一旦工作表受到保护,启用 xls 中的下拉菜单

    c# - 仅当记录不存在时才通过存储过程从 TVP 列表中插入项目 - 性能低下

    performance - 为什么我不能通过使用 get_unchecked() 来提高性能?

    javascript - 加载时间值得执行时间吗?