=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编码。 谢谢!
答案 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
答案 1 :(得分:0)
DateAdd ( interval, number, date )
你应该对此进行调查并将其应用于你想要做的事情:)
答案 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