【问题标题】:Translate this Excel formula into VBA code (function)将此 Excel 公式翻译成 VBA 代码(函数)
【发布时间】:2017-07-05 17:20:52
【问题描述】:

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

=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):

If effDate > curDate then
APFcst = 0 
Exit Function 
End if

If (curDate - effDate + 1) > nDays then
APFcst = nDays * (nSpend / 365) 
Else
val1 = (nSpend / 365) * (curDate - effDatea + 1)
end if 

if (curDate - effDate + 1) - nDays > 0 then
val2 = nSpend / 365
else
val2 = 0
end if

APFcst = val1 - val2
Exit Function 
End if 

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

【问题讨论】:

  • 为什么不试试直接翻译呢? 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))) 这是我尝试过的,但它给了我一个错误(子/函数未定义)。我的编码技能非常初学者,所以我不知道如何修复错误。

标签: vba excel function


【解决方案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

【讨论】:

  • 什么是“分钟”?它要求我定义它,但我不确定它是什么。对不起,我的编码技能非常初学者!刚刚学习。
  • @KateLO Application.Min,使用 Excel 中可用的功能 :)
  • @A.S.H 我在同一个函数中有其他公式,它们目前设置为 long。是否会更改它以双重更改其他所有功能,或者我也可以使用它?
  • @KateLO 确定您可以使用 long,但如果除法产生小数,您将四舍五入。这完全取决于您的项目。
  • @A.S.H 听起来不错!我只是尝试以这种方式实现它,但结果结果为 0。( ElseIf freq = 0 Then xAPFcst = IIf(effDate > curDate, 0, (nSpend / 365) * Application.Min(nDays, curDate - effDate + 1 )) 万一)。我似乎找不到错误。
【解决方案2】:

像这样的东西,也许可以使用 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

【讨论】:

  • 感谢您的回答!我的编码技能非常初学者(只是抬头)。我只是尝试实现代码,但由于某种原因它给了我一个 0。
  • formula_test(dateserial(2017,3,31),dateserial(2017,1,1),60,1600) = 263.013698630137
猜你喜欢
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 2020-12-01
  • 2017-07-24
  • 1970-01-01
相关资源
最近更新 更多