将此Excel公式转换为VBA代码(函数)

将此Excel公式转换为VBA代码(函数),vba,excel,function,Vba,Excel,Function,这是Excel中我试图转换为VBA代码的公式: =IFERROR(IF(effDate>curDate,0,IF((curDate-effDate+1)>nDays,nDays*(nSpend/365),((nSpend/365)*(curDate-effDate+1))-IF((curDate-effDate+1)-nDays>0,nSpend/365,0))),0) 为了检查工作目的,这里是每个变量的值: effDate: 1/1/17 (dimmed as value)

这是Excel中我试图转换为VBA代码的公式:

=IFERROR(IF(effDate>curDate,0,IF((curDate-effDate+1)>nDays,nDays*(nSpend/365),((nSpend/365)*(curDate-effDate+1))-IF((curDate-effDate+1)-nDays>0,nSpend/365,0))),0)
为了检查工作目的,这里是每个变量的值:

effDate: 1/1/17 (dimmed as value)
curDate: 3/31/17 (dimmed as value)
nDays: 60
nSpend: 1600
回答正确:
263

我试着让它工作了两天,现在我用大约一百种不同的方式重新输入,但没有一种有效。代码可能适用于一个单元格,但不能正确计算其他单元格。或者根本不起作用。下面是我前面所做的示例之一(函数名为APFcst):

注意:所有内容都适当地变暗了,我遇到的问题只是翻译实际公式,这样它会给我正确的答案。
请帮忙!我已经盯着它看了这么久,可能看不到一个明显的解决方案。

类似这样的东西,也许可以使用IIF将其缩短一点,也许可以更有效地使用
(nSpend/365)
,我稍后再看。我还没有经过适当的测试

Function formula_test(dtCurrentDate As Date, dtEffectiveDate As Date, nDays As Long, nSpend As Double) As Double

On Error GoTo eHandle

If dtEffectiveDate > dtCurrentDate Then
    formula_test = 0
Else
    If ((dtCurrentDate - dtEffectiveDate) + 1) > nDays Then
        formula_test = nDays * (nSpend / 365)
    Else
        formula_test = ((nSpend / 365) * (dtCurrentDate - dtEffectiveDate + 1))
        If (dtCurrentDate - dtCurrentDate + 1) - nDays > 0 Then
            formula_test = formula_test - nSpend / 365
        End If
    End If
End If

Exit Function

eHandle:
        formula_test = 0

End Function

注意到最后一个
IF
检入公式是多余的,下面是公式的简化:

Function xAPFcst(effDate, curDate, nSpend, nDays) As double
  xAPFcst = IIf(effDate > curDate, 0, (nSpend / 365) * Application.Min(nDays, curDate - effDate + 1))
End function

为什么不试试直接翻译呢
If()
(工作表函数)对应于VBA函数
IIF()
IFERROR
可以用
Application.WorksheetFunction.
作为前缀,并直接在Excel VBA.APFcst=iff(effDate>curDate,0,IIF((curDate-effDate+1)>nDays,nDays*(nSpend/365),((nSpend/365)*(curDate-effDate+1))中使用-IIf((curDate-effDate+1)-nDays>0,nSpend/365,0)))这是我尝试过的,但它给了我一个错误(子/函数未定义)。我的编码技能是非常初学者,所以我不知道如何修复错误。谢谢你的回答!我的编码技能非常初级(请注意)。我只是尝试实现代码,但出于某种原因,它给了我一个0。
公式测试(dateserial(2017,3,31),dateserial(2017,1,1),601600)
=263.013698630137“min”是什么?它要求我定义它,但我不确定它是什么。对不起,我的编码技能非常初级!正在学习。@KateLO
Application.Min
,使用Excel中的函数:)@A.S.H我在同一个函数中有其他公式,它们当前设置为长。将其更改为双倍会改变其他所有功能吗?或者我也可以使用long来完成此操作?@KateLO当然可以使用long,但如果除法产生小数,则会对结果进行舍入。这完全取决于你的项目。@A.S.H听起来不错!我只是试着用这种方式实现它,但结果是0。(ElseIf freq=0,然后xAPFcst=IIf(effDate>curDate,0,(nSpend/365)*Application.Min(nDays,curDate-effDate+1))结束If)。我似乎找不到错误。
Function xAPFcst(effDate, curDate, nSpend, nDays) As double
  xAPFcst = IIf(effDate > curDate, 0, (nSpend / 365) * Application.Min(nDays, curDate - effDate + 1))
End function