在Excel

时间:2016-12-09 13:39:01

标签: excel-formula

我希望列出标题类型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级进行排序。

有没有人知道类似的问题/解决方案?

2 个答案:

答案 0 :(得分:1)

如果您愿意使用隐藏的帮助列,则公式变得更易于管理。使用A列保存“结果”,“输出”和“活动”数据。

然后使用B列来处理Outcome个数字,使用C列来处理Output个数字,然后使用D列来处理Activity个数字。将最终结果合并到E列中。

B1C1D1中,手动写入第一个值(100)。

然后,从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)自动生成数字:

Computing next multilevel number based on indentation

为此,您必须在单元格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