将此Excel公式转换为VBA代码

时间:2017-07-04 16:33:39

标签: excel vba excel-vba function

=IF((effDate)-curDate>0,0,IF(curDate-(effDate)+1>nDays,0,nSpend/4))+IF((effDate+365/4*1)-curDate>0,0,IF(curDate-(effDate+365/$4*1)+1>nDays,0,nSpend/4))+IF((effDate+365/4*2)-curDate>0,0,IF(curDate-(effDate+365/4*2)+1>nDays,0,nSpend/4))+IF((effDate+365/4*3)-curDate>0,0,IF(curDate-(effDate+365/4*3)+1>nDays,0,nSpend/4))

effDate: 1/1/2017 (as value)
curDate: 1/31/2017 (as value)
nSpend: 1600
nDays: 60
Correct answer: 400

上面是一个很长的公式,我试图转向VBA代码。我一直试图这样做的方式很长,我试着把它分解成更小的功能,但它没有给我正确的答案。我的VBA技能非常初学,所以我不确定还有什么可以尝试的。我一直得到错误的答案或根本没有答案。

这就是我一直在尝试的:

If effdate - curdate > 0 Then
val1 = 0
Exit Function
End If

If curdate - effDate + 1 > nDays Then
val1 = 0
Else
val1 = nSpend / 4

End If

If (effDate + (365 / 4)) - curdate > 0 Then
val2 = 0
Exit Function
End If

If curdate - (effDate + (365 / 4)) + 1 > nDays Then
val2 = 0
Else
val2 = nSpend / 4
End If

If effDate + (365 / (4 * 2)) - curdate > 0 Then
val3 = 0
Exit Function
End If

If curdate - (effDate + (365 / (4 * 2))) + 1 > nDays Then
val3 = 0
Else
val3 = nSpend / 4
End If

If effDate + (365 / (4 * 3)) - curdate > 0 Then
val4 = 0
Exit Function
End If

If curdate - (effDate + (365 / (4 * 3))) + 1 > nDays Then
val4 = 0
Else
val4 = nSpend / 4
End If
End If

APFcst = val1 + val2 + val3 + val4


End Function

我正确地调暗了一切,这是我遇到问题的实际转换。 我很感激你的帮助!这对我来说也是一个巨大的学习期,因为我刚开始学习VBA编码。 谢谢!

3 个答案:

答案 0 :(得分:2)

如果你知道公式,那么你可以使用Evaluate()来达到你想要的效果。

Sub Sample()
    Dim f1, f2, f3, f4

    f1 = "=IF((effDate)-curDate>0,0,IF(curDate-(effDate)+1>nDays,0,nSpend/4))"
    f2 = "=IF((effDate+365/4*1)-curDate>0,0,IF(curDate-(effDate+365/4*1)+1>nDays,0,nSpend/4))"
    f3 = "=IF((effDate+365/4*2)-curDate>0,0,IF(curDate-(effDate+365/4*2)+1>nDays,0,nSpend/4))"
    f4 = "=IF((effDate+365/4*3)-curDate>0,0,IF(curDate-(effDate+365/4*3)+1>nDays,0,nSpend/4))"

    '~~> Change Sheet1 to the relevant sheet code name
    Debug.Print Sheet1.Evaluate(f1) + Sheet1.Evaluate(f2) + Sheet1.Evaluate(f3) + Sheet1.Evaluate(f4)
End Sub

enter image description here

答案 1 :(得分:0)

 DateAdd ( interval, number, date )

你应该对此进行调查并将其应用于你想要做的事情:)

https://www.techonthenet.com/excel/formulas/dateadd.php

答案 2 :(得分:0)

我对此很感兴趣,看看为什么它不起作用,我已经将if > else > else逻辑重写为if or > else,但它实现了同样的目的。就像Doug Coats的回答所说,你可以使用DateAdd来减法/一起添加日期。我刚刚将日期字符串转换为double:

Private Sub CommandButton1_Click()
Dim x As Date: Dim y As Date
Dim effDate As Double
Dim curDate As Double
Dim nSpend As Double
Dim nDays As Double

x = "1/1/17"
y = "31/1/17"
effDate = CDbl(x)
curDate = CDbl(y)
nSpend = 1600
nDays = 60

If (effDate - curDate > 0) Or (curDate - effDate + 1 > nDays) Then
    val1 = 0
Else
    val1 = nSpend / 4
End If

If ((effDate + (365 / 4)) - curDate > 0) Or (curDate - (effDate + (365 / 4)) + 1 > nDays) Then
    val2 = 0
Else
    val2 = nSpend / 4
End If

If (effDate + (365 / (4 * 2)) - curDate > 0) Or (curDate - (effDate + (365 / (4 * 2))) + 1 > nDays) Then
    val3 = 0
Else
    val3 = nSpend / 4
End If

If (effDate + (365 / (4 * 3)) - curDate > 0) Or (curDate - (effDate + (365 / (4 * 3))) + 1 > nDays) Then
    val4 = 0
Else
    val4 = nSpend / 4
End If

MsgBox (val1 + val2 + val3 + val4)

End Sub