我有这样的功能来匹配两张工作表之间的数据。在 Tab 中,只有几行需要从包含大约 10 000 个 ID 的表单 Dan 中获取 ID 号。
Sub MatchName()
Dim n1 As Long
Dim n2 As Long
Dim LastRowcheck1 As Long
Dim LastRowcheck2 As Long
LastRowcheck1 = Sheets("Tab").Range("C" & Rows.Count).End(xlUp).Row
LastRowcheck2 = Sheets("Dan").Range("A" & Rows.Count).End(xlUp).Row
Sheets("Tab").Activate
For n1 = 2 To LastRowcheck1
For n2 = 2 To LastRowcheck2
Debug.Print "From: " & Sheets("Dan").Cells(n2, 1).Value & " to " & Sheets("Tab").Cells(n1, 3).Value
If Sheets("Tab").Cells(n1, 3).Value = Sheets("Dan").Cells(n2, 1).Value Then
Sheets("Tab").Cells(n1, 6).Value = Sheets("Dan").Cells(n2, 1).Value
Sheets("Tab").Cells(n1, 30).Value = Sheets("Dan").Cells(n2, 2).Value
End If
Next n2
Next n1
End Sub
答案 0 :(得分:2)
您不需要 2 个循环。
遍历其中一张工作表上的相关列并使用 Application.Match
查找另一张工作表上的相关列中是否存在匹配项。
如果匹配,则复制数据。
Option Explicit
Sub MatchName()
Dim n1 As Long
Dim LastRowcheck1 As Long
Dim Res As Variant
LastRowcheck1 = Sheets("Tab").Range("C" & Rows.Count).End(xlUp).Row
For n1 = 2 To LastRowcheck1
Res = Application.Match(Sheets("Tab").Cells(n1, 3), Sheets("Dan").Columns(1), 0)
If Not IsError(Res) Then
Sheets("Tab").Cells(n1, 6).Value = Sheets("Dan").Cells(Res, 1).Value
Sheets("Tab").Cells(n1, 30).Value = Sheets("Dan").Cells(Res, 2).Value
End If
Next n1
End Sub
答案 1 :(得分:1)
当宏运行时间过长时,Excel 往往会冻结。即使“Tab”只包含 10 行,仍然是 100000 个循环。
DoEvents 函数可防止冻结。确保以每隔一段时间发生一次的方式包含它(例如每 1000 次循环)。您也可以将它包含在每个循环中,但它可能会减慢速度(这是我的猜测)。
请注意,运行该子例程可能仍需要很长时间。这里有两种方法可以加快速度,因此您甚至可能不需要 DoEvents: