【发布时间】:2016-07-05 22:34:27
【问题描述】:
假设我有两列。
3.5463 11
4.5592 12
1.6993 111
0.92521 112
1.7331 121
2.1407 122
1.4082 1111
2.0698 1112
2.3973 1121
2.4518 1122
1.1719 1211
1.153 1212
0.67139 1221
0.64744 1222
1.3705 11111
0.9557 11112
0.64868 11121
0.7325 11211
0.58874 11212
0.86673 11221
0.17075 11222
0.64026 12111
0.80229 12112
0.43422 12122
1.0405 12211
0.63376 12212
0.56491 12221
0.34626 12222
0.81631 111111
0.91837 111112
0.70013 111121
0.87384 111122
1.1474 111211
0.47411 111221
0.12249 111222
0.56728 112111
0.88169 112112
0.14509 112121
0.68655 112211
0.36274 112212
1.1652 121111
0.99314 121112
0.42024 121121
0.23937 121122
1.0346 122111
0.64642 122112
0.15632 122121
0.41725 122122
0.40793 122211
在第一列,有一个数字。在第二列中,这些数字中的每一个都是一个关联的 ID。现在,有一些空白行中不包含任何数字。
如果第一个号码的 ID 与第二个号码的 ID 相同,则将其中一个号码定义为另一个号码的“女儿”,并在末尾增加一个数字。例如,ID 11211 和 11212 都是 1121 的女儿,因为 1121 的 ID 在末尾添加了一个额外的数字,即 1 或 2,以形成其女儿的 ID。因此,1121 是 11211 和 11212 的父代。
这是我希望宏执行的操作。它必须输出第三列,其中包含,对于每一行,该行中第一列的编号加上该编号的父编号,以及父编号的父编号等的累积总和。直到它到达 11 或 12。它将首先在第 1 列中简单地输出 11 和 12 中的第三列中的数字。然后,在从 111 开始的循环中,它将累加每一行的总和(该行中的数字加上父级的第三列输出),仅当该行有一个数字和一个 id 时,并且仅当父级存在并且在第 3 列中有输出。 例如,ID 为 11222 的行的第 3 列中的数字应该是该行第 1 列中的数字加上 1122 的数字,再加上112,加上 11。所以,0.17075+2.4518+0.92521+3.5463,或 7.09406。但是,如果您尝试对 ID 111221 执行此操作,您会注意到父级 11122 应为空的行。因此,父节点不存在,111221 的第 3 列将不会输出任何值。
如果有人有时间为我编写此 VBA 宏以换取可接受的解决方案,我将不胜感激。
谢谢
【问题讨论】:
-
欢迎来到 SO。不幸的是,SO 不是一个免费的、为我编写代码的平台。通常,用户会希望您提出自己的解决方案的一部分,或者您无法解决的问题的非常具体的部分——而不是您希望从头开始为您编码的问题定义。 IMO,您在 excelforums.com 之类的用户可能会这样做的地方有更好的机会。或者,更好的是,自己编写一个脚本,如果您有任何具体问题,请联系我们 - 我们很乐意在这一点上提供帮助。
-
只是一个提示..尝试
SUMIF函数.. -
老实说,虽然这对于 VBA 来说看起来不够复杂,但它并不像简单的“SUMIF”那样容易以可接受的方式解决它。使用
{=SUM(SUMIF(B$2:B4,1*LEFT(B4,ROW(A$2:INDEX(A:A,LEN(B4)))),A$2:A4))}之类的东西确实有效,但是每增加一行数据,计算时间就会大大增加。即使只是这个例子也可能已经冻结了一些人。像{=SUM(IF(B$2:B4=TRANSPOSE(1*LEFT(B4,ROW(A$2:INDEX(A:A,LEN(B4))))),A$2:A4))}这样的普通数组也可以做到。 (如果不使用辅助列在没有数组公式的情况下解决它) -
@DirkReichel - 我已经为此制定了一个原生数组公式和一个 UDF(等待 OP 显示努力),但 OP 的最终条件仍然缺乏该公式。也就是说:如果链中的任何父级都不存在,则返回一个空字符串(在倒数第二段的末尾进行了描述)。 UDF 并不难得到,但我放弃了数组公式。至于使用数组公式,像这样的ID编号系统,可能有多少条记录?
-
@Jeeped 我完全错过了......然后根本不需要数组:D