在Excel中更改轮廓的形状

时间:2015-05-05 11:31:10

标签: excel excel-vba excel-formula vba

在Windows 7上运行Office Professional Plus 2013。

有一个矩阵,如下图所示:taxon matrix

在此Google spreadsheet中找到完整的矩阵数据。有两个选项卡 - 通用术语和特定术语。

Matrix用于对items进行分类 - 例如特定植物。有items分配给此矩阵,但未显示它们以降低复杂性。

矩阵是一个归一化矩阵,意味着列是固定的 - 矩阵中有所有可能值的位置。但在许多情况下,列没有值(NULL值)。例如,第8行的属由kingdom : subkingdom : division : class : order : family : genus定义。

subdivisionsubclasssuperordersuborderfamily不用于定义特定属。相反,第14行的genussubdivision定义。

使用符号,规范化矩阵如下所示: symbolic matrix

目标是创建一个非规范化矩阵 - 重新构造一个列不再有意义的矩阵,但它只是轮廓中的一个级别。一般的方法是删除一个NULL单元格 - 并在下一行 - 移动其依赖的"孩子"左

手动过程将是:

  1. 删除D5并向左移动Class
  2. 删除E6并向左移动Order
  3. 重复广告恶心。
  4. 反规范化矩阵如下所示:

    enter image description here

    幸运的是,前三列中的符号永远不会为NULL(C - 常量) - 我们可以引用它们,但不需要移动它们。但是,所有其他列中符号的位置是可变的(V - 变量),具体取决于已删除的空值。

    有一个皱纹。有些情况下item(隐含但未显示)未映射到genus。相反,item会映射到更广泛的术语,例如family。第15行是family是终端节点的示例; genus 用于定义此item

    如何创建以下内容的Excel公式或脚本:

    1. 删除NULL位置
    2. 在具有已删除NULL位置的行上,将术语左移
    3. 在与父单元格相关的下一行上,将术语移到左侧?
    4. 如果使用名称(divisionsubdivisionclass等)比使用符号更容易,那就没问题了。 Google电子表格提供了通用术语和特定术语。

1 个答案:

答案 0 :(得分:1)

这是我基于公式的解决方案的示例输出:

enter image description here

有2个辅助列(MN)。

M2中的公式(计算当前项目在行中的位置),用它填充列:

=MATCH("*",A2:L2,0)

N2中的公式(计算新项目在行中的位置),用它填充列:

=IF(M2-M1>0,N1+1,IFERROR(LOOKUP(2,1/($M$1:M1=M2),$N$1:N1),M2))

O2中的公式只是将项放在右列中,用它填充整个范围:

=IF($N2=O$1,INDEX($A2:$L2,1,$M2),"")

计算所有行需要一些时间,但我认为它会产生所需的输出。

编辑:

我想我在我的解决方案中发现了一个错误,N2中的公式应该是:

=IF(M2-M1>0,N1+1,LOOKUP(2,1/($M$1:M1<M2),$N$1:N1)+1)

我之前没有注意到它,因为它会影响行2468Amborellanae)。