So sánh New và CreateObject
Em xin so sánh sơ qua thế này.
CreateObject(class,[servername])
class: là một chuối (string) chỉ ra tên lớp đối tượng, trong đó có các thành phần như Property (có thể là class hoặc biến mang kiểu giá trị), Method (Sub), Function, Events.
Ví dụ về các Class:
Mỗi ứng dụng trong bộ Office đều có môt class "mẹ" là Application: excel.application, word.application, access.application,..... Class "Application" lại chứa các Class bên trong nó như là:
Trong EXCEL là Range, Sheet, ActiveWorkbook,....
Trong WORD là ActiveDocument, AutoCorrect, Table, ...
Trong Powerpoint là ActivePresentation, Slide, ...
Hàm CreateObject tạo một đối tượng (obj) theo class chỉ định. obj được tạo, nằm trong bộ nhớ của máy tính và hoạt theo cơ chế của class nó mang, mối obj hoạt động này người ta goi là một Instance.
CreateObject thường được dùng để tạo một đối tượng, mà class chưa được khai báo trong ứng dụng. Như là, từ VB6, Word, Access,...người ta có thể tạo một đối tượng Excel và cho nó chạy bình thường bằng lệnh
Set xlApp = CreateObject("Excel.Application")
Từ khóa New, cũng như CreateObject được dùng để tạo ra một đối tượng.
Công thức chung để tạo một đối tượng:
Dim Obj As New Class
Hoặc
Set Obj = New Class
Class dùng sau New phải được khai báo từ trước, nếu nó thuộc một ứng dụng bên ngoài thì ứng dụng đó phải được Reference (Trong VBA, vào menu Tools\Reference...)
Ví dụ trong VBA của WORD ta tạo một đối tượng EXCEL như sau:
Set xlApp = New Excel.Application
Với điều kiện trong VBE của WORD ta phải Reference tới Winword.exe nếu không sẽ bị lỗi.
Như vậy New và CreateObject có chung một mục đích là tạo ra một đối tượng, nhưng nếu dùng New thì class phải được Reference trước.
New dễ sử dụng, vì Class được khai báo từ trước nên trong môi trường soạn code (VBE) người dùng được hỗ trợ chức năng "List Property/Method", biểu hiện khi ta gõ dấu cách (space bar) thì ta có một danh sách các đối tượng (phím tắt là CTRL+J).
Nhược điểm là bộ nhớ bị chiếm dụng do phải Reference. Mặt khác, khi phiên bản của class thay đổi (VD như Excel nâng cấp từ version 10->12) thì với những chương trình được đóng gói sẽ bị lỗi, trừ khi ta mổ nó ra và Reference lại.
Dễ thấy nhất, nếu ta lập trình trên máy Office2000 thì khi chạy trên máy có Office2003 sẽ bị lỗi.
CreateObject khắc phục hoàn toàn nhược điểm của New vì không phải Reference các class, nó còn cho phép sử dụng các Class được khai báo ở một máy tính khác. Nhược điểm là khó sư dụng. Không được hỗ trợ "List Property/Method". Để sử dụng tốt thì người dùng phải nhớ các thành phần bên trong của Class.
Chú ý:
Khi sử dụng New hay CreateObject cần phải đảm bảo như sau:
Set Obj = New Class hoặc Set Obj = CreateObject("Class")
Sử dụng Obj
......
Giải phóng khỏi bộ nhớ
Obj.Quit 'Phải thoát bằng lệnh Quit hoặc Close, Exit,..tùy vào ứng dụng nếu Obj là một ứng dụng Automation (Tất cả các ứng dụng trong Office đều là Automation và có thủ tục thoát là Quit)
Cuối cùng dùng lệnh
Set Obj = Nothing
Trên là một số giải thích cơ bản. Vấn đề này đụng chạm tới nhiều khái niệm trừu tượng như là ActiveX Object, Automation. Để hiểu sâu cần phải đọc kỹ trong MSDN.