[備忘] Excel VBA-如何判斷 ChartObject 是否存在

當利用 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

文章導覽

   

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *