【发布时间】:2020-11-21 15:56:48
【问题描述】:
我有一个 for next 循环,它运行了几十万行,对大部分内容进行了更改。数组可以让这段代码运行得更快吗?
我的 for 循环示例。有时它会超载并使 Excel 崩溃。 (仅供参考,我的循环必须从下到上运行才能达到预期目的。)
Sub RemoveDuplicates()
Dim shWorkBook As Worksheet
Dim wkb As Workbook
Dim FullYearData As Worksheet
Set wkb = ThisWorkbook
With wkb
Set shWorkBook = .Sheets("Workbook")
Set shFullYearData = .Sheets("FullYearData")
End With
Dim i As Long
Dim LastRowW As Long
On Error Resume Next
Call TurnOffCalc
FirstRowW = shWorkBook.Cells(1, 1).Row
FirstColW = shWorkBook.Cells(1, 1).Column
LastRowW = shWorkBook.Cells(Rows.Count, 1).End(xlUp).Row
LastColW = shWorkBook.Cells(2, Columns.Count).End(xlToLeft).Column
i = LastRowW
Sum = 0
shWorkBook.Activate
For i = LastRowW To 1 Step -1
If shWorkBook.Cells(i, 7) = shWorkBook.Cells(i - 1, 7) Then
shWorkBook.Cells(i, 26) = vbNullString
End If
If shWorkBook.Cells(i, 26).Value <> "" Then
shWorkBook.Cells(i, 27) = Sum + Cells(i, 25).Value
Sum = 0
ElseIf shWorkBook.Cells(i, 26).Value = "" Then
Sum = shWorkBook.Cells(i, 25).Value + Sum
End If
Next
p = FirstRowW + 1
For p = FirstRowW + 1 To LastRowW Step 1
shWorkBook.Cells(p, 28) = Application.WeekNum(shWorkBook.Cells(p, 3))
Next
shWorkBook.Cells(1, 28).Value = "Week Number"
Call TurnOnCalc
End Sub
【问题讨论】:
-
好的,这里有很多事情要做,所以我首先将
Option Explicit添加到模块顶部并正确声明所有变量。FirstRowW和FirstColW的用途是什么?这些总是1。然后你去制作p = FirstRowW + 1,它总是2,然后在下一行将它用作迭代(所以这是没有意义的)。shFullYearData有什么意义?我没有看到它在任何地方使用。最后,您需要删除On Error Resume Next以查看您是否真的遇到错误,而不是 Excel 只是“过载和崩溃”。 -
你需要清楚——有一次你说你想使用一个数组来让你的代码更快,但是你声称你的代码根本不起作用?如果您的代码甚至无法编译/运行,为什么还要担心速度?
-
所以代码确实有效,只是在运行整个数据集时需要很长时间,所以我想看看是否有一种方法可以更有效地完成我的 for next 循环所做的事情。 shFullYearData 是工作簿中的另一张表,我想在那里没有任何目的
-
为什么不在你的循环中移动
shWorkBook.Cells(p, 28) = Application.WeekNum(shWorkBook.Cells(p, 3))而只使用i而不是p?除非这些单元格是基于您的第一个循环的结果的公式?