将多个范围作为AGGREGATE的数组参数传递

时间:2018-10-20 14:53:19

标签: arrays excel excel-formula excel-2016

如果有人知道以下问题是否已记录和/或潜在原因是什么,我将不胜感激。

例如,假设我们有A1:A10中1到10的数字,则下面的公式

=SUMPRODUCT(SUBTOTAL(4,OFFSET(A1,{0;5},0,5)))

是完全有效的,并且等效于从A1:A5A6:A10每个范围取最大值的总和,因为OFFSET函数在此处传递了一个值数组({0;5}作为其 rows 参数并具有适当的 height 参数(5),解析为范围数组:

{A1:A5,A6:A10}

然后将其传递给SUBTOTAL,以生成另一个数组,其中包含来自这些范围(即5和10)中的最大值,然后再与SUMPRODUCT相加。

AGGREGATE是在Excel 2010中引入的,似乎是SUBTOTAL的更完善的版本。我的问题是,为什么在尝试以下操作

=SUMPRODUCT(AGGREGATE(14,,OFFSET(A1,{0;5},0,5),1))

应该等同于上面给出的SUBTOTAL示例,但Excel会显示以下消息:“ 试图计算一个或多个公式时,资源不足了”(并返回一个值0)?

请注意,非英语版本的Excel的用户可能需要在数组常量{0;5}中使用不同的分隔符。

这是一个非常意外的错误。显然,语法不是错误的,OFFSET构造的传递也不是“不允许的”。在工作簿中没有其他内容的情况下,是什么导致Excel在尝试解决这种构造时使用了如此多的资源?

INDIRECT而不是OFFSET发生了类似的结果,即

=SUMPRODUCT(SUBTOTAL(4,INDIRECT({"A1:A5","A6:A10"})))

完全有效

=SUMPRODUCT(AGGREGATE(14,,INDIRECT({"A1:A5","A6:A10"}),1))

与上述错误相同。

致谢

2 个答案:

答案 0 :(得分:2)

[没有足够的声誉来添加评论。]

Mac上的Excel返回此:

Arrays containing ranges are not supported

答案 1 :(得分:1)

AGGREGATE错误似乎是由于将范围引用数组传递给期望值数组的参数而引起的。该错误消息具有传递统一指针的症状,从而导致意外行为。实际上,显示了相同的错误对话框以及其他一些功能,例如:

let prevCardiacIntervPickerView = UIPickerView()  
prevCardiacIntervPickerView.delegate = self  
prevCardiacIntervPickerView.tag = 1  
prevCardiacIntervPickerField.inputView = prevCardiacIntervPickerView  
var prevCardiacIntervPickerOption = ["Yes, surgery", "Yes, PCI <6h ago", "Yes, PCI >6h ago", "No"]  
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}  
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView.tag == 1 {
            return prevCardiacIntervPickerOption.count
        }
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView.tag == 1 {
            return prevCardiacIntervPickerOption[row]
        }
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView.tag == 1 {
            prevCardiacIntervPickerField.text = prevCardiacIntervPickerOption[row]
        }
}

另一方面,允许将引用数组传递给AGGREGATE的第四个或更高版本的参数,例如:

//this is the constructor
public EfGiacenzeRepo(IServiceProvider serviceProvider)
{
    _serviceProvider = serviceProvider;
}


//this is the method
using (_aspContext = _serviceProvider.GetService<aspContext>())
{
    listaGiacenze = _aspContext.TabGiacenza.ToList();
}

以类似的方式,SUBTOTAL允许第二个或更高版本参数中的引用数组,而这些引用都不是本地数组。通过将函数应用于数组中的每个范围引用来评估SUBTOTAL公式,即:

=MEDIAN(TRANSPOSE(INDIRECT({"a1:a5","a6:a10"})))
在函数定义中

格式化数组范围引用可能有助于可视化公式处理:

AGGREGATE(function_num,options, array or ref1 ,[ k or ref2 ],[ ref3 ] ,…)

SUBTOTAL(function_num, ref1 ,[ ref2 ],...)

请注意,仅 reference 参数也允许引用数组。

有趣的是,当前Office 365预览版中的更新的计算引擎和动态数组是否对此行为进行了任何更改,并且即将发布...