在操作EXCEL的时候遇到了这样的问题
例:有ABCDE列
这个在EXCEL中可以用插入单元格,活动单元格下移来实现,但是现在要用函数表示方法,因为数据量很多。
只是删除并移动单元格?为什么不用vba
不知道你这个问题是否已经解决, 如果还没有解决的话:在 Excel 的设计中,函数功能是一个非常重要且难点极多的部分。设计函数功能,其中的难点在于:如何以代价最小的方式获取到该 Excel 函数所有依赖的数据,并能建立起对这些依赖数据的监听机制,在依赖数据更改时触发重算。
而对于这样复杂且频繁的数据变更,显然使用普通处理事件的方式:订阅者模式是不适用的,我们很难及时地进行事件的挂载与清理。
我们知道,在 Excel 表格中,一个单元格,既可以依赖多个单元格的数据,该单元格的运算结果也可以被多个单元格所依赖。并且当单元格之间形成了相互依赖时会报出循环引用 "#REF!"
错误。
经过了之前的介绍,我们很容易想到,函数的依赖关系恰好是符合 DAG 图的特性的,因此我们采用该数据结构来存储表格内所有函数之间的依赖关系,称为表格的依赖图
。
依赖图中拥有多个单元格中存储的数据作为图顶点,(当然,在 Excel 中作为顶点的可以是任何依赖图中其它顶点的自定义数据,以下统一称之为数据节点),这些顶点之间存在的依赖关系作为图的边。
当依赖图建立完成以后,我们就能够处理任意一处的数据变更导致所有依赖节点的数据重算了。从变更的节点开始进行拓扑排序,依照生成的拓扑序列依次重算所有继任节点,直到所有相关节点数据都被更新完成。
我们来举一个例子,模拟一下计算机是怎样处理表格的依赖关系的。
假如有如下的一个 Excel 表格:
A | B | |
---|---|---|
1 | 1 | =A1*A2 |
2 | =A1+1 | =SUM(A1, A2)+B1 |
他的依赖关系是什么样的呢,我们可以很清晰地梳理出来。
再检查一下环,很好,符合DAG图的定义,可以开始计算了。
先进行一次整表的拓扑排序,得到如下结果:
A1 -> A2 -> B1 -> SUM函数 -> B2
接下来就可以依次对每个节点进行计算了。由于每个节点计算所需的参数都已经在前置处理中计算完成,因此每一个单元格的结果都是确定的。最终该Excel展现出来的结果如下,这样就帮助Excel完成了一次依赖图建造与首次计算。
A | B | |
---|---|---|
1 | 1 | 2 |
2 | 2 | 5 |
我们也可以来试试用户操作对依赖图的影响。我们可以看看把表格的A2单元格删除会发生什么。
按照之前所介绍的,当节点删除时同时也要删去其入度,变成下图这样:
接下来沿着出度对所有继任节点染色,B1单元格、SUM函数进入计算队列。
接下来遍历染色节点,由于这些节点处于依赖条件不满足,无法计算的状态,根据Excel产品的策略,他们返回计算错误结果 #VALUE!
。
(如果你在Excel中尝试了这个数据却发现没有出现错误结果,是因为Excel对空值做了默认处理,在数字计算时转化成了0。)
之后更新他们的继任节点,根据拓扑排序结果,B2单元格进入计算队列。由于#VALUE!
的结果无法正常参与计算,因此B2单元格也返回#VALUE!
。最终Excel展示结果如下:
A | B | |
---|---|---|
1 | 1 | #VALUE! |
2 | #VALUE! |
至此,Excel的依赖图结构以及数据就完成了一次更新。
使用VBA就可以了,你参考一下这个文章吧
https://zhuanlan.zhihu.com/p/340840893