说明:
在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循环时就用变量。
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
手机打的没试过。你主要看思路
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本回答被网友采纳