VBA如何向函数传入参数?自定义函数传参失败、监视窗口变量无效
问题原因及解决方案
1. 「参数无法传入」问题
你当前定义的函数无任何输入参数,所有取值逻辑都是硬编码读取Room_Load工作表的固定单元格,没有预留外部传参的入口。如果需要外部传入参数,需要先修改函数声明,示例如下:
' 带输入参数的函数定义示例 Function Solar_altitude_angle(n As Integer, Longtitude As Single, Latitude As Single, LST As Single) As Single
然后删除函数内部读取固定单元格的对应赋值语句即可。
2. 「监视窗口变量无效」问题
该问题是触发断点的时机不对导致的:
- 如果你直接在工作表单元格调用该自定义函数,VBA默认不会进入调试断点
- 你可以在函数第一行代码处按F9添加断点,再写一段测试Sub调用该函数,运行后就能正常查看变量值:
Sub 测试函数() ' 运行这段代码即可触发函数断点,正常查看监视变量 MsgBox Solar_altitude_angle() End Sub
3. 隐藏逻辑错误修正
- VBA内置的
Sin/Cos三角函数仅接受弧度值作为输入,你原代码直接传入角度值会导致计算结果错误,需要先做角度转弧度处理 - 原代码的太阳高度角计算公式误用经度代替纬度计算,也会导致结果完全错误
- 可以添加
Application.Volatile True让工作表调用函数时随引用单元格自动重算
修正后的完整代码示例
Function Solar_altitude_angle() As Single Application.Volatile True ' 工作表调用时自动重算 '变量声明 Dim n As Integer Dim Longtitude As Single Dim Latitude As Single Dim Altitude As Single Dim LSM As Integer Dim LST As Single Dim ET As Single Dim H As Single Dim AST As Single Dim i_SolarDeclination As Single Dim s_Gama As Single Const PI As Single = 3.14159265358979 '读取单元格数值 n = DateDiff("d", "01/01/2021", ThisWorkbook.Worksheets("Room_Load").Range("D62")) Longtitude = ThisWorkbook.Worksheets("Room_Load").Range("E61") Latitude = ThisWorkbook.Worksheets("Room_Load").Range("B61") Altitude = ThisWorkbook.Worksheets("Room_Load").Range("G61") LSM = 105 '东八区标准经度 LST = ThisWorkbook.Worksheets("Room_Load").Range("H62") '赤纬角计算 i_SolarDeclination = 23.45 * Sin((n + 284) / 365 * 2 * PI) '均时差计算 s_Gama = ((n - 1) / 365) * 2 * PI ET = 2.2918 * (0.0075 _ + 0.1868 * Cos(s_Gama) _ - 3.2077 * Sin(s_Gama) _ - 1.4615 * Cos(2 * s_Gama) _ - 4.089 * Sin(2 * s_Gama)) '真太阳时计算 AST = LST * 24 + ET / 60 + (Longtitude - LSM) / 15 H = 15 * (AST - 12) '太阳高度角计算:角度转弧度后再代入三角函数,修正经度误用为纬度的错误 Solar_altitude_angle = (Application.Asin(Cos(Latitude * PI / 180) * Cos(i_SolarDeclination * PI / 180) * Cos(H * PI / 180) + _ Sin(Latitude * PI / 180) * Sin(i_SolarDeclination * PI / 180))) * 180 / PI End Function
内容的提问来源于stack exchange,提问作者iatnart
相关产品推荐
相关产品推荐

