【问题标题】:Compare two columns if another two columns are matching in excel macro如果另外两列在 excel 宏中匹配,则比较两列
【发布时间】:2014-04-10 03:23:40
【问题描述】:

如果另外两列匹配,我想比较 excel 中的两列。

A          B            C            D
$10      1234D          $40          100D
$20      1235D          $10          1234D 
$30       122D          $20          1235D 
$40      1222D          $30          1222D 

首先我需要比较 col A 和 C 如果在 col C 中找到任何匹配项,那么我需要比较 B 和 D 是否匹配。示例我在 A 中有 10 美元,它的 ID 是 1234D。我需要在 C 中比较相同的值。如果我在 C 中找到 10 美元但它的 id 不是 1234D,我需要在另一列中显示不匹配的值。

我可以像下面那样匹配 A 和 C。但是我对如何比较 B 和 D 之后感到困惑?我是 excel vba 的新手,如果有人帮助我这样做,我将不胜感激。

  Function Find_Matches()
  Dim CompareRange As Variant, SelectionRange As Variant, x As Variant, y As Variant
    ' compare the selection.
     Sheets("Menu").Activate
    Set SelectionRange = Range("A2:A6")
    Set CompareRange = Range("C2:C6")

    ' Loop through each cell in the selection and compare it to
    ' each cell in CompareRange.
    For Each x In SelectionRange
        For Each y In CompareRange
            If x = y Then x.Offset(0, 4) = True

        Next y
    Next x

End Function

【问题讨论】:

  • 您使用宏而不是公式是否有原因?简单公式:=IF(AND(IF(A2=C2, TRUE, FALSE), IF(B2=D2, TRUE, FALSE), TRUE, FALSE)) 然后根据需要向下拖动公式。此外,如果您需要比较多行,请考虑使用VLOOKUP
  • 谢谢,但我需要在 vba 中完成。
  • 结果应该是什么?您只想在 E 列中写入 True/False

标签: excel vba


【解决方案1】:

我需要以任何方式使用 vba。

使用这个宏:

Sub Find_Matches()
    Dim rng As Range

    Set rng = Sheets("Menu").Range("A2:A6")

    With rng.Offset(, 4) ' write result in column E
        .FormulaArray = "=ISNUMBER(MATCH(" & rng.Address & "&""|""&" & _
            rng.Offset(, 1).Address & "," & rng.Offset(, 2).Address & _
            "&""|""&" & rng.Offset(, 3).Address & ",0))"
        .Calculate
        .Value = .Value
    End With
End Sub

它写入结果(TrueFalse 在列 E)。

说明:

  1. 主要思想是用公式确定结果,然后用其结果值重写公式。
  2. 我们所做的是写入 E2:E6 数组公式
    =ISNUMBER(MATCH($A$2:$A$6 & "|" & $B$2:$B$6,$C$2:$C$6 & "|" & $D$2:$D$6,0)) - 如果我们找到 A2B2 在范围 C2:D6 的任何行中,它会返回 True,例如C3D3
  3. .Value = .Value 部分用他们的结果重写公式
  4. 它是如何工作的?公式连接列AB,搜索结果连接列CD
  5. 为什么我们在公式中使用& "|" &?想象以下情况:

A          B            C            D
$101      234D          $10          1234D

从技术上讲,A1 & B1C1 & D1 的串联给出了相同的结果:$101234D,但我们清楚地看到没有匹配项。这就是为什么我在连接值时使用 | 作为分隔符:A1 & "|" & B1 返回 $101|234DC1 & "|" & D1 返回 $10|1234D,它们不一样,因为我们需要它。

【讨论】:

  • 非常感谢您的回答,但是如果我想在 E 列中写入 D 的值(而不是真或假),那么我该如何更改呢?
  • 对于True,它很清楚要返回什么,但是您想为False 返回什么?在这种情况下什么也没找到,应该返回什么?
【解决方案2】:
  1. 是否需要在 vba 中? 2. 你怎么做才能显示有比赛或半场比赛?

在 F 中创建一个新列,它是 A 和 B 的串联。在 G 列中执行相同操作以串联 C 和 D 中的值。

然后使用使用 VLookup 的公式查看查找 A & B 的串联是否返回“N/A”错误。如果这是 false,则您有一个匹配的列。

所以,F2的公式是

'=concatenate(A2, B2)'

G2 的公式是

'=concatenate(C2, D2)' 

而进行 vlookup 的公式是

'=IF(ISNA(Vlookup(concatenate(a2, b2), $F$2:$G$<LastRowOfData>, 2, FALSE)), "", "Matches")

如果需要在 vba 中,您可以设置一个宏来执行这些步骤。

【讨论】:

  • 感谢您的想法。我将使用 vba 连接列,然后尝试匹配。我需要以任何方式使用 vba。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
相关资源
最近更新 更多