【发布时间】:2014-06-02 22:26:54
【问题描述】:
我有一个 Excel 工作表,其中包含与每个操作相关的操作和时间。而且这些操作是相互联系的,有的有后继,有的没有。
我创建了一个宏来查找操作的直接后继,它运行良好。
但我想做的是找到一个操作的所有后继者。我的意思是计算后继者的后继者等等,因为我想看看如果我取消或停止这个操作会影响多少时间。
这是它的外观示例:
Lvl1 Lvl2 Lvl3 Lvl4 Lvl5
OP3---OP5----OP6
/
/
OP1
/ \
/ \
/ OP4
OP0
\
\
\
OP2---OP7
在此示例中,要从一个级别转到另一个级别,我必须运行我的宏(如果一个操作没有更多后续操作,我的宏将返回一个空数组)。
所以,目的是把所有这些操作的时间相加来找到结果。
但我不知道如何让我的循环在一个操作没有后续操作时停止,然后转到下一个操作。
例如这里,我怎么知道当我到达 OP6 时我必须回到 OP4
PS:这是我的宏的简化版本(我的文件中没有每个操作的后继者,只有前辈,这就是为什么我必须查看文件以查找我想要的操作是否在每个操作的前辈列表)
OP_number = "ER345RET"
For i = 2 To File_size
Predecessors = Split(Worksheets(1).Range("S" & i).Value, ";")
For j = 0 To UBound(Predecessors)
If Predecessors(j) = OP_number Then
Successors(q) = Worksheets(1).Range("F" & i).Value
q = q + 1
End If
Next j
Next i
【问题讨论】:
-
我的代码只是给了我一个操作的后继者。我只想知道正确迭代它的逻辑。让我们调用我的宏 find_successors(OP) 并返回数组 Successors(),其大小等于后继数
-
查看递归。 YouTube 上的 Computerphile 有一个很好的“什么是递归?”视频。如果不查看您的代码,我们不可能为您提供帮助。
-
我编辑了我的帖子,并把我的后继宏的简化版放了
-
根据您的代码,“OP5”的前身可能在单元格中写为“OP0;OP1;OP3”,对吗?如果是这样,它们是否总是按顺序排列,最右边是父节点(“OP3”是“OP5”的父节点),最左边是根节点(“OP0”)?
-
另外,每个操作的成本是否相同,或者是否有一列数据表明每个操作的成本?