不支持空数组错误

不支持空数组错误

我有一本工作簿,里面有每年一张的工作表,我需要获取该工作表所在年份所有月份的平均值。工作表按年份命名,我将公式命名为:MONTHS

=LET(year,VALUE(MID(CELL("filename"),SEARCH("]",CELL("filename"))+1,31)),IF(YEAR(TODAY())=year,MONTH(TODAY())-1,IF(year>YEAR(TODAY()),0,12)))

并用它来得到平均值:

它在大多数情况下都能正常工作,但当我在其他单元格或工作表中执行某些操作时,它会返回#计算错误,不支持空数组。当我重新计算工作表时,它会自行修复,但总是必须这样做非常烦人。有什么方法可以防止这种情况发生吗?

答案1

根据我多年使用 APL 的经验,我个人认为空数组支持必不可少。不支持空数组是微软的一个失误。

答案2

我没有TAKE()可用的资源,因此无法明确地说“这是你的问题。” 我将解决两个方面,你的MONTHS命名范围可能被限定在 WORKBOOK 中,但需要被限定在 SHEET 中,以便它可以在每个不同的工作表上指定一个特定的单元格,并且可能TAKE()是由于两个潜在问题而导致的问题,即,,指定行参数和下面要解决的第一件事,MONTHS有时会返回“0”,因此表示TAKE()不返回列,因此是一个空数组。

事实上,您在处理其他工作表然后返回时提到了这个问题,这倾向于第一类,MONTHSCELL()不指定任何特定单元格的范围。但事实上,指定0列似乎可能会生成一个空数组,而您被告知不支持空数组,这表明这就是问题所在。然而,在这种情况下,它不应该如此简单地解决。“不应该”当然不等同于“不会”。所以灰色区域。

但是下面会给你三件容易检查的大事,为了方便起见,我已经测试了命名范围材料,确实如此。(我还测试了强制 Excel 永不返回所述错误的标准方法,但它并不能解决问题。)但它可能会产生什么影响TAKE(),我无法从测试中说出来。不过,你会看到如何轻松测试这两件事。我打赌范围MONTHS最适合所描述的问题。所以它排在第一位:

您的公式有三个可能的结果,其中之一是0

到目前为止一切顺利。但是,在您的TAKE()函数中,您使用其结果来指定要将多少列发送到该AVERAGE()函数。

MONTHS但是在公式返回时形成数组时0,您要告诉它所在的行中TAKE()取列。列表示一个空数组。00

为了使它对你有用,你需要一个更复杂的方法。例如:

使用IF()来测试MONTHS的结果。如果0,则在单元格 O5 中返回结果 $0.00。如果不是结果,则按原样0使用公式。AVERAGE()

或者

当计算结果在将来时,返回 a1而不是 a 。有人会认为该工作表上的所有行都是空的,因此您将取一个值为零的单元格的平均值并返回零。如果不是,则可能会发现一些适用的类似逻辑。0year

另一个想法,与此没有直接关系,目前也没有造成任何问题,就是CELL("filename")每次 Excel 重新计算时,按照您的方式编写会强制 Excel 重新计算其在所有工作表(而不仅仅是此工作表)上的每个使用实例。而处理另一张工作表时,会出现问题,您在问题中给出的部分内容描述了该问题:当在另一张工作表上,并且 Excel 重新计算其他工作表之一时,它会使用您所在的工作表来给出回报,CELL()而不是正在使用它的工作表,除了您所在的工作表。因此,所有其他工作表都会得到不幸的结果,Excel 似乎意识到了这一点,并在所有工作表上返回错误。正如我在下面提到的,如果工作表是死胡同,其结果不是其他工作表的先例单元格,例如多年来的总结工作表,这只会让您感到恼火,或者如果老板对此抱怨,您会感到尴尬。但如果是,它们会将错误输入到那些前向使用中,导致它们返回错误……

因此,关于这一点:这会导致一个问题,不是在编辑当前工作表时,而是在导航到其他工作表上进行任何编辑时。当您这样做时,其他工作表将向#VALUE!使用 的单元格发出错误MONTHS。可以说这不是什么大问题,只要每张工作表都是独立的,并且不会进入任何其他工作表。您会转到工作表进行一些工作,并会因为看到错误的影响而感到恼火(肯定是“空数组”的情况,尽管我没有TAKE(),因此无法测试确切的影响……它可能会返回一个错误数组来取平均值,因此AVERAGE()不会产生#CALC!错误,而是它自己的#VALUE!错误。无论如何,这只会让您恼火,让老板感到不安,但在您第一次进入工作表时,它会解决。

您可以通过创建MONTHSSHEET 范围而不是 WORKBOOK 范围来解决该问题。并为其中的两个CELL()函数分别指定一个单元格(任何单元格,但为什么不是单元格 A1?)。一旦您这样做,该问题就会消失。

当然,这意味着为每个现有工作表建立命名范围,但如果有一个模板,或者通过复制当前工作表并删除数据来添加新年份,则每次复制和重命名时都会创建具有 SHEET 范围的命名范围。所以未来不会有问题。并MONTHS在执行此操作后删除 WORKBOOK 范围的命名范围。

如果TAKE()给出了,,so norows参数并且有时给出了0columns 参数不是困难的根源(我没有给出那么多机会,但可能是 MS 改变了他们的整个哲学方法:他们似乎不再做他们所做的事情了INDEX()),那么很可能CELLS()是用法出了问题。

就目前而言,我目前能找到的关于该函数的所有信息都只是他们重新翻唱的广告,或者通过令人愉快的示例、文本和视频重新翻唱,但没有人研究过实际使用问题,所以我没有就您的使用情况进行测试。我注意到,微软过去几年的做法是不允许使用旧的 can ,,) INDEX(),而是当他们说需要 rows 参数时,他们甚至不是指他们原来的“必须指定行或列”,而是无论您是否提供 columns 参数,您都必须提供 rows 参数。此外,希望他们将您的,,MONTHS)意思解释为“那一行,这么多列”,人们希望他们正在做隐式交集,但事实可能并非如此,因为他们在实践和概念上都刻意避开了它。

因此问题如下:

  1. 需要使用 SHEET 范围的MONTHS命名范围而不是(大概)WORKBOOK 范围的版本。

  2. TAKE()问题在于有时无法处理返回的“0” MONTHS

  3. TAKE()问题是没有处理缺少行参数的问题。

  4. TAKE()上述第 2 点和第 3 点中的问题都是问题。

编辑:经过所有的研究,却发现没有任何有用的信息,我发布了这篇文章,然后单击了另一个搜索页面......并找到了一个网站,其中有一个例子,使用了,,MONTHS)我上面经常提到的部分,并显示了TAKE()成功,因为它采用了忽略有关行的任何内容的方法,因此返回所有行,就像在INDEX()would 中简单使用参数一样。

所以那方面不是问题。抱歉,我已经对基本答案进行了太多编辑,无法删除它所在的部分,而最终没有完全重写它,现在已经太晚了,因为我的床在召唤。但这种用法不是问题,因为他的示例显示了这种用法的正确返回。它位于:

https://www.get-digital-help.com/how-to-use-the-take-function/

第 4 部分。在布局中,大约位于页面下方的 20-25%。

相关内容