动态格间运算是复杂报表的一个典型特征。 一般来说,固定的列间或者固定的行间运算处理非常简单,所有的报表工具包括excel均可轻松处理。我们这里所说的动态格间运算,特指浮动行列的情况,即行列均为动态扩展出来的,此时行间、列间、甚至组间的运算叫动态格间运算。 要进行动态格间的运算就需要定位单元格,即通过坐标将单元格的位置表示出来,以便于引用和展现其值。 要准确的表示一个单元格的位置,有几种方式: - 绝对坐标:最简单的就是用单元格在报表中所处行列的标号表示,如:A1、B2、C3......,这就叫绝对坐标。 - 层次坐标:如果单元格可扩展,那么扩展后的多个单元格对应的是报表中的一个格,用绝对坐标就表示不清楚了。这时可以使用层次坐标,来准确的定位单元格扩展后的位置。例如:C2[A2:2,B2:3]。 - 位移坐标:如果我们不知道单元格的确切位置,只知道它相对于一个已知单元格的相对位移,这时可以使用位移坐标定位目标单元格的位置。例如:C3[A3:-1,B3:-2]。 - 省略主格表示法:由于层次坐标和位移坐标的表示法比较繁琐,当单元格和当前格主格相同时,层次坐标和位移坐标可以采用省略主格的缺省写法。例如:C1[B1:2],C2[B2:-1]。 下面我们将具体的介绍几种坐标的写法。 # 绝对坐标 单元格通过“列号+行号”来命名。这种单元格的表示方法称为其绝对坐标,在文档中写为Cellx。 如果单元格为合并单元格,则以其左上角单元格的名称表示。 例1:B列第3行的单元格名为B3: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_7dee94ec1c5561b58e6dbc2d9d563eca_r.png) 例2:A1、B1、C1合并后的单元格名为A1: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_556ffdd6bca80405f927f6a926338743_r.png) 下图是一些单元格合并后的名称: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_27709e7836438c449c3a452fcbec7c39_r.png) # 层次坐标 在进行报表设计时,单元格尚未扩展,但是其它单元格的表达式可能需要此单元格扩展后的位置。这时,就要对扩展后的每个单元格进行唯一性定义,这就是单元格的层次坐标。层次坐标是用于唯一描述(精确定位)扩展后的每一个单元格的表达式。 例如: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_04fae31e9a5c2ed20a375f2476097ad8_r.png) 对于该主格,C1[A1:3,B1:2]表示对应的附属格,即图中黄色单元格。 语法: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_f76e7fd7ccee22924f8105c6574e9730_r.png) 说明: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_d57ac6dc73ac9cbd64a368c408a58586_r.png) 在上述的层次坐标的表示法中,如果目标单元格Cellx本身是扩展单元格,那么要唯一描述(精确定位)其扩展后的单元格的位置,可以写为Cellx[Lk:lk,Lk-1:lk-1...L1:l1,Cellx:n],其中n为Cellx扩展后的次序。与之类似,如果Cellx只有上主格,可以写为Cellx[;Tk:tk,Tk-1:tk-1...T1:t1,Cellx:n]。 层次坐标,在文档中统一用[Coordinate]表示。 在层次坐标中,并不一定指定到最低一级主格扩展后的位置。在这种情况下,Cellx[Coordinate]会返回扩展后的若干单元格中的第一个,Cellx[Coordinate]{CriteriaExp}会返回扩展后的若干单元格中符合条件的单元格的集合。 层次坐标[Coordinate]的运算结果指向目标单元格的位置。如果层次坐标能够定位到一个单元格,那么Cellx[Coordinate]返回该单元格的值;如果定位到多个单元格,那么Cellx[Coordinate]返回这些单元格中第一个单元格的值。 下面是几个用层次坐标定位单元格的例子。 例1:下图的报表中,C1[A1:1,B1:2]的返回值为5;C1[A1:2,B1:3]的返回值为12;C1[A1:3,B1:4]的返回值为21;B1[A1:2,B1:2]的返回值为5,B1[A1:3,B1:4]的返回值为7。 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_9045404193e7e7fc71042923e0330e0d_r.png) 例2:下图的报表中,C3[A3:1,B3:2;C1:2,C2:3]的返回值为216;C3[A3:3,B3:3;C1:1,C2:2]的返回值为255;C3[A3:2,B3:1;C1:3,C2:2]的返回值为228;C3[A3:3,B3:1;C1:3,C2:3]的返回值为248。 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_7080edd70325a745ae22211f4998e016_r.png) 例3:下图的报表中,C3[A3:1,B3:2;C1:2]的返回值为212;C3[A3:3;C1:1,C2:2]的返回值为229;C3[A3:2;C1:3,C2:3]的返回值为231。 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_f6e45ef5d70ef58738494638960ff6a3_r.png) 层次坐标还可以用相对位移来表示,下面介绍位移坐标。 # 位移坐标 许多时候,报表设计者并不知道目标单元格的具体位置,仅仅知道目标单元格相对于当前单元格的位移,因此给出了位移坐标。 位移坐标的运用非常广泛,例如报表中常常需要计算同期比、比上期之类的与时间相关的数据,而这些运算往往需要用到下一行的数据减上一行数据,后一列数据减前一列数据等等。这种涉及到相邻n行或者n列的行间、列间的运算,称为位移运算,相关的表达式称为位移表达式。 位移坐标是用来描述目标单元格和当前格之间的位置关系的表达式。 例如: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_91a85de618587c069eaad21be626b72f_r.png) 语法: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_9fdb21419971b0af401fbb22b3b71a85_r.png) 说明: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_4fcd9a1a82ba303cd3eabfeb434ce43c_r.png) 例如: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_01b5ce6126052f0f698b9d53953b1dfb_r.png) # 省略主格表示法 层次坐标和位移坐标的表示比较烦琐,而且大部分时候,对于单元格的定位是和当前格的位置有关系的,比如当前格的主格或者和当前格有着相同主格的单元格,这时可以采用省略主格的写法。 省略主格时,如果目标单元格的某个主格Lk和当前单元格的主格相同,那么层次坐标/位移坐标中该主格可以不写。 如果目标单元格与当前格的关系满足缺省主格认定规则,那么直接遵循缺省引用规则的表示法,不需要层次坐标/位移坐标。 例如: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_4967eb5cedd68487e5f2a58ea69af002_r.png) 如果目标单元格Cellx本身是扩展单元格,那么Cellx[n]表示其纵向扩展后的第n格单元格,Cellx[;n]表示其横向扩展后的第n格单元格。 在没有复杂的主格关系的报表中,Cellx[±n]表示当前格Cellx往上位移n格或者往下位移n格,其中+代表往下位移,-代表往上位移。