如何在Excel VBA中优化大表的双重查询

试图优化表查找。 通常情况下,对于大小为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 

任务是select一个任务ID,并检查是否有任何人的TaskSubID是状态完成或完成。 这基本上告诉该TaskID中的任何剩余的子任务是简单的努力。 VBA脚本应该添加一个提供努力状态的第四列。 这是使用以下逻辑实现的,并且运行良好

  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 

根据我的评论,把这个在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") 

使用数据透视表,您可以通过DoneFinishedOpen每个TaskID每个SubId并在TaskID筛选(如果有select性)。 不过,我不确定这是否符合您的要求。