2011-10-25 39 views
2

我想写一个VBA函数,它使用SELECT查询从Access表中获取值。下面的代码:“无效使用空值”为vba函数返回变量

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值;我该怎么处理这些空旷的日子?

+3

它看起来像你复制DLookup函数(也可作为一组函数,以t开头而不是d,如tLookup)。你可能不得不使用类似这样的代码:If IsNull(rs.Fields(tableField))Then getTableValue = Null。我建议你也检查一下,确保在这个函数中真正发生错误。你确定你实际上没有回到空值,但在调用函数中处理不当吗?作为一个附注,我认为你需要在测试RecordCount之前移动你的rs.MoveLast和rs.MoveFirst代码来运行。 – HK1

+0

@ HK1,此功能发生错误;我已经对它进行了单独测试。如果我在.recordcount = 0的记录集上调用.MoveLast,我会得到一个错误,所以我必须首先检查recordcount。 – sigil

+0

你应该这样做,而不是:如果不是(rs.BOF和rs.EOF)然后 – HK1

回答

5

事实证明,该函数的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的值类型日期/时间的所以没关系。

0

看一看This Link

变不能保存来自DB返回空VALU。 您必须检查是否为空,并返回vbNull等效(不知道您是否可以在VBA中使用vbNull)。

HTH

+0

实际上,在你发布的链接上,它说:“只有变体可以为空(其他类型会出错)。” – sigil

+0

对不起 - 错过了! –

+0

我的理解是,变体类型变量可以为null。 – HK1

0

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

我想这一点是使用该函数的返回值。要么你总是返回事端,要么你必须检查这个函数的返回值。

我不得不承认我不知道什么是空的日期可能意味着什么。你知道这可能是什么吗?

+0

我有空日期,因为我正在跟踪可能有或没有完成日期的活动。在完成之前,日期字段为空。而我不能使用Nz(),因为我使用DAO从Excel中调用这个函数,它不理解Nz()。 – sigil

+0

正如你所看到的代码在Access中使用。它在那里制作一些有效的日期。您可以使用例如Date loke 1.1.1900作为没有任何内容的指示。无论如何,你必须确保你只是返回有效的日期,或者在你的代码中调用这个函数时检查Null。 – Friedrich

0

我会改变函数返回一个字符串。然后使用nz()通过使字符串为零来处理null。

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

看到我对Friedrich的回答 - 我不能使用'Nz()',因为它是从Excel调用的。 – sigil