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
您可以在下图中看到它执行的每个步骤:
我有一个 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
您可以在下图中看到它执行的每个步骤: