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

时间:2014-05-28 19:50:44

标签: excel vba excel-vba optimization

尝试优化表查找。通常,对于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

2 个答案:

答案 0 :(得分:0)

使用数据透视表,您可以为每个Done中的每个FinishedOpenSubIdTaskID进行计数,并对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")