2011-03-28 168 views
3

我尝试计算两点之间的距离(给定以十进制格式表示这些点的纬度/经度)。访问VBA:运行时错误'94':无效的空使用

VBA代码:

Const pi = 3.14159265358979 

Function distance(lat1, lon1, lat2, lon2) 
Dim theta, dist 
theta = lon1 - lon2 
dist = Sin(deg2rad(lat1)) * Sin(deg2rad(lat2)) + Cos(deg2rad(lat1)) * Cos(deg2rad(lat2)) * Cos(deg2rad(theta)) 
dist = acos(dist) 
dist = rad2deg(dist) 
distance = (dist * 60 * 1.1515) * 1.609344 
End Function 

Function acos(rad) 
If Abs(rad) <> 1 Then 
acos = pi/2 - Atn(rad/Sqr(1 - rad * rad)) 
ElseIf rad = -1 Then 
acos = pi 
End If 
End Function 

Function deg2rad(deg) 
deg2rad = CDbl(deg * pi/180) 
End Function 

Function rad2deg(rad) 
rad2deg = CDbl(rad * 180/pi) 
End Function 

我也得到错误运行时错误 '94':在该线的无效使用Null “deg2rad = CDbl(度* PI/180)”。 我写了一个查询:

SELECT DISTINCT 

([band].E_laip+([band].E_min*(1/60))+([band].E_sec*(1/3600))) AS Band_E_dec, 
([band2].E_laip+([band2].E_min*(1/60))+([band2].E_sec*(1/3600))) AS Band2_E_dec, 
([band].N_laip+([band].N_min*(1/60))+([band].N_sec*(1/3600))) AS Band_N_dec, 
([band2].N_laip+([band2].N_min*(1/60))+([band2].N_sec*(1/3600))) AS Band2_N_dec, 

distance([Band_N_dec],[Band_E_dec],[Band2_N_dec],[Band2_E_dec]) AS Atstumas 

FROM [band] LEFT JOIN band2 ON [band].Stotis = band2.Stotis; 

也许有人有想法?提前致谢。

回答

2

如果您使用的是LEFT JOIN你允许空值在JOIN编表在没有匹配的行。我猜想您的band表中至少有一条记录,stotis字段的band2中没有匹配的行。

为了找到答案,做了:

SELECT * 
FROM band 
LEFT JOIN band2 
ON [band].Stotis = band2.Stotis 
WHERE band2.stotis IS NULL 

如果你得到任何命中你有一个参考的数据问题。

您的解决方案是使用WHERE Band2.stotis IS NOT NULL执行LEFT JOIN或仅使用相同条件执行INNER JOIN,该条件只会返回两个表中的匹配行。