excel - 有没有一种更快或更聪明的方法来为每个人做 2 个?
问题描述
我想将一个表中的单元格值添加到另一个表中。第一个表包含大约 110 000 行 (tabCDL) 和其他大约 37 000 行 (tabEMP)。现在大约需要一个小时,我需要做得更快。
Public Sub MergeColumnEMP()
'Merge
Dim cel, cel2, rngCDL, rngEMP As Range
Dim shtCDL, shtEMP As Worksheet
Dim LastRowCDL, LastRowEMP As Long
Set shtCDL = Sheets("CEDULE")
Set shtEMP = Sheets("EMPRUNT")
LastRowCDL = shtCDL.ListObjects("TabCEDULE").Range.Rows.Count
LastRowEMP = shtEMP.ListObjects("TabEMP").Range.Rows.Count
Set rngCDL = Sheets("CEDULE").Range("H2:H" & LastRowCDL)
Set rngEMP = Sheets("EMPRUNT").Range("C2:C" & LastRowEMP)
For Each cel In rngCDL
For Each cel2 In rngEMP
If cel.Value = cel2.Value Then
'amount
Sheets("CEDULE").Range("I" & cel.Row).Value = Sheets("EMPRUNT").Range("D" & cel2.Row).Value
'Date dstart
Sheets("CEDULE").Range("J" & cel.Row).Value = Sheets("EMPRUNT").Range("H" & cel2.Row).Value
'Date end
Sheets("CEDULE").Range("K" & cel.Row).Value = Sheets("EMPRUNT").Range("I" & cel2.Row).Value
Exit For
End If
Next cel2
Next cel
Debug.Print "DONE merging"
End Sub
解决方案
请尝试下一个方法。它使用数组并且应该非常快。未经测试,但如果我没有弄乱所涉及范围的任何内容,它应该可以工作:
Sub MergeColumnEMP() 'unique in EMP, not unique in CEDULE
Dim arrCDL, arrEMP, rngCopy As Range, i As Long, j As Long
Dim shtCDL As Worksheet, shtEMP As Worksheet
Dim LastRowCDL As Long, LastRowEMP As Long
Set shtCDL = Sheets("CEDULE")
Set shtEMP = Sheets("EMPRUNT")
LastRowCDL = shtCDL.ListObjects("TabCEDULE").Range.rows.Count
LastRowEMP = shtEMP.ListObjects("TabEMP").Range.rows.Count
arrCDL = shtCDL.Range("H2:K" & LastRowCDL).value 'h
arrEMP = Sheets("EMPRUNT").Range("C2:I" & LastRowEMP).value 'c
For i = 1 To UBound(arrCDL)
For j = 1 To UBound(arrEMP)
If arrCDL(i, 1) = arrEMP(j, 1) Then
arrCDL(i, 2) = arrEMP(j, 2)
arrCDL(i, 3) = arrEMP(j, 5)
arrCDL(i, 4) = arrEMP(j, 6)
Exit For
End If
Next j
Next i
shtCDL.Range("H2").Resize(UBound(arrCDL), UBound(arrCDL, 2)).value = arrCDL
MsgBox "DONE merging"
End Sub
编辑:
请同时测试下一个代码,它应该更快:
Sub MergeColumnEMPLast() 'unique in EMP, not unique in CEDULE
Dim arrCDL, arrEMP, rngCopy As Range, i As Long, j As Long
Dim shtCDL As Worksheet, shtEMP As Worksheet
Dim LastRowCDL As Long, LastRowEMP As Long
Dim dict As New Scripting.Dictionary, iMatch As Variant
Set shtCDL = Sheets("CEDULE")
Set shtEMP = Sheets("EMPRUNT")
LastRowCDL = shtCDL.ListObjects("TabCEDULE").Range.rows.Count
LastRowEMP = shtEMP.ListObjects("TabEMP").Range.rows.Count
arrCDL = shtCDL.Range("H2:K" & LastRowCDL).value 'h
arrEMP = shtEMP.Range("C2:I" & LastRowEMP).value 'c
For i = 1 To UBound(arrCDL)
If dict.Count > 0 Then iMatch = Application.match(arrCDL(i, 1), dict.Keys, 0)
If Not IsError(iMatch) Then
If dict.Count > 0 Then
If iMatch <> dict.Count Or (iMatch = dict.Count And arrCDL(i, 1) = dict.Keys(dict.Count - 1)) Then
arrCDL(i, 2) = dict.items(iMatch - 1)(0)
arrCDL(i, 3) = dict.items(iMatch - 1)(1)
arrCDL(i, 4) = dict.items(iMatch - 1)(2)
GoTo OverIteration
End If
End If
End If
For j = 1 To UBound(arrEMP)
If arrCDL(i, 1) = arrEMP(j, 1) Then
arrCDL(i, 2) = arrEMP(j, 2)
arrCDL(i, 3) = arrEMP(j, 6)
arrCDL(i, 4) = arrEMP(j, 7)
dict.Add arrCDL(i, 1), Array(arrEMP(j, 2), arrEMP(j, 6), arrEMP(j, 7))
Exit For
End If
Next j
OverIteration:
Next i
shtCDL.Range("H2").Resize(UBound(arrCDL), UBound(arrCDL, 2)).value = arrCDL
MsgBox "DONE merging"
End Sub
我只是好奇你的范围需要多少...
推荐阅读
- c# - 如何使用 GetAttribute 方法检索元素文本?
- reactjs - 用于 Web 键盘快捷键的 Electron React Native
- uwp - 本地托管程序包的 Windows 10 应用安装程序失败
- material-ui - Popper.js 覆盖输入字段标签
- logic - 模型检查:使用 NFA 的错误前缀
- visual-studio - 生成 SSH 密钥时出错。请检查环境是否配置正确
- r - 当您只想在 r 中引用该字符串的一部分时,如何根据字符串选择行?
- android - Kotlin 等效于 AsyncTask.SERIAL_EXECUTOR?
- ios - 如何设置用于绘制折线的循环
- python - 我正在尝试编写一个函数来汇总小于 1000 的备用赔率并返回该值