将此Excel公式转换为VBA代码

=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编码以来,这对我来说也是一个巨大的学习。 谢谢!

如果你知道公式,那么你可以使用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 

在这里输入图像说明

  DateAdd ( interval, number, date ) 

你应该调查这一点,并将其应用于你想要做的事:)

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

我很好奇这是为什么它不工作,我已经重写if > else > else逻辑到if or > else但是它实现了同样的事情。 就像Doug Coats的回答所说,你可以使用DateAdd来一起处理减法/添加date。 我刚刚将datestring转换为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