我将以下数据全部存储为文本,默认情况下为单元格格式。
=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,看我是否能抓住一些东西。我得到以下结果:
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")
我的逻辑有缺陷吗?
链接到文件
我已经修改了程序,现在在打开工作簿时它将日期从字符串转换为序列日期。现在,当我在excel公式中进行计数时,得到正确的结果为0。通过VBA运行它时,得到的结果为1。关于VBA与Excel公式发生了什么的任何想法?
在监视窗口中检查统计条件值时,我注意到的一件事是,监视窗口中的日期为94/04/01,而当我单击单元格时,在公式栏中的日期显示为1994/04 / 01。
I5中的0是上面的测试COUNTIFS公式的结果,给出了预期的结果。
所以我只对日期组件做了一些测试。我可以看到问题,但目前不知道解决方法。当您将比较运算符连接到日期时,它会出现,它将其转换为字符串,而不是将其保留为日期。
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更改为其序列日期,并改用它吗?
答案 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序列日期而不是文本日期,您最终将获得正确的结果。