【问题标题】:Access-VBA: Empty result for missing values in function?Access-VBA:函数中缺失值的空结果?
【发布时间】:2020-07-14 05:17:50
【问题描述】:

我有一个问题可能有一个非常简单的答案,但我还没有找到解决方案。 这是一个例子:

Public Function abc(var_1 As Variant) As Single
abc = 2 * var_1
End Function

我想在 Access 查询中调用该函数。 'var_1' 的值来自数字(单个)数据字段。 问题: var_1 的某些值是空的/缺失。对于这些值,我也需要函数的结果为空,但现在它们是“0”。

我已经尝试了很多东西,但没有任何效果。空值的结果始终为 '0' 而不是空的。这是一个尝试:

If IsNull(var_1) Then
        abc = Empty
        Exit Function
End If

没用。

对于这个问题的任何帮助将不胜感激。 :)

编辑:

感谢您的回答。我之前尝试过返回一个变体,但它确实返回了空字段。但是,计算字段需要表现得像数字而不是文本,所以这个解决方案对我不起作用。 我最终使用了 Beth 的答案,尽管这比我想要的要多。 ;) 在 SQL 中调用函数:

IIF(IsNull(X)=False;abc(X))

VBA 中的 abc:

Public Function abc(var_1 As Single) As Single
abc = 2 * var_1
End Function

【问题讨论】:

  • 您从函数返回 Single,而不是 Variant。除非您返回 Variant,否则您不会获得 Empty 值。
  • 值得注意的是empty null。通常在数据库设置中,您会使用 Null 而不是 Empty。

标签: vba ms-access


【解决方案1】:

将函数更改为如下所示。

Public Function abc(var_1 As Variant) As Variant
    If IsNumeric(var_1) Then
        abc = 2 * var_1
    Else
        abc = Null
    End If
End Function

我不相信你可以像你试图做的那样返回一个空值。

【讨论】:

  • 这段代码可能会导致一些副作用。感谢 Null Propagation 2*Null=Null 的奇迹。因此,您无需测试 null 即可返回 null。但是,您不是在这里测试 null,而是在测试算术。因此,如果出现非数字字符串值,您会得到 null 而不是通常的错误。这具有抑制会导致检测(和可能的恢复)“脏数据”的错误的效果。实际上,您需要做的就是确保您使用的是可为空的类型。我不会打扰 IsNumeric 测试。只是我的 2¢:) +1 为可空类型。
  • 那么,你会不会直接写成abc = 2 * var_1而不用担心测试?
【解决方案2】:

或在比函数更高的级别测试 null,尽管您必须在调用函数的任何地方都这样做

【讨论】:

  • 抱歉,Beth,我刚刚注意到我只能接受一个答案作为正确答案。我选择了 Buggabill 的那个,因为它可能更适合其他有同样问题的人。
猜你喜欢
  • 2011-12-24
  • 1970-01-01
  • 2012-04-08
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多