VBA передает несколько аргументов в функцию для цикла - PullRequest
0 голосов
/ 04 мая 2018

У меня есть функция, которая возвращает цену акции за данный день. Если возвращаемое значение является пустым, то цикл «До» уменьшает дату на 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

Теперь я пытаюсь воссоздать этот код, чтобы я мог передать ему две даты и получить две разные цены для их соответствующих дней (также выполнив процедуру «До» в случае пустых результатов).

До сих пор я пытался использовать цикл «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 Ответ

0 голосов
/ 04 мая 2018

Возможно, я упустил момент, но вы можете просто захотеть:

  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
...