Excel formula 在Excel中创建标题、副标题和副标题列表
我希望在excel中列出标题类型1、子标题类型2和子标题类型3,以及每个标题的后续实例。e、 gExcel formula 在Excel中创建标题、副标题和副标题列表,excel-formula,Excel Formula,我希望在excel中列出标题类型1、子标题类型2和子标题类型3,以及每个标题的后续实例。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([@Colu
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)
我需要计算“Output”的#个实例,但每次出现新的“Output”时,必须将其重置为1
我试图遵循的逻辑是:
(# of "Outputs" from the table header until the current row) minus
(# of "Outputs" from the table header until the last instance of "Outcome")
我尝试了几次计算行数,但都有问题
活动的逻辑是一样的,尽管这会使公式更加复杂,在我能够得到第二级排序之前,我没有费心去开始
有人知道类似的问题/解决方案吗?如果您愿意使用隐藏的辅助列,那么公式将变得更易于管理。使用A列保存“结果”、“输出”和“活动”数据 然后使用B列处理
结果
数字,C列处理输出
数字,D列处理活动
数字。将最终结果合并到E列中
在B1
、C1
和D1
中,手动写入第一个值(1
、0
和0
)
然后,从B2开始填写以下内容:
=IF(A2="Outcome",B1+1,B1)
=IF(A2="Outcome",0,IF(A2="Output",C1+1,C1))
只有在找到下一个结果时,才可以通过递增来实现
从C2
填写以下内容:
=IF(A2="Outcome",B1+1,B1)
=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,如果下一个数字不为零,我们只将
和下一个数字连接起来。我遇到了一个类似的问题,我想根据文本列表的缩进创建多级标题编号。因此,必须使用如下用户定义公式(UDF)自动生成数字:
要使其工作,必须在单元格A2中键入=“1”。A3(以下)中的相同公式必须复制到A4:A14
=NextLevelNum(A2;缩进级别(B3))
我从中获取的功能级别
函数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
选项显式
公共功能级别(参考范围)尽可能长
应用程序。挥发性
IndentLevel=参考IndentLevel
端函数
公共函数NextLevelNum(prevNumRef作为范围,级别作为整数)作为字符串
Dim prevNum作为字符串
Dim nums()作为字符串
将级别设置为整数
prevNum=prevNumRef.Value
nums=拆分(prevNum,“.”)
prevLevel=UBound(nums)+1
“谢谢你,唱诗班。”。我刚刚找到了一个解决办法,忘了我发布了这个问题。我的解决方案,在一个大的丑陋的公式是在这里-我也尝试了你的建议,它也工作得很好,稍微修改,还包括'结果','输出',或'活动'。请注意,我需要在表格中使用它,因此表格标题必须不同,并且必须是数字,使用0、-1和-2可以实现这一点,因为它在选择第一个结果后会重置。>=如果([@[Choose Level]==”,“,[@[Choose Level]]&”&[@0]&如果([@[-1]]>0,”,“&[-1]]>如果([@[-2]]>0,”,“),”,“&[-2]],”))哦,哇-单级公式确实是又大又丑!我倾向于使用helper列使事情简单化,因为有一次可怕的经历,我不得不调试一个我认为是正确的公式,这个公式有4个屏幕宽。这是如此不必要的痛苦!从那以后,我对助手专栏变得相当虔诚。当我需要我的列彼此相邻时,我会将helper列推到一边。现在我遇到了一个业务逻辑错误。如果存在第1级,即标题或结果,则必须下降到至少1个输出(第2级)和1个相关活动(第3级)。-结果必须是第一位的输出必须在结果之后。-输出之后必须至少有1个活动。-可以根据需要进行任意多的活动。-可以根据需要有任意多的结果,但后面必须有输出。-可以根据需要有任意多的输出,但是如上所述,它下面必须至少有一个活动。因为这是首先输入的数据,所以听起来不像是一个公式适合的东西。如果用户不遵守该规范,您希望得到什么样的输出?