VBA中ScreenUpdating对速度提升的局限性和效果

概述

虽然可以通过ScreenUpdating来关闭屏幕更新,以达到加快宏代码的速度,但并不是任何情况下都会加快。

测试环境

将excel最大化,可显示1到47行、A到Z列。

一共要测试八种情况:

  1. 在屏幕范围外的单元格中写入数据,范围是A列、1到10万行。
    1. 普通窗口
    2. 最小化窗口
    3. 普通窗口+ScreenUpdating
    4. 最小化窗口+ScreenUpdating
  2. 在屏幕范围内的单元格中写入数据,范围是A到Z列,1到47行。
    1. 普通窗口
    2. 最小化窗口
    3. 普通窗口+ScreenUpdating
    4. 最小化窗口+ScreenUpdating

excel可现实的范围

测试速度的代码

Private Declare Function QueryPerformanceCounter Lib "KERNEL32" (lpPerformanceCount As Currency) As Long
Private Declare Function QueryPerformanceFrequency Lib "KERNEL32" (lpFrequency As Currency) As Long

Private m_Frequency   As Currency
Private m_Start       As Currency
Private m_Now         As Currency
Private m_Available   As Boolean

Sub TestSpeet()

m_Available = (QueryPerformanceFrequency(m_Frequency) <> 0)
If Not m_Available Then
Debug.Print "Performance Counter not available"
End If

Dim i As Long, j As Long, m As Long

QueryPerformanceCounter m_Start

' 以下四个代码块中选一个,配合窗口是否最小化分别执行。

' A列、1到10万行:普通窗口、最小化窗口
For i = 1 To 100000 Step 1
    Cells(i, 1) = CStr(i)
Next i

' A列、1到10万行:普通窗口+ScreenUpdating、最小化窗口+ScreenUpdating
Application.ScreenUpdating = False
For i = 1 To 100000 Step 1
    Cells(i, 1) = CStr(i)
Next i
Application.ScreenUpdating = True

' A到Z列,1到47行:普通窗口、最小化窗口
For i = 1 To 10 Step 1
    For j = 1 To 47 Step 1
    For m = 1 To 26 Step 1
    Cells(j, m) = CStr(i)
    Next m
    Next j
Next i

' A到Z列,1到47行:普通窗口+ScreenUpdating、最小化窗口+ScreenUpdating
Application.ScreenUpdating = False
For i = 1 To 10 Step 1
    For j = 1 To 47 Step 1
    For m = 1 To 26 Step 1
    Cells(j, m) = CStr(i)
    Next m
    Next j
Next i
Application.ScreenUpdating = True

QueryPerformanceCounter m_Now

Elapsed = 1000 * (m_Now - m_Start) / m_Frequency
Debug.Print Format(Elapsed, "#.0000")
End Sub

测试结果

测试结果的时间单位是毫秒。

  1. A列、1到10万行:
测试序号普通窗口最小化窗口普通窗口+ScreenUpdating最小化窗+ScreenUpdating
14432.77304400.66574379.58734379.3404
24432.20364396.28374366.70724374.3768
34430.98824397.56754357.75754375.4174
44432.98704406.40954376.36564369.2126
54433.96924407.48124359.05074380.2650
64443.29794444.74914365.87724385.9202
74434.14424396.58634386.33794393.0480
84436.18884418.35914378.65864383.0011
94432.10384401.54644366.85904376.4804
104443.45004411.19334353.59394377.3599
  1. A到Z列,1到47行:
测试序号普通窗口最小化窗口普通窗口+ScreenUpdating最小化窗+ScreenUpdating
14055.8265778.5692550.5343548.2441
24099.1295775.6368549.9552551.3519
34075.3943772.7159548.8944548.6186
44075.6114775.3457549.6685547.8429
54081.8920771.8189548.7364548.4509
64097.6187773.4570551.5706547.0464
74056.6997773.3298549.6368548.7333
84076.8709770.2947550.1524550.8938
94083.8638774.5747548.9687547.5058
104071.2810774.3275552.3702549.2266

结论

在对A列、1到10万行的单元格写入时,ScreenUpdating的效果微乎其微,10万次写入才减少了66ms。

A到Z列,1到47行的单元格写入时,ScreenUpdating的效果极为明显,仅仅1222次(47*26)写入就减少了3527ms。

普通窗口和最小化窗口相比,最小化也有着略次于ScreenUpdating的效果,1222次仅比ScreenUpdating慢220ms。

综上所述,ScreenUpdating有其局限性:仅对屏幕正在显示的单元格有效,但其效果显著。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值