使用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
相关产品推荐
相关产品推荐

