【问题标题】:Excel Find and compare values over multiple columns if condition met [closed]如果条件满足,Excel查找并比较多列的值[关闭]
【发布时间】:2016-03-17 00:13:22
【问题描述】:

我有一个表格,其中包含代表客户的行,并且每个月,我在每一行上添加一列,代表他们所下订单的类型(A、B 或 C)。

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

但是,如果从“A”到“C”类型的订单(一个或多个月做“C”)后,客户返回“A”,我不需要识别他。

找到“A”订单后,“B”订单无所谓

给出的例子:

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

【问题讨论】:

    标签: arrays excel vba find next


    【解决方案1】:

    如果没有 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 也输出“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
    

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

    【讨论】:

    • @J.T.只是一个问题……如果有 ACAC 令,是“是”还是“否”?
    • 谢谢!我尝试了没有 VBA 的公式,它就像一个魅力。而且我实际上没有考虑这种情况,我想应该是“是”。如果满足“ACA”条件,我可以创建另一个 FIND("ACAC"。但是,公式会随着月份的增加而增长(每个月我都会添加一个新列)。VBA 上的 Array 也会发生同样的情况。
    • 现在这两个版本只有在没有 ACA 但至少找到一个 AC 的情况下才是正确的......所以问题很简单:只有最后一个 AC/ACA 算吗?
    • 你是对的,不知道 find 公式是这样工作的。谢谢!如果有“ACCA”或“ACCCA”怎么办(考虑更多月)。很抱歉之前没有指定该案例,将在帖子中添加。
    • @J.T.只有 AC/ACA 将被检查...没有别的...请查看我的编辑以了解仅检查最后一个 AC/ACA...
    猜你喜欢
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多