|
本帖最后由 CheryBTL 于 2013-10-17 10:55 编辑
法2将第二个字典提前找好位置,对随机数据应该会减小总的循环次数,数据多时就不一定管用了:- Sub CheryBTL_2() '0.139s
- Dim i As Integer, j As Integer, m As Integer, t As Single
- Dim Mre As Integer, R1 As Integer, L1 As Integer
- Dim ar1, ar2, ar3, re(1 To 500, 1 To 3) As Single, temp(1 To 500)
- Dim d As Object, d2 As Object
- t = Timer
- Set d = CreateObject("Scripting.Dictionary")
- Set d2 = CreateObject("Scripting.Dictionary")
- ar1 = Sheets(1).Range("A1").CurrentRegion
- ar2 = Sheets(2).Range("A1").CurrentRegion
- ar3 = Sheets(3).Range("A1").CurrentRegion
- For i = 2 To UBound(ar1)
- If Not d2.exists(ar1(i, 1)) Then
- If ar1(i, 2) = "调整" Then
- d2(ar1(i, 1)) = 2
- ElseIf ar1(i, 2) = "检查" Then
- d2(ar1(i, 1)) = 3
- Else
- d2(ar1(i, 1)) = 4
- End If
- End If
- Next i
- For i = 2 To UBound(ar3)
- If Not d.exists(ar3(i, 1)) Then
- m = m + 1
- d(ar3(i, 1)) = m
- For j = 2 To UBound(ar2)
- If ar3(i, 1) = ar2(j, 1) Then '求出Part.No对应的行标
- temp(m) = j
- Exit For
- End If
- Next j
- End If
- Mre = d(ar3(i, 1)) '结果的列标
- L1 = temp(Mre) '结果的行标
- R1 = d2(ar3(i, 2)) 'Failure Code对应的列标
- re(Mre, R1 - 1) = re(Mre, R1 - 1) + ar2(L1, R1)
- Next i
- Sheets("结果").[a2].Resize(d.Count) =Application.Transpose(d.keys)
- Sheets("结果").[b2].Resize(500, 3) = re
- MsgBox Timer - t
- End Sub
复制代码 增加屏幕更新和赋值前清空数据,跑到了:0.125s:- Sub CheryBTL_3() '0.125s
- Dim i As Integer, j As Integer, m As Integer, t As Single
- Dim Mre As Integer, R1 As Integer, L1 As Integer
- Dim ar1, ar2, ar3, re(1 To 500, 1 To 3) As Single, temp(1 To 500)
- Dim d As Object, d2 As Object
- t = Timer
- Application.ScreenUpdating = False
- Set d = CreateObject("Scripting.Dictionary")
- Set d2 = CreateObject("Scripting.Dictionary")
- ar1 = Sheets(1).Range("A1").CurrentRegion
- ar2 = Sheets(2).Range("A1").CurrentRegion
- ar3 = Sheets(3).Range("A1").CurrentRegion
- For i = 2 To UBound(ar1)
- If Not d2.exists(ar1(i, 1)) Then
- If ar1(i, 2) = "调整" Then
- d2(ar1(i, 1)) = 2
- ElseIf ar1(i, 2) = "检查" Then
- d2(ar1(i, 1)) = 3
- Else
- d2(ar1(i, 1)) = 4
- End If
- End If
- Next i
- For i = 2 To UBound(ar3)
- If Not d.exists(ar3(i, 1)) Then
- m = m + 1
- d(ar3(i, 1)) = m
- For j = 2 To UBound(ar2)
- If ar3(i, 1) = ar2(j, 1) Then '求出Part.No对应的行标
- temp(m) = j
- Exit For
- End If
- Next j
- End If
- Mre = d(ar3(i, 1)) '结果的列标
- L1 = temp(Mre) '结果的行标
- R1 = d2(ar3(i, 2)) 'Failure Code对应的列标
- re(Mre, R1 - 1) = re(Mre, R1 - 1) + ar2(L1, R1)
- Next i
- Sheets("结果").[a2].Resize(500, 4).ClearContents
- Sheets("结果").[a2].Resize(d.Count) = Application.Transpose(d.keys)
- Sheets("结果").[b2].Resize(500, 3) = re
- Application.ScreenUpdating = ture
- MsgBox Timer - t
- End Sub
复制代码 使用三个字典,就快多了(主要原因还是因为源数据多,但其它二个表数据少)- Sub CheryBTL_4() '<0.05s
- Dim i As Integer, j As Integer, m As Integer, t As Single
- Dim Mre As Integer, R1 As Integer, L1 As Integer
- Dim ar1, ar2, ar3, re(1 To 500, 1 To 3) As Single
- Dim d1 As Object, d2 As Object, d3 As Object
- t = Timer
- Application.ScreenUpdating = False
- Set d1 = CreateObject("Scripting.Dictionary")
- Set d2 = CreateObject("Scripting.Dictionary")
- Set d3 = CreateObject("Scripting.Dictionary")
- ar1 = Sheets(1).Range("A1").CurrentRegion
- ar2 = Sheets(2).Range("A1").CurrentRegion
- ar3 = Sheets(3).Range("A1").CurrentRegion
- For i = 2 To UBound(ar1) '确认工段表中的顺序
- If Not d2.exists(ar1(i, 1)) Then
- If ar1(i, 2) = "调整" Then
- d1(ar1(i, 1)) = 2
- ElseIf ar1(i, 2) = "检查" Then
- d1(ar1(i, 1)) = 3
- Else
- d1(ar1(i, 1)) = 4
- End If
- End If
- Next i
- For i = 2 To UBound(ar2) '确认损失单价表中的顺序
- If Not d2.exists(ar2(i, 1)) Then
- d2(ar2(i, 1)) = i
- End If
- Next i
- For i = 2 To UBound(ar3)
- If Not d3.exists(ar3(i, 1)) Then
- m = m + 1
- d3(ar3(i, 1)) = m
- End If
- Mre = d3(ar3(i, 1)) '结果的列标
- R1 = d1(ar3(i, 2)) '结果的行标
- L1 = d2(ar3(i, 1)) 'Failure Code对应的列标
- re(Mre, R1 - 1) = re(Mre, R1 - 1) + ar2(L1, R1)
- Next i
- Sheets("结果").[a2].Resize(500, 4).ClearContents
- Sheets("结果").[a2].Resize(d3.Count) = Application.Transpose(d3.keys)
- Sheets("结果").[b2].Resize(500, 3) = re
- Application.ScreenUpdating = ture
- MsgBox Timer - t
- End Sub
复制代码 |
评分
-
查看全部评分
|