完成一个单元格中提到的所有任务时的Excel条件格式

时间:2017-10-12 09:13:17

标签: arrays excel conditional-formatting

我在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"前提条件的数量可能因任务而异。

Image of desired result

1 个答案:

答案 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