Você está usando (e retornando) um tipo de dados de único . Isso fará com que as funções avaliem de maneira diferente se adotarem um tipo diferente de padrão de dados.
Aqui está uma fórmula longa para calcular a distância entre dois pontos de coordenadas na Terra
=ACOS(COS(RADIANS(90-LAT1)) *COS(RADIANS(90-LAT2)) +SIN(RADIANS(90-LAT1)) *SIN(RADIANS(90-LAT2)) *COS(RADIANS(Long1-Long2))) *6371
Como é um pouco complicado de usar dentro de outras fórmulas, eu escrevi uma função definida pelo usuário para isso.
Function DistXY(Lat1 As Single, Lng1 As Single, Lat2 As Single, Lng2 As Single) As Single
DistXY = WorksheetFunction.Acos(Cos(WorksheetFunction.Radians(90 - Lat1)) * Cos(WorksheetFunction.Radians(90 - Lat2)) + Sin(WorksheetFunction.Radians(90 - Lat1)) * Sin(WorksheetFunction.Radians(90 - Lat2)) * Cos(WorksheetFunction.Radians(Lng1 - Lng2))) * 6371
End function
Como você pode ver, eles são exatamente iguais. Como não há funções Acos ou Radians no VBA, ele até usa o método "worksheetFunction".
Por que quando aplico essa fórmula ao mesmo par de coordenadas XY, obtenho resultados diferentes?
Por exemplo:
De ABC 45.4960674, -73.514446 para XYZ 43.5369, -71.8592
Resultados de DistXY () : 254.313156128
Método de fórmula longa : 254.313268914
Acompanhando o comentário do @raystafarian, alterar todos os tipos para o dobro melhorou a precisão. Mas ainda há uma diferença.
Function DistXY(Lat1 As double, Lng1 As double, Lat2 As double, Lng2 As double) As double ...
Novos resultados:
DistXY () : 254.313268913 5060 km
Método de fórmulas longas : 254.313268913 5250 km
Com base na resposta de Raystafarian :
Public Function DistXY(Lat1 As Double, Lng1 As Double, Lat2 As Double, Lng2 As Double) As Double
Dim i As Double, f As Double
Dim wf As WorksheetFunction
Set wf = Application.WorksheetFunction
i = 90
f = 6371
DistXY = wf.Acos(Cos(wf.Radians(i - Lat1)) * Cos(wf.Radians(i - Lat2)) + Sin(wf.Radians(i - Lat1)) * Sin(wf.Radians(i - Lat2)) * Cos(wf.Radians(Lng1 - Lng2))) * f
End Function
Tags microsoft-excel vba