真的很慢

时间:2014-10-06 15:12:55

标签: excel vba multidimensional-array

任何人都可以给我一些见解,为什么这需要这么长时间才能运行?我在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

提前感谢任何见解。

2 个答案:

答案 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范围一次填充该代码。