代码之家  ›  专栏  ›  技术社区  ›  pirloe

VBA将多个参数传递到for循环中的函数中

  •  0
  • pirloe  · 技术社区  · 6 年前

    我有一个函数,它返回给定日期的股票价格。如果返回的值为空,则Do-Until循环将日期减少1,并使用新日期再次调用该函数。一旦满足条件且未找到价格,则价格设置为0。

    下面的代码片段说明了此代码的工作版本的工作方式:

    Dim Date1 As Date
    Dim r As Variant
    Dim Price1 As Variant
    Dim arg1 As Variant
    Dim arg2 As Variant
    Dim counter As Integer
    
    r = Function1(arg1, arg2, Date1, Date1)
    Price1 = r(0, 0)
    Do Until IsEmpty(Price1) = False And counter <= 10
        Date1 = Date1 - 1
        counter = counter + 1
        r = Function1(arg1, arg2, Date1, Date1)
        Price1 = r(0, 0)
        If counter = 10 Then
            Price1 = 0
        End If
    Loop
    

    现在,我正在尝试重新创建此代码,以便我可以在其中传递两个日期,并为各自的日期检索两个不同的价格(在结果为空的情况下,还经历了Do-Until例程)。

    到目前为止,我一直在尝试使用“For”循环和各种“If”语句以正确的方式传递参数,但没有一个有效。

    我的最新尝试以及逻辑如下所示:

    在迭代1中,将Date1传递给函数,检索Price 1并将其分配给变量PriceT。

    在迭代2中,将Date2传递给函数,检索Price 2并将其分配给变量PriceTX,然后退出循环。

    Dim Dates(0 To 1) As Date
    Dim Count As Integer
    Dim counter, PriceT, PriceTX, arg1, arg2, x, y, j As Variant
    
    For Count = 1 To 2
        If Count = 1 Then j = Date1 Else j = Date2
        x = Function1(arg1, arg2, j, j)
        y = x(0,0)
        Do Until IsEmpty(y) = False And counter <= 10
            j = j - 1
            counter = counter + 1
            x = Function1(arg1, arg2, j, j)
            y = x(0, 0)
            If counter = 10 Then
                y = 0
            End If
        Loop
        If Count = 1 Then y = PriceT Else y = PriceTX
    Next
    

    我想提及的是,我正在寻求一种简洁且高度优化的解决方案,我正在努力避免将工作代码复制两次,并将行数增加一倍(尽管我知道这会像我已经尝试过的那样有效)

    我真的不明白还有什么别的办法。如有任何建议,将不胜感激。

    1 回复  |  直到 4 年前
        1
  •  1
  •   dcromley    6 年前

    我可能没有抓住要点,但你可能只是想:

      PriceT = func1(Date1)
      PriceTX = func1(Date2)
    
    Function func1(j As Date) As Variant
      x = Function1(arg1, arg2, j, j)
      y = x(0, 0)
      Do Until IsEmpty(y) = False And counter <= 10
        j = j - 1
        counter = counter + 1
        x = Function1(arg1, arg2, j, j)
        y = x(0, 0)
        If counter = 10 Then
          y = 0
        End If
      Loop
      func1 = y
    End Function