【问题标题】:Compare two data ranges and copy entire row into worksheet VBA比较两个数据范围并将整行复制到工作表 VBA
【发布时间】:2021-10-08 18:56:57
【问题描述】:

我在论坛中发现了许多非常相似的问题,但不知何故没有适合我正在寻找的问题。 我有两个要比较的范围(a 和 b),如果值不匹配,我想将整行复制到预定义的工作表中。目的是查找与先前编辑相比已更改的行/值。

Dim a, b as range
Dim ws1,ws2,ws3 as worksheet
Dim last_row, last_row2 as integer 'assume last_row =15, last_row2=12
Dim i, j, k as integer
last_row=15
last_row2=12
' the orignal range is not massive, but at 500x 6 not small either
Set a=ws1.range("I5:S"& last_row)
Set b=ws2.range("H2:R"& last_row2)

在处理范围中的每个项目时,我看到了不同的方法,但不知道哪种方法最快/最好(循环或每个)。 主要的 if 语句看起来像这样:

'assume i, j are the used as counters running across the range
k = 1
If Not a(i).value=b(j).value then
a(i)EntireRow.copy
ws3.row(k).paste
k = k + 1
end if 

解决方案不能基于公式,因为我需要在每次比较后保存 ws3。 非常感谢您对此的任何帮助。谢谢!

【问题讨论】:

  • 如果您正在寻找速度,请考虑使用Variant 数组(更多阅读here)。循环遍历每个单元格会很慢。

标签: excel vba for-loop compare range


【解决方案1】:

如果你有能力利用Excel Spill Ranges,你可以在没有VBA 的情况下实现你想要的。这是a web Excel file,它显示了第一张表中A列不等于b列的所有行。

=FILTER(Sheet1!A:ZZ,Sheet1!A:A<>Sheet1!B:B)

如果需要 VBA,此例程应该可以工作。它不是处理值的最佳选择(不使用数组),但它可以完成。

Sub listDifferences()
Dim pullWS As Worksheet, pushWS As Worksheet

Set pullWS = Sheets("Sheet1")
Set pushWS = Sheets("Sheet2")

Dim aCell As Range

For Each aCell In Intersect(pullWS.Range("A:A"), pullWS.UsedRange).Cells
    
    If aCell.Value <> aCell.Offset(0, 1).Value Then
        Dim lastRow As Long
        lastRow = pushWS.Cells(Rows.Count, 1).End(xlUp).Row
        pushWS.Rows(lastRow + 1).Value = aCell.EntireRow.Value
    End If
Next aCell

End Sub

【讨论】:

  • 这就是我需要的——只有我的工作空间不运行 Excel 365。
  • 它不起作用的唯一原因是您的实例中没有 Excel 溢出功能。如果您使用的是 Web Excel,您肯定会拥有它。详情如下:exceljet.net/glossary/spill-range
  • @Juan 现在有一个 vba 解决方案。
  • 感谢您的回答。我只是使用了以下简单的解决方案。这可能需要一些时间才能在更大的范围内运行......
【解决方案2】:

这是我最终使用的小型 for 循环。 感谢您的意见!

For i = 1 To rOutput.Cells.Count
    If Not rOutput.Cells(i) = rBackUp.Cells(i) Then
'    Debug.Print range1.Cells(i)
'    Debug.Print range2.Cells(i)
    rOutput.Cells(i).EntireRow.Copy wsChangeLog.Rows(k)
    
    k = k + 1
    End If
Next i

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多