Sql 在access中设置时间减法格式时遇到问题,同时保留数据类型
好的,我一直在做Access中的减法运算。至少可以说这是一件痛苦的事情,但是由于表单是如何设置的(有人在我开始工作前几年就设置了它&修复它太耗时了),在表单上触发文本框事件后,我无法通过更新查询更新表中的字段 因此,我可以在VBA中进行计算,并将值放入表单的文本框控件中,以便更新到表中。我在网上搜索了如何减去时间,并以我希望的格式显示…(hh:mm),但是这样做会将最终结果转换为字符串,链接到文本框的表格字段是数字/双精度,因此我得到一个VBA错误:“您输入的值对此字段无效” 我知道这是因为它现在是一个字符串。我需要帮助以我需要的方式进行转换,并保留双精度类型。CDbl(变量)不工作 代码:Sql 在access中设置时间减法格式时遇到问题,同时保留数据类型,sql,vba,ms-access,Sql,Vba,Ms Access,好的,我一直在做Access中的减法运算。至少可以说这是一件痛苦的事情,但是由于表单是如何设置的(有人在我开始工作前几年就设置了它&修复它太耗时了),在表单上触发文本框事件后,我无法通过更新查询更新表中的字段 因此,我可以在VBA中进行计算,并将值放入表单的文本框控件中,以便更新到表中。我在网上搜索了如何减去时间,并以我希望的格式显示…(hh:mm),但是这样做会将最终结果转换为字符串,链接到文本框的表格字段是数字/双精度,因此我得到一个VBA错误:“您输入的值对此字段无效” 我知道这是因为它现
apptTime = DLookup("[Appt Time]", "T_PKMS", "[Load] = """ & loadNum & """")
ArrvlTime = DLookup("[Arrival Time]", "T_PKMS", "[Load] = """ & loadNum & """")
hoursPassedSinceAppt = ([Forms]![F_DriverLog].[Time Out].Value - apptTime)
hoursPassedSinceArrvl = ([Forms]![F_DriverLog].[Time Out].Value - ArrvlTime)
Me.Text51.Value = Format(hoursPassedSinceAppt, "hh:nn")
Me.Text53.Value = Format(hoursPassedSinceArrvl, "hh:nn")
我也尝试过:
Debug.Print CDbl(Format(hoursPassedSinceAppt, "hh:nn"))
Debug.Print CDbl(Format(hoursPassedSinceArrvl, "hh:nn"))
但是我得到了一个类型不匹配错误。“救命啊,我正在发疯。显然我盯着代码看得太久了。我删除了“hh:nn”,将冒号改为十进制,并允许cDbl()将其从字符串改为数字 我改变:
Me.Text51.Value = Format(hoursPassedSinceAppt, "hh:nn")
致:
您的文本框是绑定的还是未绑定的?它实际上是将值存储为时间值还是字符串?它绑定到我的表中的一个双类型字段。因此,文本框需要类型为double,但VBA代码正在将其转换为字符串。HoursPassedSinceApp和hoursPassedSinceArrvl是什么数据类型?看起来您正在将它从double转换为string并返回。它们都是double没错,我把它们转换成了一个字符串,以获得我需要的格式(hh:mm),而不是一些18位的十进制数字。但是,因为当我们试图将该变量放回我的文本框以保存在我的表中时,它们是双倍的,所以文本框拒绝了它,因为它是一个字符串。所以我需要将它改回hh:mm格式的双精度类型。我似乎已经弄明白了,见下文。这行不通-5小时59分钟不是5.59小时。我可以建议根本不要使用这种格式吗?因为它们已经是Double数据类型,所以不需要重新格式化它们。如果希望删除日期,则变量仅存储可以执行的时间。Me.Text51.Value=hoursPassedSinceAppt-INT(hoursPassedSinceAppt)@YowE3K我理解你们两人的意思,5小时59分钟不等于5.59分钟,但这是我的雇主要求的格式。我同意这不是显示已用时间的最佳方式,但我只是提供所需的内容。但是,如果“链接到文本框的表格字段是数字/双精度”,则将
5.59
放入表格将放弃所有下游计算,将其视为5小时35.4分钟。确保你的雇主知道这是即将发生的事情。
Me.Text51.Value = CDbl(Format(hoursPassedSinceAppt, "hh.nn"))