【问题标题】:how do i pass parameters into function in vba如何将参数传递给vba中的函数
【发布时间】:2021-10-13 08:15:53
【问题描述】:

如题,我用VBA写了一个函数,但是参数没有传入函数。 这是我的代码:

enter image description here

非常感谢你

    Function Solar_altitude_angle() As Single
    'Declare
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

    'Equation time

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 'oE Greenwich
LST = ThisWorkbook.Worksheets("Room_Load").Range("H62")

i_SolarDeclination = 23.45 * Sin((n + 284) / 365 * 2 * 3.14159)

s_Gama = ((n - 1) / 365) * 2 * 3.14159
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(Longtitude) * Cos(i_SolarDeclination) * Cos(H) + _
                        Sin(Longtitude) * Sin(i_SolarDeclination))) * 180 / 3.1412
                        
End Function

如上图,在watches窗口中显示变量无效。

【问题讨论】:

  • @KostasK。谢谢,这里是代码
  • 该函数不接受任何参数Solar_altitude_angle()。您需要在括号 () 之间声明它们。
  • 例如Solar_altitude_angle(ByVal someValue as Long, ByVal anotherValue as String, [...]) As Single
  • 如果你想一想,...... 它不起作用, 单独,没有任何关于你实际做了什么的澄清描述,现在没有工作,比较没用。所以,请编辑您的问题并说明您究竟尝试了什么,以及您对它不起作用, 的确切含义

标签: vba parameter-passing


【解决方案1】:

我猜你想将Room_Load 的范围传递给你的函数。
除了让它工作之外,没有考虑参数类型应该是什么 - 我必须将 n 从单个更改为日期,以便 DateDiff 可以计算。

每个要传递的参数都用在函数名中。

Public Function Solar_altitude_angle(n As Date, Longtitude As Single, Latitude As Single, _
                                     Altitude As Single, LST As Single) As Single

    Dim n1 As Integer
    n1 = DateDiff("d", DateSerial(Year(Date), 1, 1), n)
    
    Dim LSM As Integer
    LSM = 105

    Dim i_SolarDeclination As Single
    i_SolarDeclination = 23.45 * Sin((n + 284) / 365 * 2 * 3.14159)
    
    Dim s_Gama As Single
    s_Gama = ((n - 1) / 365) * 2 * 3.14159
    
    Dim ET As Single
    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))
       
    Dim AST As Single
    AST = LST * 24 + ET / 60 + (Longtitude - LSM) / 15
    
    Dim H As Single
    H = 15 * (AST - 12)
    
    Solar_altitude_angle = (Application.Asin(Cos(Longtitude) * Cos(i_SolarDeclination) * Cos(H) + _
                            Sin(Longtitude) * Sin(i_SolarDeclination))) * 180 / 3.1412

End Function

然后可以使用以下方式从 VBA 中调用它:

Sub Test()

    Dim MyResult As Single
    MyResult = Solar_altitude_angle(ThisWorkbook.Worksheets("Room_Load").Range("D62"), _
                                    ThisWorkbook.Worksheets("Room_Load").Range("E61"), _
                                    ThisWorkbook.Worksheets("Room_Load").Range("B61"), _
                                    ThisWorkbook.Worksheets("Room_Load").Range("G61"), _
                                    ThisWorkbook.Worksheets("Room_Load").Range("H62"))
                                

End Sub

或作为工作表函数:

=Solar_altitude_angle(Room_Load!D62,Room_Load!E61, Room_Load!B61, Room_Load!G61, Room_Load!H62)

=Solar_altitude_angle(D62,E61, B61,G61, H62)

【讨论】:

  • 谢谢,现在我遇到了麻烦。我做了一个函数,参数传递函数ok。但是我在函数体中声明的每个变量总是以数字类型返回值 0 或以字符串类型返回空值。但是,我在立即窗口中检查了代码返回正确的结果。怎么了?以及如何解决?
  • 你在正文中声明的变量是什么?您作为函数参数传递的那些不应在主体中声明 - 它们在函数名称中声明。
猜你喜欢
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
相关资源
最近更新 更多