VBA计算性能

我知道它非常简单,但我不知道我要去哪里错 – 请帮助

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

Sheet1 – 由原始数据组成,将根据比赛的固定date而移动

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

查看 – 来自sheet2的数据视图

该过程是 – 用户将手动拖放工作表1中的灯具,然后剪下一个macros启用的button,将需要一个灯具的副本,并添加额外的列与工作表2中的数据

然后点击一个最终button,在“查看”表中创build这个数据的视图。 所有的查看表正在调用一个名为VnthLookup的已定义模块来填充每个单元格的相对值。

问题
目前每个工作表的VBA和公式工作正常,并创build视图时,如果我手动提示计算,通过单击单元格,然后单击键盘上的返回button更新并正常工作。 然而,当我尝试重新计算整个查看表时,它会超时并且需要永久性地完成calc(长达30小时,8个列标题长达一个小时)

vthlookup模块的编码是

 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乐意发送工作簿,请给我一个转发地址。

你有两个问题:

  1. 一个小问题是,你使用图表名称来引用你的范围。 而是使用你已经拥有的MyRangevariables。
  2. 一个更大的问题是,你把整个列传递给函数,函数将盲目地检查整列,直到最后一百万行(如果它没有find你想要的值足够早的值)。 您需要将function限制为表单上的实际数据。

改写如下:

 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 

也许不是回应,但一些提示和build议开始。

 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)
我build议你

  • 尝试那些小的修复,
  • 确保确保为模块设置了Option Explicit
  • 编译,testing并返回新闻…