概述
雖然可以通過ScreenUpdating
來關閉屏幕更新,以達到加快宏代碼的速度,但並不是任何情況下都會加快。
測試環境
將excel最大化,可現實1到47行、A到Z列。
一共要測試八種情況:
- 主要在屏幕範圍外的單元格中寫入數據,範圍是A列、1到10萬行。
- 普通窗口
- 最小化窗口
- 普通窗口+
ScreenUpdating
- 最小化窗口+
ScreenUpdating
- 完全在屏幕內的單元格中寫入數據,範圍是A到Z列,1到47行。
- 普通窗口
- 最小化窗口
- 普通窗口+
ScreenUpdating
- 最小化窗口+
ScreenUpdating
測試速度的代碼
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
測試結果
測試結果的時間單位是毫秒。
- A列、1到10萬行:
測試序號 | 普通窗口 | 最小化窗口 | 普通窗口+ScreenUpdating | 最小化窗+ScreenUpdating |
---|---|---|---|---|
1 | 4432.7730 | 4400.6657 | 4379.5873 | 4379.3404 |
2 | 4432.2036 | 4396.2837 | 4366.7072 | 4374.3768 |
3 | 4430.9882 | 4397.5675 | 4357.7575 | 4375.4174 |
4 | 4432.9870 | 4406.4095 | 4376.3656 | 4369.2126 |
5 | 4433.9692 | 4407.4812 | 4359.0507 | 4380.2650 |
6 | 4443.2979 | 4444.7491 | 4365.8772 | 4385.9202 |
7 | 4434.1442 | 4396.5863 | 4386.3379 | 4393.0480 |
8 | 4436.1888 | 4418.3591 | 4378.6586 | 4383.0011 |
9 | 4432.1038 | 4401.5464 | 4366.8590 | 4376.4804 |
10 | 4443.4500 | 4411.1933 | 4353.5939 | 4377.3599 |
- A到Z列,1到47行:
測試序號 | 普通窗口 | 最小化窗口 | 普通窗口+ScreenUpdating |
最小化窗+ScreenUpdating |
---|---|---|---|---|
1 | 4055.8265 | 778.5692 | 550.5343 | 548.2441 |
2 | 4099.1295 | 775.6368 | 549.9552 | 551.3519 |
3 | 4075.3943 | 772.7159 | 548.8944 | 548.6186 |
4 | 4075.6114 | 775.3457 | 549.6685 | 547.8429 |
5 | 4081.8920 | 771.8189 | 548.7364 | 548.4509 |
6 | 4097.6187 | 773.4570 | 551.5706 | 547.0464 |
7 | 4056.6997 | 773.3298 | 549.6368 | 548.7333 |
8 | 4076.8709 | 770.2947 | 550.1524 | 550.8938 |
9 | 4083.8638 | 774.5747 | 548.9687 | 547.5058 |
10 | 4071.2810 | 774.3275 | 552.3702 | 549.2266 |
結論
在對A列、1到10萬行的單元格寫入時,ScreenUpdating
的效果微乎其微,10萬次寫入才減少了66ms。
A到Z列,1到47行的單元格寫入時,ScreenUpdating
的效果極爲明顯,僅僅1222次(47*26)寫入就減少了3527ms。
普通窗口和最小化窗口相比,最小化也有着略次於ScreenUpdating
的效果,1222次僅比ScreenUpdating
慢220ms。
綜上所述,ScreenUpdating
有其侷限性:僅對屏幕顯示的單元格有效,但其效果顯著。