尝试优化表查找。通常,对于5000个条目的大小,由于逻辑不是最佳的,所以大约需要7分钟并且每次都获取表元素。有更好的方法吗?
示例表(3列)
TaskID TaskSubID Status
34567 1.2 Done
34567 1.3 Open
34568 1.5 Open
34568 1.3 Finished
34569 1.2 Open
34569 1.4 Open
任务是选择一个任务ID并检查是否有任何TaskSubID处于Status Done状态或已完成。这基本上告诉该TaskID中任何剩余的子任务都是简单的努力。 VBA脚本应添加第4列,提供工作状态。这是使用以下逻辑实现的,并且效果很好
Public Sub Effort_Check()
Dim LastCol, Lastrow, i, isFlag As Integer
Sheets("Sheet1-sample").Activate
LastCol = Sheets("Sheet1-sample").Range("A1").End(xlToRight).Column
Lastrow = Sheets("Sheet1-sample").Range("A1").End(xlDown).Row
For i = 2 To Lastrow
TaskID = Sheets("Sheet1-sample").Range("A" & i).Value
isFlag = 0
For j = 2 To Lastrow
If Sheets("Sheet1-sample").Range("A" & j) = TaskID Then
If Sheets("Sheet1-sample").Range("C" & j) = "Done" Then
isFlag = 1
ElseIf Sheets("Sheet1-sample").Range("C" & j) = "Finished" Then
isFlag = 1
End If
End If
Next j
If Sheets("Sheet1-sample").Range("C" & i) = "Open" Then
If isFlag = 1 Then
Sheets("Sheet1-sample").Cells(i, LastCol + 1) = "Simple Effort"
Else
Sheets("Sheet1-sample").Cells(i, LastCol + 1) = "New Effort"
End If
Else
Sheets("Sheet1-sample").Cells(i, LastCol + 1) = Sheets("Sheet1-sample").Range("C" & i)
End If
Next i
' Column Heading
Sheets("Sheet1-sample").Cells(1, LastCol + 1) = "Effort"
End Sub
答案 0 :(得分:0)
使用数据透视表,您可以为每个Done
中的每个Finished
按Open
,SubId
和TaskID
进行计数,并对TaskID
进行过滤如果要有选择性。但我不确定这是否符合您的要求。
答案 1 :(得分:0)
根据我的评论,将其放入D2并复制下来:
=IF(SUM(COUNTIFS($A$2:$A$7,A2,$C$2:$C$7,"Done"),COUNTIFS($A$2:$A$7,A2,$C$2:$C$7,"Finished"))>0,"Simple Effort","New Effort")