1

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

设置场景:
我目前在工作簿中有 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)

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

ps 很高兴把工作簿寄过来,如果解释需要澄清,请给我一个转发地址。

4

2 回答 2

4

你有两个问题:

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

改写如下:

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
于 2013-01-02T13:17:58.813 回答
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为模块设置,
  • 编译,测试并返回新闻...
于 2013-01-02T13:25:26.647 回答