Excel 如果满足条件,查找并比较多列的值

Excel Find and compare values over multiple columns if condition met

我有一个 table,其中的行代表客户,每个月,我都会在每一行上添加一列,代表他们的订单类型(A、B 或 C)。

我需要确定每个下了 A 类订单的客户(在任何一个月),然后在接下来的一个月内下了 C 类订单。

但是,如果在从 "A" 到 "C" 类型的订单(一个或多个月做 "C" 之后),客户 returns 到 "A",我不需要指认他。

"B"订单在找到"A"订单后无所谓

给出的例子:

Client  M1  M2  M3  M4  Identify
  01    A   B   C   C     Yes
  02    A   B   C   A      No
  03    A   C   B   A      No
  04    B   B   A   C     Yes
  05    B   A   C   B     Yes
  06    C   A   B   B      No
  07    A   A   A   C     Yes
  08    A   A   A   A      No
  09    A   C   A   C     Yes
  10    A   C   C   A      No

等等

我不知道我是否可以使用简单的公式或使用 VBA。

已编辑: 因为我每个月都会添加一个新列,所以公式或 VBA 应该考虑所有可能性(例如 "ACCA"、"ACCCCA" , 等等)。还添加了客户端 07、08、09 和 10 作为示例。

提前谢谢你。

JT

没有 VBA 一个 easy 方法是:(在 F2 中然后向下复制)

=IF(ISERROR(FIND("AC",SUBSTITUTE(B2&C2&D2&E2,"B",""))),"No",IF(ISERROR(FIND("ACA",SUBSTITUTE(B2&C2&D2&E2,"B",""))),"Yes","No"))

作为 "OnlyDoesWhatIAskedFor"-UDF 将其放入模块中:

Public Function getOrder(rng As Range) As String
  Dim runner As Variant, i As Long, comb As Variant
  comb = Array("A", "C", "A")
  getOrder = "No"
  For Each runner In rng.Value
    If runner = comb(i) Then
      If i = 2 Then getOrder = "No": Exit Function
      If i = 1 Then getOrder = "Yes"
      i = i + 1
    ElseIf runner = comb(0) Then
      i = 1
    ElseIf runner <> "B" Then
      i = 0
    End If
  Next
End Function

然后在要输出的单元格中(假设F2并简单地复制下来)

=getOrder(B2:E2)

它只检查范围内的 A-C 顺序,而 B 将被忽略,A-C-A 也输出 "No"...

编辑

如果只有最后一个 AC/ACA 计数,那么您将需要这样的东西:(在模块中)

Public Function getResult(rng As Range) As String
  Dim a As Variant, b As String
  'Col W - changes the cells to one long string / "B" will be left out
  For Each a In rng.Value
    If a <> "B" Then b = b & a
  Next
  'Col X - skips xxACAxx to Axx till no ACA is left
  While InStr(b, "ACA")
    b = Mid(b, InStr(b, "ACA") + 2)
  Wend
  '<~~~ add from here for ACCA = "No" (ACCAC will still be "YES")
  While InStr(b, "ACCA")
    b = Mid(b, InStr(b, "ACCA") + 2)
  Wend
  '<~~~ add till here for ACCA = "No" (ACCAC will still be "YES")
  'Col Y - Checks if an AC is found in the leftover
  'Col Z - if the check is >0 then it will be YES else No
  If InStr(b, "AC") Then getResult = "Yes" Else getResult = "No"
End Function

您可以在下图中看到它执行的每个步骤: