[数组公式] 浅谈引用、数组、内存数组

我们编写函数公式的时候往往会遇到一些问题,而造成了我们认为正确的公式可是就是不能返回正确的结果,或者干脆EXCEL就不让我们输入。这是什么原因呢?举个例子比如我们输入 =COUNTIF({1,2,3},">2")按回车, 呃?报错! 为什么呢? 我们输入 =SUM(INDEX(ROW(1:10),ROW(1:3))) 按CTRL+SHIFT+ENTER 结果为1,应该为3啊! 这又是为什么呢? 等等这些让我们认为是莫名奇妙的问题,它们到底是什么问题呢?第一个问题是因为COUNTIF函数的第一个参数只能支持区域的引用,而不可以为数组,像这样的函数还有SUMIF(第一和第三个参数) SUBTOTAL(第二个参数)D大头的数据库函数(第一第二个参数) RANK(第二个参数)COUNTBLANK 等等。第二个问题就是SUM()里面的INDEX(ROW(1:10),ROW(1:3)) 返回的不是一个内存数组。而这些就是我今天要和大家讲的关于区域引用,数组,内存数组这方面的问题。

    数组我就不用讲了吧,想想那串糖葫芦就好了^_^。那么什么是区域引用呢?这个其实非常好理解,区域引用就是你可以直接通过它在EXCEL中找到属于它的位置。 比如A1 ,A1:A10 ,B2:D15...这中直接的引用另外就是常用的OFFESET INDIRECT这两个函数了,=OFFSET(A1,1,2,5,) =INDIRECT("A"&ROW(1:5)) 等等,这些你都可以直接在EXCEL找到它的位置。另外这里的判断是整个一个参数,比如我们经常想用的一个公式吧 =COUNTIF(A1:A10&B1:B10,F1&F2) 这也是不可以的,为什么呢?大家可能会问了A1:A10和B1:B10这不都是引用么,EXCEL判断它的时候是把A1:A10&B1:B10作为一个整体的 它是这两个区域每两个数值连接在一起的一个数组(想想我吃的那两串糖葫芦^_^)

下面我们就要讲讲内存数组了。

    那么什么是内存数组呢?简单一句话:内存数组可以进一步作为别的函数的参数的数组。
比如:如果你在表中选取众向的3个单元格(A1:A3)输入=INDEX(ROW(1:10),ROW(1:3)) 可以显示1;2;3是数组没问题,但是把它作为SUM的参数时返回不了正确的结果。如果我们输入=SUM(SMALL(ROW(1:10),ROW(1:3)) 按CTRL+SHIFT+ENTER得到结果6 没问题。这就是因为INDEX(ROW(1:10),ROW(1:3))不是内存数组,而SUM(SMALL(ROW(1:10),ROW(1:3)) 是内存数组。


    那么内存数组有什么作用呢?正因为内存数组可以进一步作为别的函数的参数,所以我们可以将其作为公式众的一个环节应用。生成的内存数组我们还可以直接用来作为图表的数据源(放到定义名中)


    如何区别是否为内存数组呢? 也用其可以被别的函数作为参数的特点,直接让其作为其他函数的参数,返回结果真确就是内存数组了,比如比较常用的就是 =INDEX(要判断的内存数组,ROW(1:1)) 然后下拉看看是不是能正确返回。


    至于要生成内存数组,就需要大家在不断的实践中慢慢积累经验了。多换角度去思考问题就可以了。比如返回一个区域每行和的内存数组的话,我们就别总见到求和就SUM,因为SUM基本不能生成内存数组的,而这种问题往往就用MMULT函数。另外就是什么MIN MAX 也避免用其返回内存数组,像INDEX我们也可以用lookup来代替它。等等这些将在我们日后的应用中慢慢的掌握,并逐步应用自如了。

你可能感兴趣的:(Excel)