VBA计算性能

时间:2013-01-02 13:04:00

标签: performance excel vba excel-vba

我知道它很简单,但我不知道我哪里出错 - 请帮助

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

Sheet1 - 包含将根据比赛的固定日期移动的原始数据

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

查看 - 来自sheet2的数据视图

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

然后点击最后一个按钮,在“视图”表格中创建此数据的视图。 所有视图表都在调用一个名为VnthLookup的已定义模块,用相对值填充每个单元格。

问题
目前每张工作表的VBA和公式工作正常,在创建视图时,如果我通过单击单元格并单击键盘上的返回按钮手动提示计算,则更新并正常工作。但是,当我尝试重新计算整个视图表时,它会超时并需要永远完成计算(最多一个小时+仅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

我的视图表在从B列到J列的每个单元格中都有以下公式 - 取决于我从sheet2请求的值,'X'将是不同的。

=VlookupNth(1,Sheet2!C:AAA,X,2)

理解为什么这么长时间的任何帮助都会受到赞赏。

如果解释需要澄清,请高兴地发送工作簿,请留下转发地址。

2 个答案:

答案 0 :(得分:4)

你有两个问题:

  1. 较小的问题是您使用工作表名称来引用您的范围。而是使用您已有的MyRange变量。
  2. 一个更大的问题是你将整个列传递给函数,函数将盲目地检查整个列,直到最后一百万行(如果它没有及早找到你想要的值)。您需要将功能限制为工作表上的实际数据。
  3. 重写如下:

    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
    

答案 1 :(得分:1)

也许不是回应,而是一些提示&建议开始。

Dim Count, i As Long  'is defining Count as a variant
Dim Count as long, i As Long    'is the proper syntax

然后
Set MySheet = Sheets(MyRange.Parent.Name)似乎毫无意义。由于MySheet是工作表,而您使用的是Set,因此应为Set MySheet = Sheets(MyRange.Parent) 我建议你

  • 尝试这些小修补,
  • 确保为模块设置了Option Explicit
  • 编译,测试并带回新闻......