我有一张3张电子表格。两个有一堆类似的数据,被称为“2012”和“2011”。最后一张表格对数据进行了比较。
为了能够选择年份,我正在使用一个单元格,我可以写“2011”或“2012”(D1)。然后,公式使用INDIRECT公式将此单元格作为参考的一部分。
INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!F:F")
这不是一个漂亮的解决方案,使得公式变得漫长而复杂。
=IFERROR(SUM(FILTER( INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!M:M") ; (INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!B:B")=$A4)+(INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!B:B")=$A5)+(INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!B:B")=$A6)+(INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!B:B")=$A7)+(INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!B:B")=$A8); MONTH(INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!D:D"))=$B$1 ; INDIRECT(CHAR(39)&$D$1&CHAR(39)&"!F:F")=D$3));0)
问题1:有更好的方法吗?我已经尝试为计算表创建一个单独的电子表格,并使用VMERGE(脚本库中的自定义函数)将两张表中的数据一起导入(IMPORTRANGE),但是这些数据中有很多数据。两张纸,导入需要很长时间。任何变化(如改变年份)也需要很长时间才能重新计算。
编辑:请忽略Q2,因为我发现了自己的(愚蠢的)错误。忘记将自定义函数放在MONTH公式内的INDIRECT公式中。 Q1仍然有效。
问题2:作为一个部分解决方案,我正在尝试编写一个自定义函数,以更整洁,更易读的方式执行INDIRECT-stuff。像RANGE(D1,“A:A”)。到目前为止,这个功能看起来像这样:
function range(V1,V2) {
return "'" + V1 + "'!" + V2;
}
但是 - 虽然它适用于:
=IFERROR(SUM(FILTER( INDIRECT(RANGE(D1;"B:B")) ; INDIRECT(RANGE(D1;"A:A"))=A4 ));0)
当我输入日期变量时它停止工作:
=IFERROR(SUM(FILTER( INDIRECT(RANGE(D1;"B:B")) ; INDIRECT(RANGE(D1;"A:A"))=A4 ; MONTH(RANGE(D1;"C:C"))=$B$1 ));0)
任何帮助都将不胜感激。
答案 0 :(得分:0)
执行此类操作时,数据库功能往往更清晰。
https://support.google.com/docs/bin/static.py?hl=en&topic=25273&page=table.cs&tab=1368827
数据库功能需要一段时间才能学习,但功能强大。
或者
你可以将INDIRECT(CHAR(39)& $ D $ 1& CHAR(39)&“!B:B”)放在一个单元格中。
答案 1 :(得分:0)
我认为您有两年的架构相同的信息(C列在两个工作表上都有相同类型的信息)。另外,我假设B栏跟踪年份。
如果是这样,请考虑在一张纸上保留所有信息,然后使用电子表格功能“QUERY”创建视图。
例如,此公式从名为“DataSheet”的工作表返回A1:E之间的所有单元格,其中B列中的值= 2010.
= QUERY(DataSheet!A1:E;“SELECT * WHERE B = 2010”; 1)
有时将数据存储在两张纸上是有充分理由的。如果是这样,请使用脚本库中的某个vMerge函数来组合工作表。然后从工作表创建视图和报告。
function VMerge() {
var maxw=l=0;
var minw=Number.MAX_VALUE;
var al=arguments.length ;
for( i=0 ; i<al ; i++){
if( arguments[i].constructor == Array )l =arguments[i][0].length ;
else if (arguments[i].length!=0) l = 1 ; // literal values count as array with a width of one cell, empty cells are ignored!
maxw=l>maxw?l:maxw;
minw=l<minw?l:minw;
}
if( maxw==minw) { /* when largest width equals smallest width all are equal */
var s = new Array();
for( i=0 ; i<al ; i++){
if( arguments[i].constructor == Array ) s = s.concat( arguments[i].slice() )
else if (arguments[i].length!=0) s = s.concat( [[arguments[i]]] )
}
if ( s.length == 0 ) return null ; else return s //s
}
else return "#N/A: All data ranges must be of equal width!"
}
希望这有帮助。