具有countifs功能并在单元格中搜索文本

时间:2018-07-19 13:24:44

标签: vba

我希望有人能提供帮助,我已经坚持了好几天。

在我的Excel工作表中,我列出了要计算在函数中的错误列表(与excel不相关)。问题是某些类型的错误包含唯一的引用,这使得excel中的countifs函数不足。

我要搜索4个列范围和4个条件(ConigneeIdRangeConsigneeIdErrorMessageRangeErrorMessageDateRange1,{{1 }},Date1DateRange2)。对于大多数错误,countifs函数就足够了,因为在单元格(字符串)中没有唯一的引用,但是我有两种类型的错误消息,其中包含唯一的值(装运编号)。第一个包含字符串“ Unable”,第二个包含字符串中的“ modified”。

我有一个2000行的列表,想知道在特定月份内每行的某个单元格中发生了多少次错误。

也许循环可能是解决方案?我不知道如何在下面的代码中添加更多条件,以及如何在字符串中搜索这两种错误。

Date2

请参见下面的示例数据:

  1. 所需的日期错误消息收货人ID结果
  2. 43101无效的输入7777778 2 3
  3. 43103无效的输入7777778 2 3
  4. 43151无效的输入7777778 2 0
  5. 43131无法处理445376 7777775 2 2
  6. 43104由另一个过程修改445378 7777774 2 2
  7. 43115无法处理445380 7777775 2 2
  8. 43119由另一个过程修改445390 7777774 2 2
  9. 43120无效的输入7777779 1 1
  10. 43101无效的输入7777778 2 3

使用的公式:= COUNTIFS($ C $ 2:$ C $ 9,C2,$ B $ 2:$ B $ 9,IF(NOT(ISERROR(FIND(“ Modified”,B2))),“ 已修改< / em>“,IF(NOT(ISERROR(FIND(” Unable“,B2))),” Unable “,B2)),$ A $ 2:$ A $ 9,”> =“&DATE (2018,1,1),$ A $ 2:$ A $ 9,“ <=”&DATE(2018,1,31))

在上面的公式中,通配符在保存帖子后被删除,但它们在我使用的公式中。

您可以看到我没有得到理想的结果。有人可以帮助我创建一个产生期望结果的函数吗?

2 个答案:

答案 0 :(得分:0)

如果我了解您的问题,则可以在COUNTIFS中使用通配符,首先检查H2是否包含文本“ Modified”或“ Unable”。如果是这样,COUNTIFS的第四个参数将使用通配符,否则将仅为H2

=COUNTIFS(K2:K2000, K2, H2:H2000, IF(NOT(ISERROR(FIND("Modified",H2))),"*Modified*",IF(NOT(ISERROR(FIND("Unable",H2))),"*Unable*",H2)), B2:B2000, ">="&DATE(2018,1,1), B2:B2000,"<="&DATE(2018,1,31))

编辑1

enter image description here

此屏幕快照是我对您提供的数据/公式的理解,并对为什么您的结果与期望的结果不符进行了一些修订和注释。这是我正在使用的修订公式。

=COUNTIFS($C$2:$C$10,C2,$B$2:$B$10, IF(NOT(ISERROR(FIND("Modified",B2))),"Modified*",IF(NOT(ISERROR(FIND("Unable",B2))),"Unable*",B2)),$A$2:$A$10,">="&DATE(2018,1,1),$A$2:$A$10,"<="&DATE(2018,1,31))
  1. 只需检查一下,看来您的数据是从C2:C10运行的,但是您的公式仅引用了C2:C9(?)
  2. 带有通配符的COUNTIFS在带有“ Unable”或“ Modified”的行上返回正确的结果
  3. 在第4行,期望的结果如何为0?当前的结果为3,因为有3行(2、3和10)符合您的COUNTIFS的条件-即它们都在2018年1月之内。如果您只希望将计数显示在属于该行的行上一月份,您可以先测试该状况-也许使用类似的方法。

修改后的公式:

=IF(AND(A2>=DATE(2018,1,1),A2<=DATE(2018,1,31)),COUNTIFS($C$2:$C$10,C2,$B$2:$B$10, IF(NOT(ISERROR(FIND("Modified",B2))),"Modified*",IF(NOT(ISERROR(FIND("Unable",B2))),"Unable*",B2)),$A$2:$A$10,">="&DATE(2018,1,1),$A$2:$A$10,"<="&DATE(2018,1,31)),0)

答案 1 :(得分:0)

我找到了解决问题的方法。

显式选项 函数CErrorCount(ConsigneeIdRange作为范围,ConsigneeId作为长,ErrorMessageRange作为范围,ErrorMessage作为字符串,_                         Date1Range作为范围,Date1作为字符串,Date2Range作为范围,Date2作为字符串)作为整数

'计算日期之间的错误类型

If InStr(1, ErrorMessage, "Unable", 1) Then
    CErrorCount = WorksheetFunction.CountIfs(ConsigneeIdRange, ConsigneeId, ErrorMessageRange, "*Unable*", Date1Range, Date1, Date2Range, Date2)
ElseIf InStr(1, ErrorMessage, "modified", 1) Then
    CErrorCount = WorksheetFunction.CountIfs(ConsigneeIdRange, ConsigneeId, ErrorMessageRange, "*modified*", Date1Range, Date1, Date2Range, Date2)
Else
    CErrorCount = WorksheetFunction.CountIfs(ConsigneeIdRange, ConsigneeId, ErrorMessageRange, ErrorMessage, Date1Range, Date1, Date2Range, Date2)

    End If

结束功能