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

时间:2018-05-04 15:13:59

标签: vba function for-loop foreach access-vba

我有一个函数可以返回给定日期的股票价格。如果返回的值为空,则Do Until循环将日期减1并使用新日期再次调用该函数。一旦达到Do Until条件且未找到价格,价格将设置为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例程)。

到目前为止,我一直在努力使用&#39; For&#39;循环与各种&#39;如果&#39;声明以正确的方式传递参数但没有一个有效。

我最近的尝试以及逻辑可以在下面看到:

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

在迭代2中,将Date2传递给函数,检索价格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 个答案:

答案 0 :(得分:0)

我可能错过了这一点,但您可能只想:

  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