任何人都可以给我一些见解,为什么这需要这么长时间才能运行?我在Parallels上运行WinXP,配备16GB MacBook Pro(分配给VM的4 Gigs)。电子表格本身(由我的客户创建)是一个绝对的噩梦 - 38张完全复杂的公式,以及多步过于复杂的算法,这将使Rube Goldberg非常嫉妒。但是,这个简单的例程需要30分钟才能运行。
Sub oneList()
'Application.ScreenUpdating = False
ncols = Range("scores").Columns.Count
nrows = Range("sc_id").Rows.Count
'MsgBox nrows, ncols
ReDim Preserve scores(1 To nrows, 1 To ncols)
For i = 2 To nrows
For j = 1 To ncols
scores(i, j) = Application.Index(Range("scores"), i, j)
' Debug.Print i, j
' Debug.Print scores(i, j)
' Sheet36.Range("A1:D197").Cells(i - 1, j).Value = scores(i, j)
Next j
Next i
Sheet36.Range("A1:D197").Clear
For a = 1 To nrows
For b = 1 To ncols
Sheet36.Range("A1:D197").Cells(a, b).Value = scores(a, b)
Next b
Next a
End Sub
提前感谢任何见解。
答案 0 :(得分:3)
你有两个for循环,在那些for循环中你改变了工作表上的值。每次更改值时,公式都会在前端计算。考虑使用
停止公式自动计算application.Calculation = xlCalculationManual
然后在脚本结束时将它们重新打开
application.Calculation = xlCalculationAutomatic
当它们关闭时,您可以使用
强制执行计算application.Calculate
更新:
看起来大多数情况也是不必要的。您正在迭代一个范围,将每个单元格分配给一个二维数组,然后遍历该数组并将值吐回到不同的范围内。
为什么不呢:
Sub oneList()
Sheet36.Range("A1:D197").value2 = Range("scores").value2
End Sub
答案 1 :(得分:1)
您可以通过在一个操作中填充目标范围来提高性能:
Sub oneList()
Dim ncols As Long, nrows As Long
ncols = Range("scores").Columns.Count
nrows = Range("sc_id").Rows.Count
ReDim Preserve scores(1 To nrows, 1 To ncols)
For i = 2 To nrows
For j = 1 To ncols
scores(i, j) = Application.Index(Range("scores"), i, j)
Next j
Next i
With Sheet36.Range("A1:D197")
.Clear
.Cells(1).Resize(numrows, numcols).Value = scores
End With
End Sub
不清楚scores
数组的来源,但您可能还可以重新编写代码,从scores
范围一次填充该代码。