MS Access 2010 VBA

问题描述:

我有下面的公式,但公式的AND部分未被识别。任何人都可以看看并提供适当的版本?MS Access 2010 VBA

If DCount("*", "AssetTagTable", "SerialNumber='" & Me.SerialNumber & "'") > 6 Or _ 
     DCount("*", "AssetTagTable", "SerialNumber='" & Me.SerialNumber & "' And _ 
     [DMax P/N]='" & DLookup("[DMS P/N]", "InventoryList", "Category In('PC','Terminal')") & "'") > 3 Then 

If DCount("*", "AssetTagTable", "SerialNumber='" & Me.SerialNumber & "'") > 6 Or _ 
     DCount("*", "AssetTagTable", "SerialNumber='" & Me.SerialNumber & "' And " _ 
     " [DMax P/N]='" & DLookup("[DMS P/N]", "InventoryList", "Category In('PC','Terminal')") & "'") > 3 Then 

我没有VBA打开了,但试试这个,第二行没有正确结束。

+0

我仍然得到一个列表分隔符或)错误 – Ricardo

我得到了这个工作。出于某种原因,它不像下划线在DCount中分隔两个字符串,但如果你将它移动到&之前,那么我不会得到“列表分隔符或)”错误。

  If DCount("*", "AssetTagTable", "SerialNumber='" & Me.SerialNumber & "'") > 6 Or _ 
      DCount("*", "AssetTagTable", "SerialNumber='" & Me.SerialNumber & "' And [DMax P/N]='" _ 
      & DLookup("[DMS P/N]", "InventoryList", "Category In('PC','Terminal')") & "'") > 3 Then 

这是如何工作的?

Ricardo; 您没有提及这是否是表单或报表上的文本框中的公式;或者如果您正在编写VBA代码,则为 。我的回答会对这两种情况会有很大的不同。 通常,当我看到使用旧(Access 2003)函数的人时,它能够将所有内容写入表单中。所以,我会假设情况是这样的。

有几个问题: 1)您正在MS DLookUp函数中使用SQL语法(“Category In()”)作为第三个参数(...“Category In('PC','Terminal') ...) 我没有发现微软支持这种跨语言表达 另外,由MS定义的DLookup函数返回一个值 就像你写的那样,你似乎在问引擎 查看本声明本人复制http://support.microsoft.com/kb/208786: 即使多个记录满足条件,DLookup()函数也会从单个字段返回一个值 如果没有记录满足条件,或者域不包含记录,D Lookup()返回一个Null。

那么,如果你的表达式返回一个空值呢?你的第二个 DCount函数的英文翻译将如下所示: 给我AssetTagTable中的记录数列“SerialNumber”= 1732 AND列“[DMax P/N]”= Null。然后将该记录数与数字3进行比较。 您是否看到此问题?

2)当遇到意想不到的结果时,简化代码并将值分配给变量 或您的案例(比如说文本框)总是一个好主意。 因此,将2个文本框放在您的表单上,并为每个文本赋值。 E.G. 创建文本框2:txtNumRecs,和txtCategory 到TextBox txtNumRecs,分配该值: DCOUNT( “*”, “AssetTagTable”, “的SerialNumber = '” & Me.SerialNumber & “'”)。 对文本框txtCategory,分配此值: 运行您的窗体。运行您的窗体。 第一个文本框的值将代表SerialNumber = Me.SerialNumber的记录数。 您可能会惊讶于第二个文本框中的值。考虑一下对所有记录进行的一般SQL查找,其中类别='PC'或类别='终端'可以返回许多记录。既然我们知道这个函数 只返回1条记录,我们怎么可能知道它会返回哪一个可能的记录呢? 假设它返回类别为'PC'的记录的[DMS P/N]值,但您引用的第一个[DMS P/N]值为类别='终端'的记录。或相反亦然。 您的条件检查的这部分可能永远不会返回True。

如果您确实希望检查InventoryList中Category ='PC'或Category ='Terminal', 的所有记录,并将每个记录的[DMS P/N]值与您的值进行比较,则必须写入一个VBA中的函数或2来处理这个问题。 如果超出了您的代码编写能力,您可以联系我进行专业咨询。