【问题标题】:Understanding data types了解数据类型
【发布时间】:2018-02-09 21:53:47
【问题描述】:

第一次发帖! 我正在努力解决编写宏 VBA 函数以在 Microsoft Excel 中使用的一个非常基本的方面。

我正在尝试构建的函数将采用两组坐标并找到它们之间的距离。我已经能够输入我需要的公式并得到我想要的答案,但是因为这个公式是计算地球曲率周围的距离,所以公式很长,需要针对每个新情况手动更改。 所以我尝试创建一个新的宏函数来存储公式并简单地将四个相关坐标点作为变量。但是,当我尝试使用新功能时,现在出现 #VALUE 错误。

我一直使用的公式是:

=(3280.84*(6371 *(2*ATAN2(SQRT(1-(SIN(ABS(目的地纬度-起始纬度)*PI()/180) /2)^2+COS(原纬度 *PI()/180)*COS(目的地纬度 *PI()/180)*SIN(ABS(目的地经度-原点 经度)*PI()/180/2)^2)),SQRT((SIN(ABS(目的地) 纬度-原纬度)*PI()/180/2)^2+COS(原纬度 *PI()/180)*COS(目的地纬度 *PI()/180)*SIN(ABS(目的地经度-起始经度 )*PI()/180/2)^2))))))

这给了我以美国英尺为单位的距离。

我试图在下面的 Excel VBA 窗口中将其转换为更简单的函数:

Public Function LatLngDistance(Lat1 As Single, Lng1 As Single, Lat2 As Single, 
Lng2 As Single)

LatLngDistance = (3280.84 * (6371 * (2 * Application.Atan2(Application.SQRT(1 - (Application.Sin(Abs(Lat1 - Lat2) * Application.Pi() / 180 / 2) ^ 2 + Application.Cos(Lat2 * Application.Pi() / 180) * Application.Cos(Lat1 * Application.Pi() / 180) * Application.Sin(Abs(Lng1 - Lng2) * Application.Pi() / 180 / 2) ^ 2)), Application.SQRT(Application.Sin(Abs(Lat1 - Lat2) * Application.Pi() / 180 / 2) ^ 2 + Application.Cos(Lat2 * Application.Pi() / 180) * Application.Cos(Lat1 * Application.Pi() / 180) * Application.Sin(Abs(Lng1 - Lng2) * Application.Pi() / 180 / 2) ^ 2)))))

End Function

因为我在尝试使用此函数时收到 #VALUE 错误,所以我相信我的错误是错误地将四个变量标记为错误的数据类型。

【问题讨论】:

  • 尝试从 VBA Sub 而不是从工作表调用您的函数 - 这样您将收到有用的错误消息,而不仅仅是#VALUE
  • 我强烈建议将该函数拆分为单独的行,您能看懂吗?
  • 别忘了地球并不是真正的圆!
  • 你能提供一个示例经纬度对吗?

标签: vba excel


【解决方案1】:

Application.CosApplication.SinApplication.SQRT 在 VBA 中不起作用。像这样使用内置的 VBA 函数

LatLngDistance = (3280.84 * (6371 * (2 * Application.Atan2(Sqr(1 - (Sin(Abs(Lat1 - Lat2) * Application.Pi() / 180 / 2) ^ 2 + Cos(Lat2 * Application.Pi() / 180) * Cos(Lat1 * Application.Pi() / 180) * Sin(Abs(Lng1 - Lng2) * Application.Pi() / 180 / 2) ^ 2)), Sqr(Sin(Abs(Lat1 - Lat2) * Application.Pi() / 180 / 2) ^ 2 + Cos(Lat2 * Application.Pi() / 180) * Cos(Lat1 * Application.Pi() / 180) * Sin(Abs(Lng1 - Lng2) * Application.Pi() / 180 / 2) ^ 2)))))

【讨论】:

  • 正确。另请注意,OP 的代码在公式顶部有一个返回字符(可能不是问题)并使用 Sqrt 而不是更正的 SQR 语法
  • 另请注意,使用Single 数据类型会降低 Excel Reals 的准确性。应该使用Double
猜你喜欢
  • 2014-03-09
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
相关资源
最近更新 更多