很多人无法理解这个函数,我开始也一样。但是学了VBA之后,我发现这尼玛就是个VBA函数,就像SUMPRODUCT函数是一个伪装成普通函数的数组函数一样。
说个题外话,数组函数,很多人也不理解,主要是因为脑中没有数组的概念。我也是学了VBA之后才理解数组这一概念的。当然,程序员可以忽略我这一段。
闲话少叙,言归正传,回到INDIRECT函数。正如它的英文含义,它是"不直接的",与DIRECT,直接的,是一对反义词。之前学这个函数的时候,看到有人说它是"隔山打牛",我觉得还是挺贴切的,就是太武侠了点。INDIRECT函数是将传入的文本内容识别为特定格式的对象,最后输出区域对象的函数。
这是我的定义,我们来一个个剖析加粗字体的意思。
1 传入的是文本内容。看到这,用过的人可能会想,我明明写过INDIRECT(A1),你却说传入的是文本内容。别急,假设你在A1单元格填写了B1,B1单元格的内容是金拱门然后C1单元格输入了=INDIRECT(A1)。你能预料最后的结果吗?最后它会返回金拱门。我们来探究一下里面的传导过程
1.1 传入单元格A1
1.2 单元格A1将自身转化为单元格中的值,也就是B1
1.3 B1这个值被自动文本化,变成了"B1"(你可以在公式中用F9这个按键验证这一点)
1.4 INDIRECT函数检测到参数B1,然后整体输出B1单元格。形象点,就是B1==INDIRECT("B1")
1.5 B1单元格的内容是金拱门,所以最后显示的结果是金拱门
2 特定格式。什么叫特定格式?就是Excel 对于工作表行号列标的表示方法。Excel 有两种表示工作表行列的方式,一种叫A1方式,一种叫R1C1方式。默认的是A1方式,所以你打开工作表,会发现在这个表格矩阵中,横坐标是字母ABC。。。,纵坐标是12345...所以当你传输到INDIRECT 参数中的单元格,其单元格值是符合这种字母 数字的格式的时候,它将被识别为这个格式所代表的单元格,例如B1
3 输出区域对象。在上面的例子中,最后INDIRECT 返回的其实是B1单元格而不是其中的值,但是呢,既然是单元格,怎么才能在工作表中表示单元格呢???可能微软工程师觉得和你们解释这个太累了,所以直接显示了单元格的值给你们。跳过了这个逻辑,有些人就一直很难理解这个函数。在很多嵌套函数中,用INDIRECT 的时候你就会发现这一特性。
最后帮助你们从VBA角度理解一下。在VBA中,Range表示单元格对象,注意,是对象而不是单元格中的值。Range表示单元格区域有几种写法,其中一种是Range("文本")。只要文本中的值是符合我们以上所说的字母 数字的特定格式,它就会被认定为单元格。这也正印证了这句话:如果它走起来像鸭子,叫起来像鸭子,那它就是鸭子。蚁人2也有这句话