【问题标题】:Generating a Unique, Sequential ID in Excel According to the String Value in Another Column根据另一列中的字符串值在 Excel 中生成唯一的顺序 ID
【发布时间】:2021-08-10 13:59:03
【问题描述】:

在我的 Excel 工作表的 A 列中,我试图根据 C 列中的“活动类型”在每一行中创建一个唯一的、连续的 ID。Activity Title 在 B 列中,但是这两个相关列例如 A 列和 C 列。共有三种活动类型:MilestonesTasksSubtasks

这看起来很简单,但为了确保我提供了所有相关细节,“里程碑”就像一部敏捷史诗 - 它是最大的工作体,可以有多个任务和子任务与之对齐。 “任务”就像一个敏捷特性——一个“任务”可以有多个与其对齐的子任务。最后,“子任务”就像一个敏捷的用户故事——它是最小的工作体,不会有任何与之对齐的东西(或在它下面)。

对于属于一个里程碑的“任务”的数量也没有限制或模式,对于属于一个“任务”的“子任务”的数量也没有限制或模式。理想情况下,我希望以以下格式自动生成 ID:

ID (ColA) Activity Type (Col C)
1 Milestone
1.1 Task
1.2 Task
1.21 Subtask
1.22 Subtask
1.3 Task
1.31 Subtask
2 Milestone
2.1 Task
2.11 Subtask
2.12 Subtask
2.13 Subtask
2.2 Task
2.21 Subtask

我应该提到,我已经在 VBA 中有一些代码可以根据活动类型自动缩进 B 列(活动名称)和 C 列(活动类型)中的数据。该代码包含在下面:

Private Sub Worksheet_Change(ByVal Target As Range)

On Error GoTo ErrHandler
 
If Intersect(Target, Range("C:C")) Is Nothing Then Exit Sub

        If Target = "Task" Then
            Target.IndentLevel = 1
            Target.Offset(0, -1).IndentLevel = 1
        ElseIf Target = "Subtask" Then
            Target.IndentLevel = 2
            Target.Offset(0, -1).IndentLevel = 2
        End If

ErrHandler:
End Sub

非常感谢您提供的任何和所有帮助 - 提前致谢!

【问题讨论】:

  • 2.221.23 不应该是 2.122.13 吗?您的问题中有错别字?
  • C 列实际上是否列为里程碑、任务、子任务?或者这些是任务的实际名称等等?试图了解这里的信息类型以及我们是否可以使用它来创建 ID。现在,我认为我们可以使用一些数学运算,例如 IF ColC = "Milestone", x + 1, if ColC = "Task", x + .1 等。
  • 公式:放入A2并抄下:=IFERROR(ROUNDDOWN(A1+1/10^(MATCH(B2,{"Milestone","Task","Subtask"},0)-1),(MATCH(B2,{"Milestone","Task","Subtask"},0)-1)),1)
  • BTW,如果任务或子任务的数量没有限制,当任务或子任务的数量超过9个时会发生什么?
  • 在大多数情况下,该列被格式化为文本,使用. 表示级别更改:1.2.3 第一个里程碑,第二个任务,第三个子任务。那么有多少任务或子任务并不重要。而且以后解析起来也更容易。

标签: excel vba


【解决方案1】:

我使用了一个 Excel 公式来实现这种交互。它读取上面的数字,以及它所在行中的活动类型,并决定它的数字应该是什么。

=IFERROR(IF(C3="Milestone",FLOOR(A2,1)+1,IF(C3="Task",FLOOR(A2,0.1)+0.1,A2+0.01)),1)

将公式放入第三行并向下拖动。

针对上面关于使用 1.1.1 样式的格式的讨论,这里有一个可以自动生成这些数字的公式:

=IF(C3="Milestone", (LEFT(A2, FIND(".",A2)-1)+1 )&".0.0", IF(C3="Task", LEFT(A2, FIND(".",A2))&(MID(A2,FIND(".",A2)+1,FIND(".",A2,FIND(".",A2)+1)-FIND(".",A2) )+1)&".0", LEFT(A2,FIND(".",A2, FIND(".",A2)+1))&(RIGHT(A2, LEN(A2)- FIND(".",A2, FIND(".",A2)+1))+1)))

公式使用 Left 和 Find 来根据“.”分割文本。并根据活动类型对其进行迭代或重置。将第一个里程碑 ID 设置为“1.0.0”并将此公式放在其下方的行中。

我试图想出一个公式,将里程碑设置为“1、2、3”而不是“1.0.0、2.0.0、3.0.0”,但这样做会使 Left 和 Find 返回空白字符串和包括 If 语句和 IFERROR 语句来处理可能的空白将使公式的大小乘以三倍。对我来说很不满意。

【讨论】:

  • 如果 A1 中有标题,使用此公式时,A2 会出错。如果 A1 是文本,FLOOR(A1,1) 将返回错误。
  • 没错,我忘了调整它以考虑标题。
  • 对于上下文,第 1 行是标题,第 2 行是第一个里程碑@Toddleson
  • @WynPonder 是的,这应该适用于第 1 行标题。
  • 太棒了!在上面看到您关于在第一个里程碑之后开始的评论并且它有效!不过,对于@ScottCraner 的观点,有没有办法对此进行调整,以便它反映具有第二个小数点的里程碑以说明 10 多个任务和子任务(例如 1.11.12)?因为现在如果超过10个任务,默认为下一个整数,这意味着一个新的里程碑(即1.9之后的任务默认为2个)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 2023-01-03
  • 2011-01-12
  • 1970-01-01
  • 2020-06-09
  • 2021-08-05
相关资源
最近更新 更多