Excel在执行宏时没有响应

时间:2017-09-14 13:27:37

标签: excel-vba vba excel

我对编程很陌生,我对具体的debuggin并不是很了解。我目前遇到此代码的问题。它使excel在执行时大约15分钟没有响应。

我正在寻找的是从wb(ZTP Tracker 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

3 个答案:

答案 0 :(得分:3)

我最好的猜测是这一行:

// get favorites from local storage or empty array
var favorites = JSON.parse(localStorage.getItem('favorites')) || [];
// add class 'fav' to each favorite
favorites.forEach(function(favorite) {
  document.getElementById(favorite).className = 'fav';
});
// register click event listener
document.querySelector('.list').addEventListener('click', function(e) {
  var id = e.target.id,
      item = e.target,
      index = favorites.indexOf(id);
  // return if target doesn't have an id (shouldn't happen)
  if (!id) return;
  // item is not favorite
  if (index == -1) {
    favorites.push(id);
    item.className = 'fav';
  // item is already favorite
  } else {
    favorites.splice(index, 1);
    item.className = '';
  }
  // store array in local storage
  localStorage.setItem('favorites', JSON.stringify(favorites));
});

// local storage stores strings so we use JSON to stringify for storage and parse to get out of storage

永远服用。你是说&#34;对于A&#34;的整个列中的每个单元格。在Excel 2007或更高版本中,超过100万个单元格,它必须检查是否 For Each x In ['Warning Tracker'!A:A]

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

x.value = Value

你也可以让程序弄清楚每次运行50000应该是什么:

  For each x in Range("A1:A50000")

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

另外,你的语法在几行上看起来很奇怪。

  1. lastRow有点时髦。科隆不应该在那里。 (也许这有效,但我以前从未见过它)
  2. Else: If不是VBA中的东西。在这种情况下,isBlank被视为变量,没有任何价值,所以它可能偶然起作用了??
  3. 您的嵌套isblank语句可以组合成一个。这并不是一件坏事,但所有这些嵌套都会导致难以阅读的代码。
  4. 组合嵌套ifs的示例:

    if

    可能是:

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

答案 1 :(得分:1)

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

  1. If Cells(cell, 6) = isblank 不是有效的VBA语法,应为If IsEmpty(Cells(cell, 6)) Then

  2. 循环整个专栏&#34; A:A&#34;将永远:

  3. 替换你的:

    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)
    

    尝试使用下面的代码替换你的循环(不需要Select表单,您可以使用With Sheets("Summary")代替):

    <强> 代码

    With Sheets("Summary")
        For cell = 2 To 1001
    
            Value = .Cells(cell, 3)
            If .Cells(cell, 5) = "Yes" Then
                For Each x In Sheets("Warning Tracker").Range("A1:A" & Sheets("Warning Tracker").Cells(Sheets("Warning Tracker").Rows.Count, "A").End(xlUp).Row)
                    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 IsEmpty(.Cells(cell, 6)) Then .Cells(cell, 6) = "No"
            End If
        Next
    End With
    

答案 2 :(得分:1)

由于您要求它完成的纯粹工作,它没有响应,而屏幕更新已关闭,并且没有任何迹象表明发生了某些事情。

假设您在Excel 2007或更高版本中运行此功能,您创建了一个循环,可能会将3个单元格的内容与另外3个单元格的内容进行比较,整数为1,048,576,000次。 (1001-2 + 1个细胞x 1,048,576个大环的细胞+ 1001-2 + 1个以后)

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

需要考虑的其他事项是:

  • 将要比较的范围加载到更快的数组中 比细胞更比较。
  • 使用状态创建进度指示器 因此用户不会开始认为Excel已经崩溃了。
  • 每X次比较偶尔执行一次DoEvent。这个允许 其他可能导致用户思考的事情 事情出了问题。