Countifs没有返回正确的值

时间:2020-01-30 20:08:37

标签: excel vba excel-formula

我将以下数据全部存储为文本,默认情况下为单元格格式。

=ISTEXT(G4)
=TRUE
'in both spreadsheets.

样本数据

两个工作簿相似。 A1中的日期不同,到处都有不同的行条目。

+---+-----------+-------------+-----+-----+------+-------------+--------------+----------+
|   |     A     |       B     |  C  |  D  |  E   |      F      |      G       |    H     |
+---+-----------+-------------+-----+-----+------+-------------+--------------+----------+
| 1 | MTOD List Exported as at Monday, 07 October 2019         |              |          |
| 2 |           |             |     |     |      |             |              |          |
| 3 | MTOD      | Title       | Dwg | Man | CDED | Issue Date  | Impl. Date   | Status   |
| 4 | 0101.0700 | Legend      |     |     |      | Apr 1, 1994 | Apr 1, 1994  | Active   |
| 5 | 0202.0310 | Roadway - A | 0   |     |      | Dec 1, 2005 | Dec 21, 2005 | History  |
| 6 | 0202.0310 | Roadway - A | 1   |     |      | Jan 1, 2007 | Mar 15, 2007 | History  |
| 7 | 0202.0310 | Roadway - A | 2   |     |      | May 1, 2009 | Jun 11, 2009 | Obsolete |
| 8 | 0202.0320 | Roadway - D | 0   |     |      | Jan 1, 2007 | Mar 15, 2007 | History  |
+---+-----------+-------------+-----+-----+------+-------------+--------------+----------+

当我检查更新后的工作簿中的唯一条目时,我在excel中输入以下公式:

=COUNTIFS('[MTOD 115450 List.xml]Sheet1'!$A:$A,A4,'[MTOD 115450 List.xml]Sheet1'!$G:$G,"<>"&G4,'[MTOD 115450 List.xml]Sheet1'!$H:$H,H4)

更新后的书中的第4行与示例数据完全相同。表示该条目未更改。我要寻找的是相同的MTOD编号(Col A),不同的展示次数。日期(Col G),相同状态(Col H)

由于第4行是完全匹配项,所以我希望countifs返回0,但它返回1。令我困惑。我把它分解成每个ifs,看我是否能抓住一些东西。我得到以下结果:

Individual Results

  • MTOD值1是其在整列中唯一列出的值。
  • 状态值339与预期的一样,因为列表中有许多活动文档
  • 1048576的IMP消失了。

IMP的值是电子表格中的行数。当我将过滤器应用于该列时,第4行实际上是具有该日期的唯一行。我本可以理解为1048576 -1的计数。当我将<>更改为=时,将得到预期的1。

在进行计数的工作表中,我使用COUNTA(G:G)并获得了1015的答案。

为什么COUNTIFS给出的是IMP DATE的值?

要使完整的COUNTIFS公式计算为0,我需要做什么?

我怀疑这是我将日期字符串转换为excel日期的过程的一部分,并且最终试图将字符串与整数进行比较。如果不是,我会购买它,当我将日期从<>更改为=时,它将返回正确的值1。

当调试我的excelformula时,这一切都引起了我的注意,它以1而不是零返回相同的结果:

SearchCount = Application.WorksheetFunction.CountIfs(Existing.Worksheets("Sheet1").Range("A:A"), varElement.Value, _
                                                    Existing.Worksheets("Sheet1").Columns(ImpCol.Column), "<>" & Source.Worksheets("Sheet1").Cells(varElement.Row, ImpCol.Column).Value, _
                                                    Existing.Worksheets("Sheet1").Columns(StatusCol.Column), "Active")

我的逻辑有缺陷吗?

更新

链接到文件

更新2012年2月2日

我已经修改了程序,现在在打开工作簿时它将日期从字符串转换为序列日期。现在,当我在excel公式中进行计数时,得到正确的结果为0。通过VBA运行它时,得到的结果为1。关于VBA与Excel公式发生了什么的任何想法?

在监视窗口中检查统计条件值时,我注意到的一件事是,监视窗口中的日期为94/04/01,而当我单击单元格时,在公式栏中的日期显示为1994/04 / 01。

VBA手表 VBA Watch

Excel日期 Excel Date

I5中的0是上面的测试COUNTIFS公式的结果,给出了预期的结果。

UPDATE II 20/02/02

所以我只对日期组件做了一些测试。我可以看到问题,但目前不知道解决方法。当您将比较运算符连接到日期时,它会出现,它将其转换为字符串,而不是将其保留为日期。

SearchCount = Application.WorksheetFunction.CountIfs(Existing.Worksheets("Sheet1").Columns(ImpCol.Column), Source.Worksheets("Sheet1").Cells(varElement.Row, ImpCol.Column).Value)

SearchCount将得出1,这是正确的,因为这是该列中的唯一日期。

SearchCount = Application.WorksheetFunction.CountIfs(Existing.Worksheets("Sheet1").Columns(ImpCol.Column), "=" & Source.Worksheets("Sheet1").Cells(varElement.Row, ImpCol.Column).Value)

SearchCount = 0

SearchCount = Application.WorksheetFunction.CountIfs(Existing.Worksheets("Sheet1").Columns(ImpCol.Column), "<>" & Source.Worksheets("Sheet1").Cells(varElement.Row, ImpCol.Column).Value)

SearchCount = 1048576

那么,如何在<> DATE执行COUNTIFS?我可以将VBA中的DATE更改为其序列日期,并改用它吗?

1 个答案:

答案 0 :(得分:2)

因此,最终的问题是将运算符与日期串联在一起将日期更改为字符串。结果,存储在列中的序列日期不能正确地与字符串进行比较。解决方案是获取显然存储在.value2中的序列日期。 VBA公式更改为:

SearchCount = Application.WorksheetFunction.CountIfs(Existing.Worksheets("Sheet1").Columns(ImpCol.Column), "=" & Source.Worksheets("Sheet1").Cells(varElement.Row, ImpCol.Column).Value2)

or

SearchCount = Application.WorksheetFunction.CountIfs(Existing.Worksheets("Sheet1").Columns(ImpCol.Column), "<>" & Source.Worksheets("Sheet1").Cells(varElement.Row, ImpCol.Column).Value2)

如果您要搜索的列中的日期是excel序列日期而不是文本日期,您最终将获得正确的结果。