返回变体的vba函数的“无效使用null”

Posted

技术标签:

【中文标题】返回变体的vba函数的“无效使用null”【英文标题】:"invalid use of null" for vba function that returns variant 【发布时间】:2011-10-25 15:44:01 【问题描述】:

我正在尝试编写一个 VBA 函数,该函数使用 SELECT 查询从 Access 表中获取值。代码如下:

Function getTableValue(uniqueID As Long, tableName As String, _ 
idField As String, tableField As String) As Variant

Dim db As Database
Dim rs As Recordset
Dim selectSQL As String

selectSQL = "select * from " & tableName & " where " & idField & "=" & uniqueID

Set db = OpenDatabase(dbPath)
Set rs = db.OpenRecordset(selectSQL)

If rs.RecordCount > 0 Then
    rs.MoveLast
    rs.MoveFirst
    getTableValue = rs.Fields(tableField)
End If

End Function

tableField 指定的字段为日期/时间类型且该字段为空时,getTableValue() 返回“无效使用 Null”错误。我认为让函数返回 Variant 可以让我返回 Null 值;我应该怎么处理这些空日期?

【问题讨论】:

看起来你在复制 DLookup 函数(也可以作为一组以 t 而不是 d 开头的函数在线获得,例如 tLookup)。您可能必须改用这样的代码: If IsNull(rs.Fields(tableField)) Then getTableValue = Null。我建议您还检查以确保该函数内部确实发生了错误。您确定您实际上没有返回 Null 值,而是在调用函数中对其进行了错误处理吗?作为旁注,我认为您需要在测试 RecordCount 之前移动 rs.MoveLast 和 rs.MoveFirst 代码以运行。 @HK1, 该函数发生错误;我已经单独测试过了。如果我在 .recordcount=0 的记录集上调用 .MoveLast,我会收到错误消息,因此我必须先检查 recordcount。 你真的应该这样做:If Not (rs.BOF and rs.EOF) Then 所以函数本身运行没有错误;该错误是因为您将函数的返回值分配给日期/时间变量。当函数返回 Null 时,它会窒息。请编辑您的问题以包括这一点。其实我认为这也是答案,也许你应该这样提交。 @hansup,感谢您的建议,答案在下方提交。 【参考方案1】:

事实证明,函数的 Null 值被传递给了日期/时间变量。我已经使用以下方法解决了这个问题:

dim myDate as date
dim myVar as variant

myVar=getTableValue(idNum,"thisTable","idField", "valueField")
if isNull(myVar) then
 myDate=0
else
 myDate=myVar
endif

虽然它不检查myVar 是否返回日期,但valueField 的值是日期/时间类型,所以没关系。

【讨论】:

【参考方案2】:

看看This Link

Variant 不能保存从数据库返回的空值。 您必须检查是否为 null 并返回等效的 vbNull(不知道是否可以在 VBA 中使用 vbNull)。

HTH

【讨论】:

实际上,在您发布的链接上,它说:“只有 Variant 可以为 Null(其他类型会出错。)” 我一直认为变体类型变量可以为空。【参考方案3】:

也许使用 Nz ? getTAbleValue = Nz(rsFields(tableField), SomeReplacementDate)

我猜重点是在使用此函数的返回值时。要么你总是返回正确的东西,要么你必须检查这个函数的返回值。

我不得不承认我不知道 null Date 可能意味着什么。那么你知道那可能是什么吗?

【讨论】:

我有空日期,因为我正在跟踪可能有也可能没有完成日期的活动。在完成之前,日期字段为空。而且我不能使用 Nz(),因为我使用 DAO 从 Excel 调用这个函数,它不理解 Nz()。 如您所见,代码在 Access 中使用。它在那里制作一些有效的日期。您可以使用例如 Date loke 1.1.1900 来指示那里什么都没有。无论如何,您必须确保只返回有效日期,或者在调用此函数的代码中检查 Null。【参考方案4】:

我会更改函数以返回一个字符串。然后使用nz() 将字符串设为零长度来处理null。

getTableValue = nz(rs.Fields(tableField),"")

【讨论】:

查看我对 Friedrich 回答的回复——我不能使用 Nz(),因为它是从 Excel 中调用的。

以上是关于返回变体的vba函数的“无效使用null”的主要内容,如果未能解决你的问题,请参考以下文章

试图解决 VBA 中的“无效使用 Null”

Boost:创建一个返回变体的函数

vba 变体数组错误

VBA:只有在公共对象模块中定义的用户定义类型才能被强制转换为变体或从变体强制转换或传递给后期绑定函数

变体数组自定义函数谷歌表格?以 VBA 为例

VB的所有命令函数呢?非常之感谢!