VBA代码运行太慢,求优化代码提升速度,谢谢!

说明:
在A2输入一个原始商品编号, B列为匹配商品编号 ,C列的 支持度是 A2 与B列各编码 匹配后他们相应的 支持度(数据来源于 支持度表格A列与4行交叉的数据)
D列的 置信度是 A2 与B列各编码 匹配后他们相应的 置信度(数据来源于 置信度表格A列与4行交叉的数据)

然后对B:D进行排序(按C列倒序)
求优化代码,提升速度,谢谢!

Sub 匹配支持度数据()
On Error GoTo esc
Application.ScreenUpdating = False
Dim i As Integer
Dim p As Integer
Dim b As Integer
For i = 1 To 400
If Sheets("支持度").Cells(4, i) Like Sheets("查询表过度表").Cells(2, 1) Then
For x = 2 To 400

For p = 1 To 400
If Sheets("支持度").Cells(p, 1) Like Sheets("查询表过度表").Cells(x, 2) Then
Sheets("查询表过度表").Cells(x, 3) = Sheets("支持度").Cells(p, i)
End If
Next
Next
End If
Next
Call 匹配置信度
esc:
Application.ScreenUpdating = True
End Sub

Sub 匹配置信度()
On Error GoTo esc
Application.ScreenUpdating = False
Dim i As Integer
Dim p As Integer
Dim b As Integer
For i = 1 To 400
If Sheets("置信度").Cells(4, i) Like Sheets("查询表过度表").Cells(2, 1) Then
For x = 2 To 400

For p = 1 To 400
If Sheets("置信度").Cells(p, 1) Like Sheets("查询表过度表").Cells(x, 2) Then
Sheets("查询表过度表").Cells(x, 4) = Sheets("置信度").Cells(p, i)
End If
Next
Next
End If
Next
Call 排序
esc:
Application.ScreenUpdating = True
End Sub

Sub 排序()
On Error GoTo esc
Application.ScreenUpdating = False

ActiveWorkbook.Worksheets("查询表过度表").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("查询表过度表").Sort.SortFields.Add Key:=Range("C2:C400") _
, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("查询表过度表").Sort
.SetRange Range("B1:D400")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
ActiveWindow.ScrollWorkbookTabs Position:=xlFirst
esc:
Application.ScreenUpdating = True

Sheets("查询表").Select
End Sub

第一句话
If Sheets("支持度").Cells(4, i) Like Sheets("查询表过度表").Cells(2, 1) Then

cells(4,i),i 所在的位置表示列,你的循环从1到400,相当于有400列?

您的总循环次数是400 * 400 * 400 = 64000000 次,其中由于if的逻辑,可能有部分循环没有发生,但就算是1万次的循环都是很慢的了。VBA本来就是慢的。
如果确实要榨出一点汁来,也不是没有。
比如 Sheets("查询表过度表").Cells(2, 1) 这个对象是没有变量的,所以可以先在一开始定义一个变量,直接获取单元格的值,以后在大循环中直接使用变量,就会快一点了。
又如,Sheets("查询表过度表").Cells(x, 2),这个,可以在for x语句下就用一个变量获取出来,后面的p循环时就用变量。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-16
这里有一些很明显的问题。首先这些for 没必要叠在一起。叠在一起的运算量是400*400*400。不叠起来只需要400*400 400。然后就是你的程序的bug。当有很多个匹配时你的程序取的是最后的那个匹配。如果你本来就是这么打算的,就没必要从头开始匹配。直接从最后找到一个匹配的就结束。我给你改一下效果完全一样:
For i = 400 To 1 step -1
If Sheets("置信度").Cells(4, i) Like Sheets("查询表过度表").Cells(2, 1) Then exit for
next
For x = 2 To 400

For p = 400 To 1 step -1
If Sheets("置信度").Cells(p, 1) Like Sheets("查询表过度表").Cells(x, 2) Then
Sheets("查询表过度表").Cells(x, 4) = Sheets("置信度").Cells(p, i)
exit for
End If
Next
Next

手机打的没试过。你主要看思路
第2个回答  2014-01-16
问题1:
For i = 1 To 400If Sheets("支持度").Cells(4, i) Like Sheets("查询表过度表").Cells(2, 1) Then

需要比较Sheets("支持度")的第1-400列数据?有这么多列?
循环次数直接与运算量相关。
总循环次数是各层循环次数的乘积,所以应根据实际行、列确定各层循环次数(最小)。

问题2:
各表的数据可以先存入数组,并用数组进行处理,比直接读取单元格值提高速度N倍。
比如语句:arr=Sheets("支持度").range("A4:D4"),可以将区域数据存入数组arr
其中arr(1,1)=A4,arr(1,2)=B4,arr(1,3)=C4,arr(1,4)=D4本回答被网友采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网