Access-VBA非错误值显示为#Error

时间:2015-05-27 16:02:22

标签: vba ms-access access-vba

我正在尝试处理由Access数据库中的空白字段引起的错误。我有一个函数,它接受Latitude字段的值,将其解析为另一种格式(从DMS到十进制),并在查询中用作新字段。只要Latitude包含有效的DMS值,就可以按预期工作。但是,如果没有,则新字段(decLat)将包含#Error

从我的读数来看,这通常是由错误本身传递的值引起的。但是,在函数本身中使用IsError(doubLat)进行测试表明没有输出是错误。

我的下一次尝试是检查输出是否为0(因为转换函数是为了在发生错误时返回),但这似乎也不是问题。所以问题是,当输入为空时,是什么导致下面的代码返回#Error

Function LatToDecimal(latIn As Variant) As String 'latIn is Variant as attempt at error handling. Will always be String or Null.
    On Error GoTo ErrHandler
    If (latIn = "") Then
        GoTo ErrHandler
    ElseIf (IsNull(latIn)) Then GoTo ErrHandler
    End If
Restart:
    Dim SplitA() As String
    SplitA() = Split(latIn, "°") 'A(0) is DEG.
    Dim SplitB() As String
    If (UBound(SplitA) > 0) Then
        SplitB() = Split(SplitA(1), "'") 'B(0) is MIN.
    Else:
        LatToDecimal = "0"
        Exit Function
    End If
    Dim SplitC() As String
    If (UBound(SplitB) > 0) Then
        SplitC() = Split(SplitB(1), """") 'C(0) is SEC. C(1) is N/S.
    Else:
        LatToDecimal = "0"
        Exit Function
    End If
    Dim deg As Double
    Dim min As Double
    Dim sec As Double

    deg = CDbl(SplitA(0)) 'Assign more readable names.
    min = CDbl(SplitB(0))
    sec = CDbl(SplitC(0))

    Dim minM As Double 'Transitional value.
    Dim decDeg As Double 'decimal degrees

    'Conversion to decimal
    minM = min + (sec / 60)
    decDeg = deg + (minM / 60)
    If (SplitC(1) = "S") Then decDec = decDeg * -1

    'Return value
    LatToDecimal = decDeg
    GoTo Finished

ErrHandler:
    latIn = "0°0'0"""
    MsgBox ("Error!")
    GoTo Restart
Finished:
End Function

'Wrapper to convert decimal latitude (from LatToDecimal) into Double values. Still need one for longitude.
Function doubLat(ByVal latIn As String) As Double
    Dim newLat As Double
    newLat = CDbl(LatToDecimal(latIn))
    doubLat = newLat
    If (doubLat = 0) Then doubLat = 0#
End Function

函数doubLat是我的查询调用的函数。

1 个答案:

答案 0 :(得分:1)

  

当输入为空时,是什么导致下面的代码返回#Error?

您的查询使用 doubLat()函数:

Function doubLat(ByVal latIn As String) As Double

如果在立即窗口会话中使用Null调用该函数,Access将抛出错误#94,&#34;无效使用Null&#34; 。您在函数中包含的错误处理不起作用,因为该函数甚至没有运行。 (顺便说一句,检查IsNull(latIn)是没有意义的,因为你声明了 latIn As String ...这意味着 latIn 永远不会是空的。)< / p>

当您将该函数用作查询字段表达式并将其赋予Null时,Access只会在查询结果集中显示 #Error

当你调用函数时,通过用其他东西(空字符串?)代替Null来避免这个问题......

SELECT doubLat(IIf(YourField Is Null, '', YourField))

或者您可以使用VBA Nz()功能...

SELECT doubLat(Nz(YourField, ''))