我在excel中有一个TODO列表,其中所有任务都被分类并具有唯一ID(1.1,1.2,2.1等)。某些任务需要完成一个或多个其他任务(即1.4只能在1.1,1.2,1.3和2.5完成时启动)。用户可以添加自己的标准,以确定必须完成哪些任务。这可以是任务的任意组合。
表信息:
Column A
- ID(1.1; 1.2; 2.1; 2.2)
Column H
- 状态(其中" V"表示已选中的符号,表示已完成)
Column K
- 前置条件(用户输入如" 3.1,2.1,4.5和#34;作为一个文本值)
我想测试单元格中的每个ID(可以是无对数),并且如果单元格中写入的所有任务都已完成,它将对应相应的状态并格式化单元格。
有没有人知道这样做的好方法?
图片显示了任务列表的摘要。您会在第5行(ID 1.2)中看到K列中的单元格为绿色,因为已完成所述ID。当任务2.3和3.1完成时,第27行(ID 3.2)应显示绿色值(在H列中也有一个" V"前提条件的数量可能因任务而异。
答案 0 :(得分:0)
第一部分非常简单,因为当作为K列的条件格式输入时,下面的公式适用于K5,K6和K15。
=countifs($A$1:$A$1000,$K1,$H$1:$H$1000,"v")>0
检查具有多个任务的单元格更加困难,您可能需要将它们拆分为隐藏列中的单元格以进行检查。
您可以使用自定义VBA功能检查具有多个任务的单元格。将该函数添加到VBA模块并保存,然后在K列的条件格式中使用公式=canStart(K1)=True
。
这将检查无限制的子任务,但不会自动更新,因此您需要定期使用 Ctrl + Alt + F9 进行更新。< / p>
Function canStart(Rng As Range) As Variant
Dim arrSubtasks As Variant
Dim subTasksComplete As Boolean
If Rng.Value <> "" Then 'check if there is a subtask in the cell
If InStr(1, Rng.Value, ",") > 0 Then ' check if there is more than 1 subtask (look for a comma)
arrSubtasks = Split(Rng.Value, ",") ' create an array of all the subtasks in the cell
subTasksComplete = True ' set sub tasks as complete
For Each subTask In arrSubtasks ' loop through each subtask
If Application.WorksheetFunction.CountIfs(Range("A2:A1000"), subTask, Range("K2:K1000"), "v") = 0 Then 'if the subtask being checked is not found as complete
subTasksComplete = False ' mark subTasksComplete as false and do not continue to check the others (save some time)
Exit For
End If
Next
Else ' if there is only one subtask then check if it's complete
subTasksComplete = True
If Application.WorksheetFunction.CountIfs(Range("A2:A1000"), Rng.Value, Range("K2:K1000"), "v") = 0 Then
subTasksComplete = False
End If
End If
canStart = subTasksComplete 'set the returned value to the value of subtasksComplete
End If
End Function