當利用 VBA 新增一 ChartObject,如下:
Dim chobj As ChartObject Set chobj = Worksheets("Sheet1").ChartObjects.Add(50, 40, 400, 200) chobj.name = "chart1" |
則該 Excel 工作表關閉後,該 ChartObject 仍然存在。可以想像工作表關閉後,在工作表內所包含的工作表 (Worksheet)、圖表等物件生命仍存在 (除非物件被 Destroy),它只是被永續冬眠 (hibernate)至檔案資料庫內,待開啟檔案後,這些物件會再次的活化 (Activation)。
問題:如果手動刪除掉該 ChartObject,該如何在 VBA 程式內判斷已不存在,而需要自動再新增同名的 ChartObject?
解決方案:程序內需要宣告「On Error」陳述,然後利用任一陳述式(statement,如 If or With) ,可直接參考 (reference)到該 ChartObject。若不存在,則該陳述會發生錯誤,然後再判斷該錯誤代碼,在錯誤區塊 (block)內新增同名的 ChartObject。
說明:
直覺上應該是利用 If...Condition 來判斷該物件是否存在即可。例如:
If (Worksheets("Sheet1").ChartObjects("chart1")) Is Nothing Then 'Add the ChartObject End If |
但其實上述陳述是錯誤的,因為如果判斷式內所參考的物件不存在,則會直接拋出錯誤。所以應該是在當該物件因不存在拋出錯誤後,然後再來才在處理該錯誤代碼的區塊內撰寫新增該物件的陳述。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Sub MakeCharts() On Error GoTo ErrHandler: '如果不存在該物件,會發生 '1004' 錯誤,然後再去新增該物件 With Worksheets("Sheet1").ChartObjects("chart1") End With Exit Sub '切記要加上一陳述,避免造成出無限迴圈。 ErrHandler: If Err.Number = 1004 Then Dim chobj As ChartObject Set chobj = Worksheets("Sheet1").ChartObjects.Add(50, 40, 400, 200) chobj.name = "chart1" Resume '回至發生錯誤的陳述處,繼續執行下一列陳述。 End If End Sub |
同樣的處理方式也可以應用在 "Dynamic Named Ranges" 物件上,如此就可以利用 VBA 程式化而能更具彈性地來控制這些物件的生命週期。
※ 延伸參考
o How to Determine if an Excel Chart Exists。
o Error Handling In VBA。
o Debugging VBA Code。