You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用VBA计算日出日落时间结果不准确,求排查问题原因

日出日落时间VBA计算结果偏差排查

问题背景

我通过VBA计算多地点的日出日落时间,已获取日期、地点并匹配对应经纬度,参考算法编写代码微调后能输出结果,但存在明显偏差,需排查问题。

测试参数

日期: 2021/08/20
纬度(Lat): 52
经度(Lon): 5
天顶距(Zenith): 96(民用日落)
计算类型(rise): True(日出)
当前错误结果: 日出UTC时间20:04(对应当地时间22:30)

注:该结果明显不符合北纬52度夏季的日出规律,实际日出时间应远早于该值。

关键问题与修复方案

1. 变量重复使用导致逻辑错误

步骤8中重复使用了变量t,此时t是步骤2计算的近似时间值,直接复用会彻底打乱后续计算逻辑:

' 原错误代码
t = h + ra - 0.06571 * t - 6.622

修复:改用新变量存储本地平均时间:

local_mean_time = h + ra - 0.06571 * t - 6.622
' 后续UTC调整同步修改
ut = md(local_mean_time - lngHour, 24)

2. 自定义反三角函数精度不足

自行实现的Asn(反正弦)和Acs(反余弦)函数存在精度偏差,VBA本身内置了WorksheetFunction.Asin和WorksheetFunction.Acos,直接使用内置函数可避免误差。
修复:删除自定义的Asn、Acs函数,替换代码中对应调用:

' 原代码:cosDec = Cos(Asn(sinDec))
cosDec = Cos(WorksheetFunction.Asin(sinDec))

' 原代码:h = 360 - (1/to_rad)*Acs(coshr)
h = 360 - (1/to_rad)*WorksheetFunction.Acos(coshr)

3. 自定义取模函数可替换为内置函数

自定义md函数的边界处理存在潜在风险,直接使用VBA内置的WorksheetFunction.Mod更可靠:

' 替换所有md调用,例如:
l = WorksheetFunction.Mod(l, 360)
ut = WorksheetFunction.Mod(local_mean_time - lngHour, 24)

修正后测试结果

修复上述问题后,使用给定参数计算得到的日出UTC时间约为4:45,对应当地时间6:45左右,符合北纬52度夏季的实际日出规律。


内容的提问来源于stack exchange,提问作者Jacco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:37:32