通过VBA提高在单元格中获取或设置值的性能

时间:2017-03-30 13:03:46

标签: excel vba performance excel-vba

我设法连接到网络服务并检索数据,最后将其插入到工作表中。

看起来当我执行最后一次操作时,工作表获得焦点并且屏幕不断闪烁直到结束,这对用户来说有点尴尬并且耗尽性能。我们正在谈论插入大约1000行和4个不同的解析列持续约5秒钟。

有没有办法做到这一点"在背景"?我注意到基本上"每一个动作"我执行(比如读取值或设置它们)请求关注那个具体的工作表,所以我基本上将焦点返回到一切都结束后调用过程的工作表。

我的代码如下:

For i = 3 To UBound(Data) - 1
    If (IsNullOrWhiteSpace(Data(i))) Then
        Exit Sub
    End If
    splitted = Split(Data(i), ";")
    For j = 0 To UBound(splitted)

        Cells(i - 1, j + 1).Value = splitted(j)
    Next
Next

非常感谢,我是这个VBA世界的新手。

1 个答案:

答案 0 :(得分:1)

表示首发,地点:

Application.Calculation = xlCalculationManual

在您的Sub

的开头
Application.Calculation =xlCalculationAutomatic

End Sub之前

然后,让我们进一步了解加快进展的三个步骤:

第一步可能是取代:

For j = 0 To UBound(splitted)

    Cells(i - 1, j + 1).Value = splitted(j)
Next

使用:

Cells(i - 1, 1).Resize(, UBound(splitted) + 1).Value = Application.Transpose(Application.Transpose(splitted))

这样你就可以一次写一整行

第二步可以使用数组并一次性写入2D数组的内容:

Dim Data As Variant
Dim nRows As Long, nCols As Long, i As Long, j As Long

' >>>> here your code code to fill 'Data' variant array <<<<

ReDim notNullData(1 To UBound(Data) - 3) As Variant '<--| size 'notNullData' 1D Variant array to the maximum possible rows

For i = 3 To UBound(Data) - 1
    If IsNullOrWhiteSpace(Data(i)) Then Exit For '<--| exit loop at the first null or empty 'Data' value
    nRows = nRows + 1 '<--| update valid rows counter
    notNullData(nRows) = Split(Data(i), ";") '<--| fill 'notNullData' array with an array from current 'Data' row content
    If UBound(notNullData(nRows)) > nCols Then nCols = UBound(notNullData(nRows)) '<--| update maximum n° of columns to be written
Next

ReDim dataToWrite(1 To nRows, 1 To nCols + 1) As Variant '<--| size 'dataToWrite' 2D Variant array to 'Data' array valid rows number and calculated maximum nr of columns
'fill 2D 'dataToWrite' array processing 'notNullData' 1D array
For i = 1 To nRows
    For j = 0 To UBound(notNullData(i))
        dataToWrite(i, j + 1) = notNullData(i)(j)
    Next
Next

'write 2D 'dataToWrite' array in one shoit
Cells(1, 1).Resize(nRows, nCols + 1).Value = dataToWrite

第三步涉及IsNullOrWhiteSpace()功能