【发布时间】:2025-12-13 04:20:03
【问题描述】:
我在 VBA 中编写了一个简单的嵌套 for 循环,它遍历我的工作表中的记录,如果它根据条件找到一些值,则复制当前工作表中的值。
NumRows 和 NumRowSTGSales 的值分别是 4000 和 8000。当我运行代码时,Excel 只是挂起
Dim curRowNo As Long
curRowNo = 2
NumRowSTGSales = Worksheets("Worksheet1").UsedRange.Rows.Count
' Set numrows = number of rows of data.
NumRows = Worksheets("Worksheet2").UsedRange.Rows.Count
' Select cell a1.
' Looping through GL accounts
'Looping through items in GL accounts
For y = 2 To NumRows
'Looping through customer code found in sales data
For z = 2 To NumRowSTGSales
dataGL = Worksheets("Worksheet1").Cells(y, "A").Value
dataItem = Worksheets("Worksheet1").Cells(y, "B").Value
itemSales = Worksheets("Worksheet2").Cells(z, "F").Value
If dataItem = itemSales Then
dataCustomer = Worksheets("Worksheet2").Cells(z, "E").Value
Worksheets("CurrentWorksheet").Cells(curRowNo, "A").Value = dataGL
Worksheets("CurrentWorksheet").Cells(curRowNo, "B").Value = dataItem
Worksheets("CurrentWorksheet").Cells(curRowNo, "C").Value = dataCustomer
curRowNo = curRowNo + 1
End If
Next z
Next y
【问题讨论】:
-
您是否知道您正在玩大约 32,000,000 次内部循环的内部?而且,每个循环你都做了几个引用?当您说挂起时,您等待它完成多长时间?
-
按 control+break 并将鼠标悬停在
y和z上以检查它们的值,看看它是否卡住或循环。最终使用 F8 单步执行您的代码 -
我刚刚用你的代码运行了一个模拟,我“只使用”了
Worksheet1中的 300 行和Worksheet2中的 300 行,宏花了 3 多分钟才完成(3分 17 秒)。所以想象一下运行你的代码有超过 100 倍的数据。 -
您需要做的是使用
Vlookup函数,它将缩短您的运行时间,因为您不必遍历整个第二个工作表。 -
您可以做的一件事是将所有数据传输到 VBA 数组中,在内存中处理数组,然后在循环后将数据传回。这将涉及与电子表格之间的 4 次数据传输,而不是 1 亿次。