我对编程很陌生,我对具体的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
答案 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列值的最后一行。
另外,你的语法在几行上看起来很奇怪。
lastRow
有点时髦。科隆不应该在那里。 (也许这有效,但我以前从未见过它)Else: If
不是VBA中的东西。在这种情况下,isBlank被视为变量,没有任何价值,所以它可能偶然起作用了??isblank
语句可以组合成一个。这并不是一件坏事,但所有这些嵌套都会导致难以阅读的代码。组合嵌套ifs的示例:
if
可能是:
If Cells(cell, 5) = "Yes" Or Cells(cell, 5) = "No" Then
If Cells(cell, 5) = "Yes" Then
答案 1 :(得分:1)
你有几件事可能会导致错误(或冻结你的电脑)
If Cells(cell, 6) = isblank
不是有效的VBA语法,应为If IsEmpty(Cells(cell, 6)) Then
。
循环整个专栏&#34; A:A&#34;将永远:
替换你的:
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亿 细胞比较。采取下面其他人规定的步骤可以减少循环的迭代次数,这可以加快速度,具体取决于范围内死区的数量。
需要考虑的其他事项是: