|
楼主 |
发表于 2020-3-2 16:22
|
显示全部楼层
Option Explicit
Const NUM As Long = 5 * 10 ^ 4 '每个字典最多装入的数据条数
Const LINE As Long = 10 ^ 5 '分段读取数据,这里10^5行为一段,如果溢出可以改的更小些,比如5*10^4
Sub test()
Dim arr(), t As String, i As Long, j As Long, k As Long, kk As Long
Dim cnt As Long, m As Long, tm As Single, n As Long, ii As Long
Dim row As Long
tm = Timer
With Sheets("4")
arr = .Range("b2:b" & .Cells(Rows.Count, "b").End(xlUp).row).Value
End With
ReDim brr(1 To UBound(arr, 1), 1 To 12) As String
ReDim dic(UBound(arr, 1) / NUM + 1) As Object
For i = 1 To UBound(dic)
Set dic(i) = CreateObject("scripting.dictionary")
Next
For i = 1 To UBound(arr, 1)
t = arr(i, 1)
If Len(t) Then
If m Mod NUM = 0 Then cnt = cnt + 1
dic(cnt)(t) = i: m = m + 1
End If
Next
On Error GoTo errmsg
For i = 1 To 3
row = Sheets(CStr(i)).Cells(Rows.Count, "b").End(xlUp).row
ReDim pos(1 To row \ LINE + 1, 1 To 2) As Long
For ii = 1 To UBound(pos)
pos(ii, 1) = (ii - 1) * LINE + 1
pos(ii, 2) = ii * LINE
If row <= pos(ii, 2) Then n = ii: pos(ii, 2) = row: Exit For
Next
For ii = 1 To n
arr = Sheets(CStr(i)).Cells(pos(ii, 1), "b").Resize(pos(ii, 2), 13).Value
For j = 1 To UBound(arr, 1) - 1
t = arr(j, 1)
If Len(t) Then
For k = 1 To cnt
If dic(k).exists(t) Then
m = dic(k)(t)
For kk = 2 To UBound(arr, 2)
brr(m, kk - 1) = arr(j, kk)
Next
Exit For
End If
Next
End If
Next
Next
Next
Debug.Print Timer - tm
Sheets("4").[c2].Resize(UBound(brr, 1), UBound(brr, 2)) = brr
Debug.Print Timer - tm
Exit Sub
errmsg:
MsgBox "Error:" & vbNewLine & "工作表:" & i & vbNewLine & "行数:" & j + 1
End Sub
还是你改完的这个,目前是没有出错了,这个改了之后,我目前运行5000行,没有问题,感谢 |
|