【问题标题】:Optimum solution for searching similar rows搜索相似行的最佳解决方案
【发布时间】:2015-06-29 17:26:57
【问题描述】:

我是这个宏观世界的新手。从yday开始工作。 我创建了一个宏。 excel工作簿有两张。 sheet1 和 sheet2

表 1:

A   B   C  D  E
1   2   3  4  3
5   6   7  8  2
9   10  11 12 1
11  12  14 14 3

表 2:

A  B  C  D  E
1  2  3  4  7
13 14 17 20 2
5  6  7  8  1

因此,当 sheet2 中的行(第 4 个 A、B、C、D)与 sheet1 中的行匹配时,E 中的值应该相乘并存储在另一张表中。 例如, sheet2 , 1 2 3 4 与 sheet1 中的 1 2 3 4 匹配,因此 E(7 和 3)中的数字应相乘,结果应存储在 sheet3 中。

下面是我开发的sn-p。

Sub test()

Dim sh1 As Range
Set sh1 = Sheet1.UsedRange

Dim sh2 As Range
Set sh2 = Sheet2.UsedRange

Dim sh3 As Range
Set sh3 = Sheet3.UsedRange

For i = 1 To sh1.Rows.Count

    For m = 1 To sh2.Rows.Count

     Match = True

        For j = 1 To sh1.Columns.Count

            If (sh1.Cells(i, j).Value <> sh2.Cells(m, j).Value) Then Match = False

            If (Match = False) Then Exit For

        Next j

     If Match = True Then sh1.Cells(i, 4).Value = _
                sh1.Cells(i, 4).Value * sh2.Cells(m, 4).Value

    Next m
Next i

End Sub

这很好用。但这是一种线性搜索,所以当给出大量数据时,excel 就会挂起。 有没有更最佳的解决方案?也许像二进制搜索或按排序搜索。

【问题讨论】:

  • 所以总会有 4 个单元格匹配,然后对于最后一列的值要相乘?现在,您的代码会检查所有值是否匹配,因此尚不清楚它如何按所写的那样工作。
  • 你可以使用数组
  • 在辅助列中将 4 个值连接在一起可能会更快,然后使用 Match 之类的东西来查看该连接值是否存在于另一张表中。这应该可以消除代码中的一些循环,这将大大加快速度。
  • 类似的?听起来您想要完全匹配...

标签: vba excel


【解决方案1】:

这对我的测试数据非常有效。我对您的工作表参考做了一些假设,并且能够使用一些帮助列。您还可以使用更可靠的方法来使用最后一行,但这至少应该让您接近:

Sub Test()
Dim lrSheet1    As Long, _
    lrSheet2    As Long, _
    counter     As Long

With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
End With

With Sheet2
    lrSheet2 = .UsedRange.Rows.Count
    .Range("F1:F" & lrSheet2).Formula = "=CONCATENATE(A1,B1,C1,D1)"
End With

With Sheet1
    lrSheet1 = .UsedRange.Rows.Count
    .Range("F1:F" & lrSheet1).Formula = "=CONCATENATE(A1,B1,C1,D1)"
    .Range("G1:G" & lrSheet1).Formula = "=Match(F1,Sheet2!F:F,0)"
End With


With Sheet3
    For counter = 1 To lrSheet1
        If IsNumeric(Sheet1.Range("G" & counter)) Then _
            Sheet3.Range("A" & counter).Value = Sheet1.Range("E" & counter).Value * Sheet2.Range("E" & Sheet1.Range("G" & counter)).Value
    Next counter
End With

Sheet1.Range("F1:G" & lrSheet1).Delete
Sheet2.Range("F1:F" & lrSheet2).Delete

With Application
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
End With
End Sub

基本上它使用 2 个公式。第一个将值连接在一起。匹配公式返回 Sheet2 上匹配的行引用。一旦你有了它,只需遍历 Sheet1 上的值,如果有一个数字(意味着匹配),你将 Sheet1 第 5 列上的值与 Sheet2 第 5 列的匹配值(行号)相乘。

我的方法的限制是如果您在 Sheet2 上有多个匹配项(意味着 1234 存在不止一次)。不确定这是否有可能。如果是,则需要稍微不同的方法...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多