我正在尝试处理由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
是我的查询调用的函数。
答案 0 :(得分:1)
当输入为空时,是什么导致下面的代码返回#Error?
您的查询使用 doubLat()函数:
Function doubLat(ByVal latIn As String) As Double
如果在立即窗口会话中使用Null调用该函数,Access将抛出错误#94,"无效使用Null" 。您在函数中包含的错误处理不起作用,因为该函数甚至没有运行。 (顺便说一句,检查IsNull(latIn)
是没有意义的,因为你声明了 latIn As String
...这意味着 latIn 永远不会是空的。)< / p>
当您将该函数用作查询字段表达式并将其赋予Null时,Access只会在查询结果集中显示 #Error 。
当你调用函数时,通过用其他东西(空字符串?)代替Null来避免这个问题......
SELECT doubLat(IIf(YourField Is Null, '', YourField))
或者您可以使用VBA Nz()
功能...
SELECT doubLat(Nz(YourField, ''))