访问VBA:DLookUp函数给出类型不匹配错误

时间:2011-07-21 21:38:36

标签: ms-access vba

我正在尝试运行以下代码,但我在DLookUp上遇到“类型不匹配”编译错误。

DLookUp返回一个值,对吗? 对我来说,这段代码说:在strSQL记录集中,查找SKUS_ORDERED列等于curSKU2的位置。 strSQL,temp,curSKU2都被初始化为字符串类型变量。

...
 strSQL = "SELECT * FROM ORDER_DATA WHERE [ORDER]=" & curOrder

 Dim temp As String
 temp = DLookup("SKUS_ORDERED", db.OpenRecordset(strSQL), SKUS_ORDERED = curSKU2)
...

类型不匹配在哪里? 任何人都可以帮助我吗?

编辑:

       ...
        Set fld_orders = rst_orders.Fields("ORDER")
        curOrder = fld_orders.Value

        Dim temp As String
        temp = DLookup("SKUS_ORDERED", "ORDER_DATA", "SKUS_ORDERED = '" & curSKU2 & "' AND [ORDER] = " & curOrder)

        If temp <> Null Then MsgBox temp
       ...

整个代码很长但是这里有一个更大的片段,其中curOrder被初始化,这是一个嵌套循环,curSKU2在循环之前被初始化。希望它有所帮助。

2 个答案:

答案 0 :(得分:5)

发生不匹配是因为第二个参数需要是字符串,而不是RecordSet 如果第三个参数中的任何参数是变量(就像你的情况一样),那么第三个参数也需要是一个连接的字符串:

temp = DLookup("SKUS_ORDERED", "ORDER_DATA", _
            "SKUS_ORDERED = '" & curSKU2 & "' and ORDER = " & curOrder)

编辑:

如果没有更多代码,很难看到你在哪里使用Null 表名和列名是否正确?
你的变量是什么类型的?他们真的有价值吗? 您可以发布更多代码,我们可以看到您如何声明和填充变量吗?

“_”字符表示换行符。我本可以将整个语句写成一行,但是你必须滚动才能完全看到它:

temp = DLookup("SKUS_ORDERED", "ORDER_DATA", "SKUS_ORDERED = '" & curSKU2 & "' and ORDER = " & curOrder)

编辑2:

您能否显示声明两个变量的部分以及curSKU2初始化的部分?根据你发布的内容,仍然无法看到curSKU2是否被填充以及两者都是什么类型。

另外,temp被声明为字符串,因此它永远不会为空 这有两个后果:

  1. If temp <> Null没有意义。
  2. 如果未找到记录,DLookup将返回Null,因此类型不匹配可能位于temp = DLookup(...)行。 请改为temp = Nz(DLookup(...))

答案 1 :(得分:2)

我建议你更改代码的这一部分......

Dim temp As String
temp = DLookup("SKUS_ORDERED", "ORDER_DATA", "SKUS_ORDERED = '" & curSKU2 & "' AND [ORDER] = " & curOrder)

到此......

Dim temp As String
Dim strCriteria As String
strCriteria = "SKUS_ORDERED = '" & curSKU2 & "' AND [ORDER] = " & curOrder
Debug.Print strCriteria
Debug.Print TypeName(DLookup("SKUS_ORDERED", "ORDER_DATA", strCriteria))
temp = DLookup("SKUS_ORDERED", "ORDER_DATA", strCriteria)

如果出现错误,请切换到立即窗口以查看Debug.Print语句的输出。

第一个将为您提供WHERE条件的文本,您可以在新查询中进行测试:

SELECT SKUS_ORDERED FROM ORDER_DATA WHERE [strCriteria text here]

TypeName()函数将告诉您DLookup()返回的值的数据类型。如果TypeName表示Null,则在尝试将其分配给字符串变量(temp)时会出现错误,因为字符串值永远不能为Null。