我设法连接到网络服务并检索数据,最后将其插入到工作表中。
看起来当我执行最后一次操作时,工作表获得焦点并且屏幕不断闪烁直到结束,这对用户来说有点尴尬并且耗尽性能。我们正在谈论插入大约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世界的新手。
答案 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()
功能