我之前发现用户定义的(自定义)函数在输入数据更改时没有重新计算的问题,但是这个问题不同 - 它重新计算,但只是部分重新计算。
该函数本质上是一个sum-if函数,允许用户选择一个月,并传递一系列日期和一系列数据进行求和。然后汇总月份匹配的值。代码如下:
'//Function to allow values to be summed, only if the dates are in the appropriate month.
'//Inputs:
'//rMonthToCheck: Range Object (single cell) holding a date (normally the 1st of the month). This will be the month used to filter sums.
'//rRangeOfDates: A Range Object (multiple cells) holding a list of dates. Each will be checked against the rMonthToCheck.
'//rRangeToSum: A Range Object (multiple cells) which should correspond to the dates in rRangeOfDates. These will be the values actually summed if the month criteria is correct.
Public Function SumIfMonth(rMonthToCheck As Range, rRangeOfDates As Range, rRangeToSum As Range) As Double
'Application.Volatile (True)
Dim i As Long
Dim j As Long
'//Get Month ID
Dim nMonth As Long
nMonth = Month(rMonthToCheck.Value)
'//Get Year ID
Dim nYear As Long
nYear = Year(rMonthToCheck.Value)
'//Now sum valid dates
Dim dSum As Double
For i = 1 To rRangeOfDates.Rows.Count
If Month(rRangeOfDates(i, 1).Value) = nMonth And Year(rRangeOfDates(i, 1).Value) = nYear Then
For j = 1 To rRangeToSum.Columns.Count
'//Correct month and year, sum all columns
dSum = dSum + rRangeToSum(i, j).Value
Next j
End If
Next i
SumIfMonth = dSum
End Function
现在:这位于电子表格中。数据从数据库中提取,然后重新计算。这是奇怪的一点:
当函数单独输入时,它会正确重新计算。
=SUMIFMONTH(U48,ECData!$A$13:$A$400,ECData!$F$13:$H$400)
如果它是嵌套的,事情会变得奇怪:
=IF(MONTH(A48)>MONTH(EnteredMonth),0,SUMIFMONTH(U48,ECData!$A$13:$A$400,ECData!$F$13:$H$400))
在这种情况下,它实际上会重新计算,但答案是错误的:它只是总结了rRangeToSum范围的第一列!无论出于何种原因,其他列都会被忽略。
我尝试过application.volatile(正如你所看到的那样)并没有用。 CTRL + ALT + SHIFT + F9也不起作用。输入每个单元格并点击F2然后输入工作,查找/替换'='。
显然我有选择(最好是将嵌套公式分成两部分。但我想了解是否有更优雅的解决方案。
编辑:它似乎通过删除命名范围并将其替换为命名范围引用的单元格引用来“解析”。去图...
EDIT2:不。不健壮。仍然得到错误。