工作表中存在大量的細(xì)小圖形對象
很多用戶都遇到過Excel 文件在使用過程中不斷增肥,反應(yīng)越來越遲鈍的現(xiàn)象,甚至發(fā)生文件損壞而丟失重要數(shù)據(jù)的可怕事件。如果是因為有大量數(shù)據(jù)的輸入,那么文件體積增加也無可非議,此時應(yīng)該通過優(yōu)化表結(jié)構(gòu)、把數(shù)據(jù)分散保存到多個工作簿文件的方法來減小單個文件的體積。然而,在很多時候,這些擁有“臃腫”身材的工作簿文件里面只有少量的數(shù)據(jù),那么,它是怎么“肥”起來的呢?
本技巧中會羅列一些常見的Excel 文件體積虛增的原因及處理辦法。
1 工作表中存在大量的細(xì)小圖形對象
工作表中如果存在大量的細(xì)小圖形對象,那么文件體積就可能在用戶毫不知情的情況下暴增,這是一種很常見的“Excel 肥胖癥”?梢允褂孟旅鎯煞N方法來檢查Excel 工作表是否存在這種癥狀。
(1)在工作表中按鍵調(diào)出“定位”對話框,單擊“定位條件”按鈕,在“定位條件”對話框中選擇“對象”項,單擊“確定”,如圖1 所示。然后觀察工作表上是否會顯示很多被選定的對象。
 

24-1

如果工作簿中包含多個工作表,需要在每個工作表中用這種方法進(jìn)行查找。關(guān)于“定位”功能的更多技巧,請參閱技巧28。
注意:隱藏列或行中的對象利用這種方法無法被看到。
(2)用VBA 對工作簿中的對象進(jìn)行計數(shù),查看在每個工作表中實際存在的對象數(shù)量,如果此數(shù)量不合理,就說明有問題。按打開VBA 編輯器窗口,單擊菜單“插入”→“模塊”來插入一個新模塊,默認(rèn)情況下為“模塊1”,然后在模塊1 的代碼窗口中輸入以下代碼:
Sub CountShapes()
Dim n As Double
Dim ws As Worksheet
Dim Content As String
For Each ws In Worksheets
n = ws.Shapes.Count
Content = Content & "工作表" & ws.Name & " 有" & n & " 個對象" & vbCrLf
Next
MsgBox Content
End Sub
最后,按F5 鍵來運(yùn)行這段代碼,就能看到檢查結(jié)果。在看似空白的工作表中,存在著大量的圖形對象,如圖2 所示。
 

24-2

誤設(shè)單元格格式或者條件格式
如果確認(rèn)在工作表中存在大量的對象,而用戶并不需要它們,可以用兩種方法來處理:
(1)剛才的定位方法中,當(dāng)對象全部處于被選擇狀態(tài)時按鍵刪除它們即可。
(2)使用宏在多個工作表中更加精確地刪除這些無用對象。比如,可以根據(jù)需要只刪除高度和寬度都小于14.25 磅(0.5 cm)的對象。
只刪除活動工作表中特定大小的對象的代碼為:
Sub DelShapes()
Dim sp As Shape, n
For Each sp In ActiveSheet.Shapes
If sp.Width < 14.25 And sp.Height < 14.25 Then
sp.Delete
n = n + 1
End If
Next sp
MsgBox "共刪除了" & n & "個對象"
End Sub
刪除所有工作表中的特定大小的對象的代碼為:
Sub DelAllShapes()
Dim ws As Worksheet
Dim sp As Shape
Dim n As Double
Dim Content As String
For Each ws In Worksheets
For Each sp In ws.Shapes
If sp.Width < 14.25 And sp.Height < 14.25 Then
sp.Delete
n = n + 1
End If
Next
Content = Content & "工作表" & ws.Name & " 刪除了" & n & " 個對象" & vbCrLf
n = 0
Next
MsgBox Content
End Sub
這些令人疑惑的對象的產(chǎn)生原因可能有以下幾個。從網(wǎng)頁上復(fù)制內(nèi)容后直接粘貼到工作表中,而沒有使用選擇性粘貼。無意中使用繪圖工具欄的直線工具或其他繪圖工具,不知不覺中在工作表中插入了小的直線或其他圖形對象,由于尺寸很小,于肉眼幾乎無法看到。而后,又通過單元格的復(fù)制產(chǎn)生了大量的小繪圖對象。在工作表中插入了圖片或其他繪圖對象,操作中又將其高度寬度設(shè)為0 或很小的值,通過復(fù)制產(chǎn)生了大量的對象。
在行或列的位置中插入了繪圖對象,對象的屬性為“大小位置隨單元而變的(默認(rèn)的)”,然后隱藏行或列,或設(shè)置行高或列寬為很小的值,從而使插入的對象不能看到。工作表中的對象設(shè)置了不可見屬性(Visible=false),或?qū)ο蟮木條與填充色均設(shè)與背景色相同,使對象無法被看到。
2 工作表中在較大的區(qū)域內(nèi)設(shè)置了單元格格式或者條件格式
仔細(xì)觀察工作表滾動條,如果滑標(biāo)很小,且拖動滑標(biāo)向下到底,可以到達(dá)很大的行號或列標(biāo),可是工作表中實際使用到的區(qū)域很小,如圖3 所示。這就說明,有相當(dāng)大一塊區(qū)域可能被設(shè)置了單元格格式或者條件格式,這些并沒有被用到的單元格,能對文件體積產(chǎn)生很大的影響。
解決辦法如下。單擊到真正需要的行號的下一行,按組合鍵,選擇所有的多余行(也可以在名稱框中輸入行號如2000∶65536),單擊菜單“編輯”→“清除→“格式”(或全部)。同理,也可以清除多余列的格式。
有時,用戶確實需要為工作表中空白的區(qū)域預(yù)設(shè)格式,以備將來增加數(shù)據(jù)之用,但一定要使用正確的方法,否則就會造成大量用不到的區(qū)域被預(yù)設(shè)了格式,徒增文件體積。
如果需要在一行或一列的很大范圍設(shè)置統(tǒng)一的單元格格式,可以選擇整行或整列設(shè)置單元格格式,而不要只選擇行列的一部分單獨設(shè)置格式。前者不會造成文件體積虛增的問題,而后者會增加文件體積。試驗一下在兩個Excel 文件里面分別對A1∶A65536 設(shè)置單元格格式和對A∶A 設(shè)置單元格格式,目的都是為A 列設(shè)置格式,但最終文件的體積相差100 倍以上。