我正在调试由Microsoft Access中的前同事制作的程序。该程序今天突然停止工作,这行代码似乎导致崩溃。 (出现的错误代码是3646,也就是数据类型不匹配)。我没有VB和SQL的经验,所以我不确定它的含义。
NewIndexNumber = Nz(DMax("Mid$([IndexNumbers],5,3)", "QYearOtherRecordList2"), "000")
特别是,我不确定“Mid $([IndexNumbers],5,3)”应该做什么。我不知道美元符号的含义。顺便说一下,索引号只是“018374”之类的数字串。
当其他2个答案陈述时,$
函数上的Mid
强制它期望一个字符串输入参数并返回一个字符串值。命令Mid$([IndexNumbers],5,3)
的那部分的有效含义是它将返回IndexNumbers
列的字符5到7。
但是,该行代码(这是您的问题的标题)的全部含义如下:
根据该行代码,您的数据库(可能是查询)中有一个名为QYearOtherRecordList2
的查询或表。该代码正在针对该查询发出DMax函数调用,该函数将返回该查询的IndexNumbers
列的字符5到7的“最大字符串值”(使用Mid$函数)。
'Example output sample
'Lets assume that the query, with the Mid$ function applied returns the following rows
001
034
555
142
099
'Then, the DMax function would return just the following as the Max of those values
555
最后,为了确保NewIndexNumber
包含可用值,DMax
包含在Nz函数调用中,这意味着如果由于某种原因DMax
返回Null
值(即,没有记录从您的查询返回,或者没有现有的IndexNumbers
值大于4个字符)然后我们返回值“000”,这样NewIndexNumber
将包含一些有用的东西。
基于我为尝试复制您的错误而执行的一些快速测试,我怀疑可能QYearOtherRecordList2
查询可能已更改(或者可能在此语句之前还有其他代码影响QYearOtherRecordList2
的结果)这是真正的原因。你的错误3464 - Data type mismatch in criteria expression.
顺便说一句 - 在您的评论中,您提到了该消息的正确错误编号,并且在您更新的帖子中,您输入了错误号码。但在这两种情况下,您都会截断错误消息,这是您在寻求帮助时不应该做的事情。消息in criteria expression
的最后一部分实际上对于理解问题的位置以及如何调试此问题非常重要。
消息的那一部分指出错误实际上在criteria
中也可能被称为where
条款或条件的可能性。这就是为什么我认为该问题与发生错误的代码行间接相关。这行代码没有任何根本性的错误,但是这行代码确实依赖于QYearOtherRecordList2
查询成功返回没有错误的数据集。
因此,请在将来准确地包含错误编号和完整错误消息文本以帮助我们。
谢谢。
Mid$(Something, 5, 3)
从字符串Something返回3个字符,从第5位开始。
例如。 ?Mid$("1234567890", 5, 3)
返回567
。
此代码似乎从前一个索引号开始使用字符5到7,如果是Null
,则返回三个零。
它类似于Mid()
函数:
https://docs.microsoft.com/en-us/office/vba/Language/Reference/User-Interface-Help/mid-function
Mid$()
函数总是返回一个字符串,只对字符串有效,而Mid()
也适用于Variants。