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乐意发送工作簿,请给我一个转发地址。
你有两个问题:
- 一个小问题是,你使用图表名称来引用你的范围。 而是使用你已经拥有的
MyRange
variables。 - 一个更大的问题是,你把整个列传递给函数,函数将盲目地检查整列,直到最后一百万行(如果它没有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并返回新闻…