【发布时间】:2021-06-22 21:06:31
【问题描述】:
我有很多表需要合并数据。我已经将一些表组合成一个测试表来测试代码。在运行我的代码之前,我正在对列 'B' a-z 中的唯一值进行排序。只有约 3500 条记录,速度非常慢。实际总数超过 100,000 条记录。我很想知道是否可以将整个表加载到数组中并执行相同的功能,但我不确定是否可能。
我的表结构是:
| Unique ID | First | Last | Company | etc. |
|---|---|---|---|---|
| A1 | John | |||
| A1 | Doe | |||
| A1 | company1 | |||
| A2 | Jay | Varnado | ||
| A3 | Joe | Snuffy | ||
| A3 | M. | company2 |
期望的结果是:
| Unique ID | First | Last | Company | etc. |
|---|---|---|---|---|
| A1 | John | Doe | company1 | |
| A1 | John | Doe | company1 | |
| A1 | John | Doe | company1 | |
| A2 | Jay | Varnado | ||
| A3 | Joe M. | Snuffy | company2 | |
| A3 | Joe M. | Snuffy | company2 |
Dim cel As Range, rng As Range, r As Range
Dim arr(14) As String, temp As String
Dim i As Long, b As Long, j As Long, lRow As Long, lRec As Long, c As Long
Dim ii As Integer, v As Integer, col As Integer
Dim dict As Scripting.Dictionary
Dim str() As String
Dim BenchMark As Double
BenchMark = Timer
lRow = Sheet3.Cells(Rows.Count, 1).End(xlUp).Row
For c = 3 To lRow
Debug.Print c
Set cel = Sheet3.Range("B" & c)
If Trim(cel.Offset(1, 0)) = Trim(cel.Value) Then
'Determine range of like keys
i = 1
Do Until cel.Offset(i, 0).Value <> cel.Value
i = i + 1
Loop
lRec = cel.Offset(i, 0).Row - 1
'Compare data
For i = 3 To 16
ii = i - 3
'Create rng and loop through each column
Set rng = Sheet3.Range(Sheet3.Cells(c, i), Sheet3.Cells(lRec, i))
Set dict = New Scripting.Dictionary 'CreateObject("Scripting.Dictionary")
For Each r In rng
If dict.Exists(r.Value) = False And Len(r.Value) > 0 Then
dict.Add r.Value, r.Value
End If
Next r
'Add to string array
'Debug.Print Split(Join(dict.Keys, "|"), "|")
str = Split(Join(dict.Keys, ","), ",")
arr(ii) = Join(str, ",")
Set dict = Nothing
Next i
'Set range equal to array
For j = cel.Row To lRec
v = 0
For col = 3 To 16
Sheet3.Cells(j, col) = arr(v)
Sheet3.Cells(j, col) = arr(v)
v = v + 1
Next col
Next j
'Go to last cell in range
c = lRec
Else: GoTo NextCel
End If
'Clear array
NextCel:
On Error Resume Next
'Debug.Print Join(arr, ",")
Erase arr
On Error GoTo 0
Next c
MsgBox ("Done in " & Timer - BenchMark)
End Sub
【问题讨论】: