【问题标题】:How to encapsulate IIF and ISNULL call in Access 2010 VBA?如何在 Access 2010 VBA 中封装 IIF 和 ISNULL 调用?
【发布时间】:2012-07-13 07:27:33
【问题描述】:

我经常在我的 Access 2010 数据库中使用以下表达式模式:

IIF(ISNULL(fieldName), Null, myFunction(fieldName))

这里的 myFunction 是一个用户定义的函数,它将 fieldName 的值转换为另一种格式,如果它确实存在的话。

为了减少打字,我尝试定义以下函数:

Function IifIsNull(p AS Variant, v AS Variant) AS Variant
    If IsNull(p) Then IifIsNull = p Else IifIsNull = v
End Function

我应该以下列方式使用它:

IifIsNull(fieldName, myFunction(fieldName))

但它不起作用。当fieldName为Null时,IifIsNull的返回值为#Error,而IifIsNull甚至都没有被调用!

是否可以使用用户定义的函数或系统函数来简化给定的代码模式?

更新:

有几个myFunctions,所有这些函数目前都是强类型的,一个简单的例子如下:

Function RemoveSpace(str AS String) AS String
    For i=1 to Len(str)
        If Mid(str,i,1) <> " " Then RemoveSpace = RemoveSpace + Mid(str,i,1)
    Next
End Function

【问题讨论】:

    标签: ms-access vba isnull iif


    【解决方案1】:

    我假设myFunction(fieldName)fieldName 为空时会引发错误。

    当您调用IifIsNull(fieldName, myFunction(fieldName)) 时,首先得到评估的是myFunction(fieldName)。因此,如果fieldName 为空,则会出现错误。

    【讨论】:

    • 你说的是#Error的原因,我的问题不是原因,而是解决方案。
    • 我想一个智者曾经说过这样的话:了解原因,然后寻求解决方案。或者它是一个幸运饼干......无论如何,它是有道理的,不是吗。
    【解决方案2】:

    为什么不简单地评估 MyFunction 中的字段名?

    将一个空字符串附加到字段名称以确保它始终传递一个字符串,而不是空值。

    =MyFunction(FieldName & "")
    
    Function MyFunction(Fieldname) As Variant
       ''Depending on what your function does, it is may not necessary to check
       If FieldName<>"" Then
           MyFunction = FieldName & " was here"
       End If
    End Function
    

    【讨论】:

    • 这里的重点是MyFunction 是强类型的,比如Function MyFunction(fildName AS String) As String。还有一些这样的功能,所以很难全部改变。
    • 在这种情况下,传递一个字符串。我会添加一个注释。
    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多