【问题标题】:VBA code to compare two worksheets and add the missing lines用于比较两个工作表并添加缺失行的 VBA 代码
【发布时间】:2020-12-22 08:50:21
【问题描述】:

我的以下代码正在运行,但需要时间(大约 10 分钟),有时它会进入无响应模式,因为我的数据大约有 60k 行。

我要做的是比较两个工作表的 A 列中的值,如果值存在于 sh2 但不存在于 sh1 中,则将整行 (A-X) 粘贴到 sh1。

如果有比这更好、更快、更有效的方法,有人可以帮忙吗?

Sub t()
Dim sh1 As Worksheet, sh2 As Worksheet, c As Range
Set sh1 = Workbooks(WK1).Sheets(sheet1)
Set sh2 = Workbooks(WK2).Sheets(sheet1)
    For Each c In sh2.Range("A2", sh2.Cells(Rows.Count, 1).End(xlUp))
        If Application.CountIf(sh1.Range("A:A"), c.Value) = 0 Then
            c.Resize(, 24).Copy sh1.Cells(Rows.Count, 1).End(xlUp)(2)
        End If
    Next
End Sub

【问题讨论】:

  • 获取范围很慢,所以尽量减少 range() 调用的次数。对两张表进行排序,这样您就不必执行 countif() 或将整个查找值范围抓取到数组中并在数组中进行查找。 .哦,还有一个相交运算符在这里也可以很好地工作

标签: excel vba for-loop countif


【解决方案1】:

尝试添加 Application.ScreenUpdate=False Application.EnableEvents = False 在开始和 Application.ScreenUpdate=True Application.EnableEvents = True 在代码末尾。它应该加速整个代码。如下所示。您可以添加带有进度条的用户表单以显示实际状态。

Sub t()
Dim sh1 As Worksheet, sh2 As Worksheet, c As Range
Application.ScreenUpdate=False
Application.EnableEvents = False
Set sh1 = Workbooks(WK1).Sheets(sheet1)
Set sh2 = Workbooks(WK2).Sheets(sheet1)
For Each c In sh2.Range("A2", sh2.Cells(Rows.Count, 1).End(xlUp))
    If Application.CountIf(sh1.Range("A:A"), c.Value) = 0 Then
        c.Resize(, 24).Copy sh1.Cells(Rows.Count, 1).End(xlUp)(2)
    End If
Next
Application.ScreenUpdate=True 
Application.EnableEvents = True
End Sub

\\已编辑 \\

试试下面的代码。没有必要通过每个车道的工作表功能检查所有范围。 find 方法更快

Sub t()
Dim sh1 As Worksheet, sh2 As Worksheet, c As Range
Dim str_LookUp As String, rng_FindRange As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
Set sh1 = Workbooks(WK1).Sheets(sheet1)
Set sh2 = Workbooks(WK2).Sheets(sheet1)
For Each c In sh2.Range("A2", sh2.Cells(Rows.Count, 1).End(xlUp))
str_LookUp = c.Text
Set rng_FindRange = sh1.Range("A:A").Find(str_LookUp, , , xlWhole)
If rng_FindRange Is Nothing Then
    c.Resize(, 24).Copy sh1.Cells(Rows.Count, 1).End(xlUp)(2)
End If
Next
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

【讨论】:

  • 我已经添加了它们,但它是同一个伙伴。完成所需的时间没有太大差异。
  • 我正在尝试运行它,但出现类型不匹配错误 @Set rng_FindRange = sh2.Range("A:A").Find(str_LookUp, rng_FindRange.Address, , xlWhole)。我也注意到我们没有尝试在 sh1 中找到它。两个 find 函数都被路由到 sh2。这是需要调查的东西吗??
  • 是的,我在编写此代码时想念它,但没有注意到您需要在 sh1 中检查来自 sh2 的参数。我编辑了代码并在我的电脑上做了一些测试,这次应该可以了。
猜你喜欢
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 2021-12-23
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
相关资源
最近更新 更多