R属性使用详解
三种父格(上下文)对比:
父格 | 优先级 | 功能特点 | 优点 | 缺点 |
C属性 | 高 | 可设置2个父格(左、上各一个),多维度相邻时可继承 | 父子关系简单明了 | 需逐个设置,单元格多时较麻烦 |
默认父格 | 中 | 左、上紧邻的模板单元格自动成为父格 | 自动生效,方便高效 | 覆盖范围小,易被忽略 |
R属性 | 低 | 1. Range允许嵌套(完全包含)。 2. 扩展方向相同的单元格的Range不允许相交。 3. 如一个单元格位于多个Range内,按方向分成两组,每组中最小的Range对它起作用。 | 仅用于部分表头单元格,即可实现批量设置父格的效果,效率高。 | 范围交叉较复杂的时候要小心互相冲突; 优先级低,不建议和C属性混合使用。 |
R属性适合场景:
要设置父格的单元格比较多,或者子格在父格左侧或者上侧,无法使用C属性实现。
案例一:循环式报表
场景:主键为「订单编号」,即有几个订单编号就要生成几张出货单;每个订单里可能有多个货号,每个货号数据为一行。
期望效果:
C属性写法:
主键「订单编号」位置偏右,如果它前面和上面的单元格用C属性设置父格,预览会报错且无法保存。只能在最前面插入一列隐藏列,把「订单编号」拖入这一列当做父格,然后把后面整个表单范围内单元格(包括空白单元格)都转换为模板单元格并设置父格才能实现。实现步骤比较麻烦,且容易遗漏设置。
R属性写法:
静态表头 + 拖拉拽视图字段 + 2个单元格设置R属性(2个范围嵌套)
案例二:拼接式报表
场景:不同维度、颗粒度数据,或者不同的数值指标拼接在一张表里,同时需要纵向扩展和横向扩展。
期望效果:
整张表占用单元格较多,无论是用C属性做动态扩展,还是用静态文本表头+Excel公式填充,手动工作量都比较多,效率较低。此时用R属性来批量圈定子格会大幅提高效率,所有数值类型子格无需设置动态属性。
R属性参考写法:
注意事项:
1. 无论是C属性还是R属性,都只能对来自同一个视图里的字段生效,但是Excel函数严格来说都是格间计算,跟任何视图都没有直接的关系,所以Excel函数的2个父格可以来自不同的视图,或者可以处于2个视图的交叉范围里。
2. R属性优先级低于C属性和默认父格,所以混合使用时R属性不生效,不建议混合使用;但是默认父格难以避免,此时可以通过插入空白的隐藏行或列来保证R属性生效。
以下图为例,C5计算的大区销售金额小计,虽然它在A4设置的R范围内,但是左侧B5也是模板单元格,所以其实此时B5作为默认父格优先生效了。当C5填充的是视图字段,A4和B5都是大区,作为过滤条件参与计算,得到的求和结果都是正确的,参考下图。
但是当C5、D5填充的是Excel函数,然后转换为模板单元格,预览发现C5扩展计算后的数据是错的,但D5的数据是对的。这是怎么回事呢?
我们用“显示公式”功能来检查下,发现C5只对上面一个单元格求和,但D5是对上面省份扩展出来的动态范围求和。这是因为,父格对视图字段起跟随、过滤2个作用,但是对Excel公式或表达式只能起到跟随作用,即父格只能带领子格动态扩展,不参与计算。在这里,B5作为默认父格对C5起作用,A4作为父格对D5起作用:B5扩展一行,C5就只计算一行;但A4是个合并单元格,覆盖了省份的扩展范围,所以省份扩展的数据都会参与计算。
解决方案:
尽量使用视图里的字段;如果是只能使用Excel函数的场景,在维度字段和数值字段之间(B列后面)插入空白列,默认父格失效,R属性就生效了,最后隐藏空白列。同理,如果横向表头里默认父格导致R属性不生效,也可以插入隐藏行来解决。
注意:6.0及更新的版本插入行列后R范围和格间计算里的单元格位置会自动变化,但6.0以前的版本需要手动调整R范围和格间计算里的单元格位置。