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

说明:在A2输入一个原始商品编号,B列为匹配商品编号,C列的支持度是A2与B列各编码匹配后他们相应的支持度(数据来源于支持度表格A列与4行交叉的数据)D列的置信度是A2与... 说明:
在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
展开
 我来答
三心全乱
2014-01-16 · TA获得超过6158个赞
知道小有建树答主
回答量:518
采纳率:100%
帮助的人:222万
展开全部
第一句话
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循环时就用变量。
zhaojiefeng119
2014-01-16 · TA获得超过643个赞
知道小有建树答主
回答量:637
采纳率:0%
帮助的人:602万
展开全部
这里有一些很明显的问题。首先这些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

手机打的没试过。你主要看思路
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
TAT萝卜
2014-01-16 · TA获得超过4972个赞
知道大有可为答主
回答量:3084
采纳率:66%
帮助的人:1124万
展开全部
问题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
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式