【Excel】公式报错#VALUE! 解决问题的过程好抓马

我不明白呀!!!

在研究考勤表的统计,需要将两个考勤机的数据合并,判断是否打卡以及打卡时间是否早于8:30。为此写了一个逻辑绝对正确的公式,结果却报#VALUE!

给你们看我的思路

我照着思路写出来的代码:

vbnet 复制代码
=IF(LEN(LEFT(INDEX(一号!$B$1:$AD$479,$R2,D$1),5))=1,
	IF(LEN(LEFT(INDEX(二号!$B$1:$AD$479,$R2,D$1),5))=1,
		"未签到",
		IF(LEFT(INDEX(二号!$B$1:$AD$479,$R2,D$1),5)-"8:30"<0,
			"签到",
			"迟到"
		)
	),
	IF(LEN(LEFT(INDEX(二号!$B$1:$AD$479,$R2,D$1),5))=1,
		IF(LEFT(INDEX(一号!$B$1:$AD$479,$R2,D$1),5)-"8:30"<0,
			"签到",
			"迟到"
		),
		IF(OR(
				LEFT(INDEX(一号!$B$1:$AD$479,$R2,D$1),5)-"8:30"<0,
				LEFT(INDEX(二号!$B$1:$AD$479,$R2,D$1),5)-"8:30"<0
				),
			"签到",
			"迟到"
			)
		)
	)

神奇的是,公式按步骤计算的每一步都没有报错,这里贴一下最后一步的截图:

万幸的是我找到了症结,其中一个公式的结果会导致#VALUE!出现。

vbnet 复制代码
'错误代码
=IF(LEFT(INDEX(一号!$B$1:$AD$479,$R2,D$1),5)-"8:30"<0,"签到","迟到")

毫无疑问,问题只能出现在LEFT(INDEX(赤峰!B1:AD479,R2,D1),5)-"8:30"<0这部分。

于是,我重新找了空格子手敲了这部分,没有问题,手敲了错误代码,正常显示。

多么诡异的一幕,我的眼睛看不出来啦,这到底哪里不一样?

vbnet 复制代码
'结果报错代码
=IF(LEFT(INDEX(一号!$B$1:$AD$479,$R2,D$1),5)-"8:30"<0,"签到","迟到")
'结果正常代码
=IF(LEFT(INDEX(二号!$B$1:$AD$479,$R2,D$1),5)-"8:30"<0,"签到","迟到")

原来的大公式里包含4个这样的公式部分,一个显示#VALUE!,一个正常显示,还有两个放在一个or函数里,是这么显示的。

多么抽象呀,我虽然不知道为什么错了,但我知道我只要把它重新书写一遍,就会没问题。

我错了!!!

重写一遍并没有用,**因为当获取的值为空时,取从左数5位字符(left函数)时,就埋下了错误的种子。**但令人不解的是公式的每一步计算都如我预期般显示应该的结果,只有到最后才会显示#VALUE!

left(0,5)的值是"0",空值里取出了数,而后续"0"-"8:30"的操作是正常的,但因为存在错误,不管后续结果如何,都会报错

于是我加了IFERROR套壳,期望错误发生的时候及时止步。真相却是公式计算的时候仍然无误,而结局总逃不过那个#VALUE!

原来如此!!!

我明白是书写的公式逻辑出现了问题,于是我重新梳理之后,诞生了正确的思路、正确的公式和正确的结果。

前面提到公式报错的症结在于做时间减法时出现了错误,所以得到的结果除了IF预设的两个真假对应的结果外,还有一个#VALUE!,基于此在IF外套壳IFERROR,可以有效将#VALUE!显示为第三种对应的结果。

这样,就人为地设置三种对应的结果,设未打卡状态为0,8:30以内打卡状态为1,8:30以外打卡状态为3,分别对两个打卡机进行判断。最后将它们的数据合并。两个打卡机只要有一个打卡就算打卡,所以未签到状态只能是0+0,而签到(8:30以内打卡)状态只能为0+1、1+0、1+1,介于1~2,迟到(8:30以外打卡)状态只能为3+0、3+1、0+3、1+3、3+3,介于3~6。

vbnet 复制代码
=IFS(
	IFERROR(
		IF(
			LEFT(
				INDEX(二号!$B$1:$AD$479,$R2,D$1),5
				)-"8:30"<0,
			1,
			3
			),
		0)
	+
	IFERROR(
		IF(
			LEFT(
				INDEX(一号!$B$1:$AD$479,$R2,D$1),5
				)-"8:30"<0,
			1,
			3),
		0)
	>2,
	"迟到",
	IFERROR(IF(LEFT(INDEX(二号!$B$1:$AD$479,$R2,D$1),5)-"8:30"<0,1,3),0)+IFERROR(IF(LEFT(INDEX(一号!$B$1:$AD$479,$R2,D$1),5)-"8:30"<0,1,3),0)
	>0,
	"签到",
	IFERROR(IF(LEFT(INDEX(二号!$B$1:$AD$479,$R2,D$1),5)-"8:30"<0,1,3),0)+IFERROR(IF(LEFT(INDEX(一号!$B$1:$AD$479,$R2,D$1),5)-"8:30"<0,1,3),0)
	=0,
	"未签到"
	)
相关推荐
CodeCraft Studio15 小时前
Excel处理控件Aspose.Cells教程:使用 Python 将 Pandas DataFrame 转换为 Excel
python·json·excel·pandas·csv·aspose·dataframe
星空的资源小屋19 小时前
PPTist,一个完全免费的 AI 生成 PPT 在线网站
人工智能·python·电脑·excel
开开心心_Every19 小时前
免费语音合成工具:66种音色随心选
人工智能·面试·java-ee·计算机外设·电脑·maven·excel
偷心伊普西隆2 天前
EXCEL VBA 清空Excel工作表(Sheet)的方法
microsoft·excel
Coding_Doggy2 天前
苍穹外卖Day12 | Apache POI、导出Excel报表、HttpServletResponse、工作台
excel
l1t2 天前
张泽鹏先生手搓的纯ANSI处理UTF-8与美团龙猫调用expat库读取Excel xml对比测试
xml·人工智能·excel·utf8·expat
Source.Liu3 天前
【Python自动化】 21 Pandas Excel 操作完整指南
python·excel·pandas
会飞的小菠菜3 天前
如何根据Excel数据表生成多个合同、工作证、录取通知书等word文件?
word·excel·模板·数据表·生成文件
Access开发易登软件3 天前
Access开发导出PDF的N种姿势,你get了吗?
后端·低代码·pdf·excel·vba·access·access开发
課代表3 天前
VBA 中的 Excel 工作表函数
excel·vba·函数·对象·属性·range·静态变量