我希望列出标题类型1,子标题类型2和子标题类型3,并且标题的每个后续实例在excel中递增。 e.g。
Outcome 1
Output 1.1
Activity 1.1.1
Activity 1.1.2
Output 1.2
Activity 1.2.1
Activity 1.2.2
Activity 1.2.3
Outcome 2
Output 2.1
Activity 2.1.1
etc
这是我的公式 - 成为一个复杂的嵌套IF语句:
IF([@Column1]="","",
IF([@Column1]="Outcome", "Outcome " & COUNTIF(tbOOA[[#Headers],[Column1]]:[@Column1], [@Column1]),
IF([@Column1]="Output","Output "& COUNTIF(tbOOA[[#Headers],[Column1]]:[@Column1],"Outcome") ***&"."&*** COUNTIF(tbOOA[[#Headers],[Column1]]:[@Column1],[@Column1]),
"Activity " & "serious help")))
在第1列中,选择'结果','输出'或'活动'。
在第2栏中,计算适当的数字,例如输出1.2
如果行是空的,那么什么都没有。 - 很好
If it is "Outcome", count from the header until current row for the number of instances of "Outcome". - Fine
Else if it is "Output", count the number of "Outcome"s there are. - Fine
This is where it falls apart. Trying to calculate the number after the "." (bold and italic)
我需要计算"输出"的实例数,但每次有新的'结果时,必须重置为1.
我想要遵循的逻辑是:
(# of "Outputs" from the table header until the current row) minus
(# of "Outputs" from the table header until the last instance of "Outcome")
我已尝试多次尝试计算行号,但一切都有问题。
活动的逻辑是一样的,虽然会使公式更加复杂,但我还没有开始这样做,直到我能够对第2级进行排序。
有没有人知道类似的问题/解决方案?
答案 0 :(得分:1)
如果您愿意使用隐藏的帮助列,则公式变得更易于管理。使用A列保存“结果”,“输出”和“活动”数据。
然后使用B列来处理Outcome
个数字,使用C列来处理Output
个数字,然后使用D列来处理Activity
个数字。将最终结果合并到E列中。
在B1
,C1
和D1
中,手动写入第一个值(1
,0
和0
)。
然后,从B2
开始填写以下内容:
=IF(A2="Outcome",B1+1,B1)
只有在找到下一个结果时才会增加。
使用以下内容从C2
填写:
=IF(A2="Outcome",0,IF(A2="Output",C1+1,C1))
只有在找到下一个输出后才能进行递增。如果您有新的结果,它会重置为0.
然后从D2
填写
=IF(OR(A3="Outcome",A3="Output"),0,IF(A3="Activity",D2+1,D2))
它与之前的公式非常相似,但重置了结果或输出。
最后,在D4
中,将所有内容与
=B1&IF(C1>0,"."&C1&IF(D1>0,"."&D1,""),"")
&
是一个字符串连接操作。通过检查内部值是否为0,如果下一个数字不为零,我们只连接.
和下一个数字。
答案 1 :(得分:0)
我有一个类似的问题,我想根据文本列表的缩进来创建多级标题编号。因此,必须使用如下所示的用户定义公式(UDF)自动生成数字:
为此,您必须在单元格A2中键入=“ 1”。必须将A3中的相同公式(如下)复制到A4:A14中。
= NextLevelNum(A2; IndentLevel(B3))
我从https://professor-excel.com/how-to-return-the-indentation-of-a-cell-in-excel/中获取的函数IndentLevel
功能NextLevelNum我自己做了。下面的所有代码。
Option Explicit
Public Function IndentLevel(Ref As Range) As Long
Application.Volatile
IndentLevel = Ref.IndentLevel
End Function
Public Function NextLevelNum(prevNumRef As Range, level As Integer) As String
Dim prevNum As String
Dim nums() As String
Dim prevLevel As Integer
prevNum = prevNumRef.Value
nums = Split(prevNum, ".")
prevLevel = UBound(nums) + 1
' Ensure 1 <= level <= prevLevel +1
level = WorksheetFunction.Max(level, 1)
level = WorksheetFunction.Min(level, prevLevel + 1)
ReDim Preserve nums(0 To level - 1)
If level = prevLevel + 1 Then
nums(level - 1) = "1"
Else
nums(level - 1) = CStr(CInt(nums(level - 1)) + 1)
End If
NextLevelNum = Join(nums, ".")
End Function