执行宏时Excel没有响应

执行宏时Excel没有响应,excel,vba,Excel,Vba,我对编程有点陌生,我对调试的具体知识不太了解。我目前正面临此代码的问题。它使excel在执行时大约15分钟内没有响应 我要找的是从wbZTP跟踪程序Sharepoint中提取日期,并在5天内查看是否有进入另一个wb警告跟踪程序的条目,然后返回是或否 请查看实际代码: Sub warning_lookup() Sheets("Summary").Select Application.ScreenUpdating = False Application.Calculation = xlCalcu

我对编程有点陌生,我对调试的具体知识不太了解。我目前正面临此代码的问题。它使excel在执行时大约15分钟内没有响应

我要找的是从wbZTP跟踪程序Sharepoint中提取日期,并在5天内查看是否有进入另一个wb警告跟踪程序的条目,然后返回是或否

请查看实际代码:

Sub warning_lookup()

Sheets("Summary").Select

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.DisplayAlerts = False

For cell = 2 To 1001

    Value = Cells(cell, 3)
    If Cells(cell, 5) = "Yes" Or Cells(cell, 5) = "No" Then
        If Cells(cell, 5) = "Yes" Then
            For Each x In ['Warning Tracker'!A:A]
                If x.Value = Value Then
                    If Sheets("Warning Tracker").Cells(x.Row, 3) > Cells(cell, 4) - 1 And Sheets("Warning Tracker").Cells(x.Row, 3) < Cells(cell, 4) + 6 Then
                        Cells(cell, 6) = "Yes"
                    End If
                End If
            Next
        End If

        If Cells(cell, 5) = "No" Then
            Cells(cell, 6) = ""
        Else: If Cells(cell, 6) = isblank Then Cells(cell, 6) = "No"

        End If
    End If
Next

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.DisplayAlerts = True
Application.CutCopyMode = False

End Sub

我最好的猜测是这句话:

  For Each x In ['Warning Tracker'!A:A]
这要花很长时间。对于A整列中的每个单元格,在Excel 2007或更高版本中,即超过100万个单元格,它必须检查x.value=value

将for循环更改为限制性更强的内容:

  For each x in Range("A1:A50000")
您还可以让程序计算出每次运行时50000应该是多少:

 Dim lastRow as integer
 lastRow = Range("A999999").end(xlUp).Row
 For each x in Range("A1:A" & lastRow)
     ....
在本例中,变量lastRow将保存工作表中a列中有值的最后一行

另外,您的语法在几行中看起来非常奇怪

否则:如果是一种时髦。那个冒号不应该在那里。也许这样行得通,但我以前从未见过 在VBA中,isblank不是一个东西。在这种情况下,isBlank被视为没有值的变量,因此它可能是偶然工作的。。。? 嵌套的if语句可以组合成一个。这不一定是件坏事,但所有这些嵌套都可能导致难以阅读的代码。 组合嵌套ifs的示例:

If Cells(cell, 5) = "Yes" Or Cells(cell, 5) = "No" Then
    If Cells(cell, 5) = "Yes" Then
可以是:

If (Cells(cell, 5) = "Yes" Or Cells(cell, 5) = "No") AND Cells(cell, 5) = "Yes" Then

我最好的猜测是这句话:

  For Each x In ['Warning Tracker'!A:A]
这要花很长时间。对于A整列中的每个单元格,在Excel 2007或更高版本中,即超过100万个单元格,它必须检查x.value=value

将for循环更改为限制性更强的内容:

  For each x in Range("A1:A50000")
您还可以让程序计算出每次运行时50000应该是多少:

 Dim lastRow as integer
 lastRow = Range("A999999").end(xlUp).Row
 For each x in Range("A1:A" & lastRow)
     ....
在本例中,变量lastRow将保存工作表中a列中有值的最后一行

另外,您的语法在几行中看起来非常奇怪

否则:如果是一种时髦。那个冒号不应该在那里。也许这样行得通,但我以前从未见过 在VBA中,isblank不是一个东西。在这种情况下,isBlank被视为没有值的变量,因此它可能是偶然工作的。。。? 嵌套的if语句可以组合成一个。这不一定是件坏事,但所有这些嵌套都可能导致难以阅读的代码。 组合嵌套ifs的示例:

If Cells(cell, 5) = "Yes" Or Cells(cell, 5) = "No" Then
    If Cells(cell, 5) = "Yes" Then
可以是:

If (Cells(cell, 5) = "Yes" Or Cells(cell, 5) = "No") AND Cells(cell, 5) = "Yes" Then

你有几件事可能会导致错误或冻结你的电脑

如果Cellscell,6=isblank不是有效的VBA语法,则应为IsEmptyCellscell,6

在整个列A中循环:A将永远:

替换您的:

For Each x In ['Warning Tracker'!A:A]
到存在实际数据的循环:

For Each x In Sheets("Warning Tracker").Range("A1:A" & Sheets("Warning Tracker").Cells(Sheets("Warning Tracker").Rows.Count, "A").End(xlUp).Row)
尝试用下面的代码替换您的循环。无需选择图纸,您可以改为与图纸汇总一起使用:

代码


你有几件事可能会导致错误或冻结你的电脑

如果Cellscell,6=isblank不是有效的VBA语法,则应为IsEmptyCellscell,6

在整个列A中循环:A将永远:

替换您的:

For Each x In ['Warning Tracker'!A:A]
到存在实际数据的循环:

For Each x In Sheets("Warning Tracker").Range("A1:A" & Sheets("Warning Tracker").Cells(Sheets("Warning Tracker").Rows.Count, "A").End(xlUp).Row)
尝试用下面的代码替换您的循环。无需选择图纸,您可以改为与图纸汇总一起使用:

代码


它没有响应,因为你要求它做的工作太多,而屏幕更新是关闭的,没有给你任何事情发生的迹象

假设您在Excel2007或更高版本中运行此操作,您已经创建了一个循环,可以将3个单元格的内容与另外3个单元格的内容进行完整的1048576000次比较。1001-2+1个电池x 1048576个大环路电池+1001-2+1个

这可能是31.5亿个细胞的比较。采取下面其他人列出的步骤可以减少循环的迭代次数,这可能会大大加快速度,这取决于范围内死区的数量

其他需要考虑的事情是:

将要比较的范围加载到阵列中,这对于 比较比细胞更重要。 使用状态创建进度指示器 这样用户就不会开始认为Excel崩溃了。 每隔X次比较,偶尔执行一次DoEvents。这将允许 其他可能会引起用户思考的事情 事情出了差错。
它没有响应,因为你要求它做的工作太多,而屏幕更新是关闭的,没有给你任何事情发生的迹象

假设您在Excel2007或更高版本中运行此操作,您已经创建了一个循环,可以将3个单元格的内容与另外3个单元格的内容进行完整的1048576000次比较。1001-2+1个电池x 1048576个大环路电池+1001-2+1个

这可能是31.5亿个细胞的比较。采取下面其他人提出的步骤可以减少循环的迭代次数,从而大大加快速度, 取决于范围内的死区数量

其他需要考虑的事情是:

将要比较的范围加载到阵列中,这对于 比较比细胞更重要。 使用状态创建进度指示器 这样用户就不会开始认为Excel崩溃了。 每隔X次比较,偶尔执行一次DoEvents。这将允许 其他可能会引起用户思考的事情 事情出了差错。 如果Cellscell,6=isblank不是有效的VBA语法,则应为如果ismptycellscell,6,则如果Cellscell,6=isblank不是有效的VBA语法,则应为如果ismptycellscell,则为6,则为