ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > 函数与公式 > 如何判断单元格里的数据类型为日期?

如何判断单元格里的数据类型为日期?

作者:绿色风 分类: 时间:2022-08-17 浏览:231
楼主
syz105729913
Q:如何判断单元格里的数据类型为日期?
A:可用以下公式
  1. =IF(LEFT(CELL("format",A1))="D","日期")
示例文件

Book1.rar
2楼
chrisfang
这个函数判断是有致命缺陷的,即这个函数本质上是对单元格数字格式的判断。如果把一个文本数据的单元格数字格式设置为日期,函数结果是会误判为日期的。
3楼
apolloh
修改一下,应该可以解决方版提出的问题。

  1. =IF(AND(LEFT(CELL("format",A1))="D",N(A1)),"日期")
4楼
chrisfang
同样有问题,非日期的数值依然会被误判,例如小于0的。
5楼
apolloh
=IF(AND(LEFT(CELL("format",A1))="D",N(A1)>0)),"日期")
应还有最大日期的问题。
6楼
toby08
好像还要保证A1的数是大于或等于1这样判断才有意义。
7楼
chrisfang
呵呵,还是有问题。以数字格式判断总归是有缺陷的。比如把一个日期数据自定义格式为为“yyyy年”,判断就会出错了。
8楼
apolloh
必须跳出这个思路

  1. =IF(ISERROR(YEAR(A1)),"非日期","日期")
9楼
chrisfang
从判断日期数据这个角度上来讲,黄版主的这个公式没问题很正确。但恐怕有违发表这个帖子的初衷,这个帖子实际上是希望排除掉单纯显示纯数值的情况,如顶楼附件中A2和A4单元格所示。

这个帖子本意应该是想和VBA函数中的日期数据判断做个类比,还没试过VBA函数到底是怎样进行判断的。
10楼
apolloh
哦,如果是这样,isdate判断A5时应该也是非日期。因为它也是判断单元格的格式是否包含日期格式的元素,而A5是常规格式“G/通用格式”下的日期。所以,孙版的例子也不太合适。
get.cell(7,a1)可以判断日期的具体格式,但如果把自定义格式也包含进来的话,这个判断将会非常冗长。

定义名称Format,用宏表函数获取具体日期格式

  1. Format=GET.CELL(7,Sheet1!$A1)
然后再判断格式中是否包含日期元素Y、M、D,同时需要排除M代表“分”的情况,由于M在代表“分”在时间格式中必须配合H或S使用,所以只需排除H或S格式即可,还要考虑同时包含日期和时间格式的ISDATE的结果也是日期。

  1. =IF(SUM(LEN(Format)-LEN(SUBSTITUTE(Format,{"y","m","d"},"")))*IF(OR(LEN(Format)-LEN(SUBSTITUTE(Format,{"h","s"},""))),LEN(Format)-LEN(SUBSTITUTE(Format,"d","")),1),"日期","其他")



判断日期格式数据.rar
11楼
syz105729913
呀,昨天没来,已经讨论了这么多了,我确实是想用工作表函数来代替VBA中的ISDATE函数
看来没那么简单
12楼
chrisfang
自定义格式可能性非常多,比如对一个数值型数据的单元格自定义格式为 #\y,上面的判断还是会出现误差。

我觉得这个命题本身应该讨论一下,比如到底满足怎样的条件应该属于“日期”?
13楼
gouweicao78
  1. =COUNT((A1>0)*(A1<2958465)*(FIND(CELL("FORMAT",A1),"D1D2D3D4D5"))
CELL函数判断的格式,与日期相关的是D1-D5,D6-D9是时间。
2958465是Excel最大日期9999-12-31

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap