Nội dung cơ bản
2. Xóa Graph
Tại sao phải xóa Parent?
Ta hãy xem xét việc xóa đồ thị dưới đây.
Bạn cần đăng nhập để thấy hình ảnh
Sub xoa1()
ActiveSheet.ChartObjects("Chart 1").Delete
End Sub
Đoạn code trên đây là đủ để xóa đồ thị ra khỏi sheet. Giả sử như trên sheet có rất nhiều đồ thị, khi đó ta sẽ code như sau:
Sub xoaAll()
Dim i As Long
With ActiveSheet
For i = .ChartObjects.Count To 1 Step -1
.ChartObjects(i).Delete
Next i
End With
End Sub
Đoạn code trên hoạt động tốt. Nhưng bây giờ ta hãy thử nếu dùng chức năng record macro thì việc xóa sẽ tạo thành code như thế nào?
Tôi thu được code như sau:
Sub Macro1()
'
' Macro1 Macro
'
'
ActiveSheet.ChartObjects("Chart 1").Activate
ActiveChart.Parent.Delete
End Sub
Nhìn vào code trên, có một câu hỏi đặt ra, đó là tại sao lại là xóa
Parent?
Để xác nhận rút cuộc
Parent này là gì, ta hãy chạy thử đoạn code dưới đây.
Sub Macro_thvba()
Dim msg As String
ActiveSheet.ChartObjects("Chart 1").Activate
msg = msg & "Selection:" & vbCrLf
msg = msg & TypeName(Selection) & "(" & Selection.Name & ")" & vbCrLf & vbCrLf
msg = msg & "Selection.Parent:" & vbCrLf
msg = msg & TypeName(Selection.Parent) & "(" & Selection.Parent.Name & ")" & vbCrLf & vbCrLf
msg = msg & "ActiveChart:" & vbCrLf
msg = msg & TypeName(ActiveChart) & "(" & ActiveChart.Name & ")" & vbCrLf & vbCrLf
msg = msg & "ActiveChart.Parent:" & vbCrLf
msg = msg & TypeName(ActiveChart.Parent) & "(" & ActiveChart.Parent.Name & ")"
MsgBox msg
ActiveChart.Parent.Delete
End Sub
Bạn cần đăng nhập để thấy hình ảnh
Đến đây ta đã hiểu, có vẻ như thứ được xóa không phải là Selection.Parent mà là ActiveChart.Parent .
Bạn cần đăng nhập để thấy hình ảnh
Thân của Graph là Chart Object. Đó là các đường series nối các điểm trong đồ thị, là các trục tọa độ của Graph, là màu nền của Graph. Khi chúng ta chỉnh sửa đồ thị, chúng ta thao tác với nó.
Chứa Chart Object là ChartObject Object. Nói một cách đơn giản, ChartObject Object chỉ đơn thuần là đường bao bên ngoài của đồ thị.
Tự bản thân ChartObect Object không có phương thức hay thuộc tính gì. Tuy nhiên nếu muốn thao tác với Chart Object thì ta phải chỉ định thông qua đối tượng quản lý nó, đó là ChartObject Object.
Một đối tượng nữa đó chính là ShapeRange Object. Khi chúng ta điều chỉnh màu các cột dữ liệu trong đồ thị, chúng ta sẽ chỉnh sửa thông qua đối tượng này.
Nào, hãy quay lại câu chuyện chính của chúng ta, việc xóa đồ thị bằng code dưới đây:
Sub xoa1()
ActiveSheet.ChartObjects("Chart 1").Delete
End Sub
Thực chất là chúng ta đã xóa đường bao của đồ thị. Và tất nhiên khi xóa đường bao thì mọi thứ bên trong đường bao cũng sẽ bị mất đi.
Vậy thì cái code mà chúng ta thu được thông qua Record macro nó có ý nghĩa gì đây?
Tôi phân tích thông qua comment vào code dưới đây:
Sub Macro1()
'
' Macro1 Macro
'
'
ActiveSheet.ChartObjects("Chart 1").Activate
'O day, chung ta dang select vao doi tuong duong bao cua do thi=>ChartObject Object
'ActiveChart(cua do thi dang duoc select) => Chart Object nam ben trong ChartObject Object
ActiveChart.Parent.Delete
'Me cua do thi dang duoc select = ChartObject Object
'Tuc la chung ta xoa ChartObject Object
End Sub
Nếu như bỏ
Parent đi, thì code trên có nghĩa là ta sẽ xóa Chart Object. Khi đó sẽ bị lỗi.
Sub Macro1()
'
' Macro1 Macro
'
'
ActiveSheet.ChartObjects("Chart 1").Activate
ActiveChart.Delete 'Error
End Sub
Vì đồ thị đang được select, tức là ChartObject Object đang được select cho nên ta có thể xóa bằng cách sau:
Sub Macro1()
'
' Macro1 Macro
'
'
ActiveSheet.ChartObjects("Chart 1").Activate
Selection.Delete
End Sub
Code trên có thể xóa đồ thị, nhưng lưu ý rằng trong VBA, việc sử dụng
Selection sẽ khiến tốc độ code trở nên chậm.
Câu chuyện ở trên là với Excel 2007 trở đi.
Bây giờ ta hãy xem với Excel 2003 thì cần phải làm thế nào để xóa đồ thị đây?
Hãy thử ghi macro xem sao:
Sub Macro()
ActiveSheet.ChartObjects("Chart 1").Activate
ActiveChart.ChartArea.Select
ActiveWindow.Visible = False
Selection.Delete
End Sub
Trước khi thực hiện xóa nó thực hiện 3 câu lệnh ở phía trên. Bây giờ ta sẽ phân tích các câu lệnh đó nghĩa là gì?
Sub Macro()
ActiveSheet.ChartObjects("Chart 1").Activate
''Selection => ChartArea(Chart 1)
''ActiveChart => Chart(Sheet1 Chart 1)
ActiveChart.ChartArea.Select
''Selection => ChartArea(Chart 1)
''ActiveChart => Chart(Sheet1 Chart 1)
ActiveWindow.Visible = False
''Selection => ChartObject(Chart1)
''ActiveChart => Chart(Sheet1 Chart 1)
Selection.Delete
End Sub
Code trên hoạt động trên Excel 2003 nhưng sẽ không hoạt động trên Excel 2007. Câu chuyện bây giờ hoàn toàn khác với câu chuyện lúc trước rồi đấy.
Với Excel 2007 thì câu chuyện rất đơn giản:
ActiveSheet.ChartObjects("Chart 1").Activate
Selection.Delete ''Xoa OK
Với Excel 2003 thì sẽ xảy ra lỗi:
ActiveSheet.ChartObjects("Chart 1").Activate
Selection.Delete ''Error
Nguồn tham khảo:
Bạn cần đăng nhập để thấy link