Excel查找并比较多列中的值(如果满足条件)[关闭]

muk1a3rh  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(129)

已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。

7年前关闭。
Improve this question
我有一个表,其中的行代表客户,每个月,我在每行上添加一列,表示他们的订单类型(A,B或C)。
我需要确定每个客户谁做了一个类型A的订单(在任何一个月),然后,在接下来的一个月,做了一个类型C的订单。
然而,如果在从“A”到“C”类型的订单(一个或多个月做“C”)之后,客户返回到“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

monwx1rj

monwx1rj1#

如果没有VBA,一个简单的方法是:(在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也输出“否”…

编辑

如果只有最后一个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

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

相关问题