- Tham gia
- 30/5/06
- Bài viết
- 1,798
- Được thích
- 4,705
- Giới tính
- Nam
Hiện tại với các nguồn trên internet các bạn dễ dàng tìm thấy các class module. Với các class module này các bạn sẽ dễ dàng trong việc tái sử dụng các đọan mã lập trình. Chính vì lý do này tôi mạn phép tổng hợp các tài liệu về class module. Hy vọng bài viết này sẽ giúp ích phần nào cho công việc lập trình của các bạn.
Sử dụng class module để tạo các đối tượng (Objects)
Class module được dùng để tạo một đối tượng. Đối với người phát triển một ứng dụng thì có nhiều lý do để thực hiện việc này, bao gồm các lý do sau:
_ Gói gọn VBA và Windows API để việc sử dụng được dễ dàng và có thể sử dụng lại. Các bạn có thể thấy ví dụ ở đây, Lập trình Windows API trong VB/VBA
_ Để bẫy các sự kiện. (To trap events)
_ Tạo các sự kiện. (To raise events).
_ Tạo các đối tượng của riêng bạn.
Các bạn có thể tham khảo các class module tại đây:
_Sưu tầm các class module.
_Class đọc công thức toán.
Giải thích thêm về class module tại đây:
_ Hỏi về module và class module.
_ Cũng hỏi về class module.
_ Tự tạo Object.
_ Hướng dẫn từng bước tạo thư viện.
Mục đích của bài viết này nhằm hướng dẫn bạn tạo đối tượng của riêng bạn.
Tạo đối tượng
Giả sử rằng chúng ta muốn phát triển một đọan mã nhằm phân tích một cell trong worksheet như sau:
Xem cell có :
_ Rổng hay không?
_Có chứa một nhãn hay không?
_Có chứa một giá trị số hay không?
_Có chứa công thức hay không?
Chúng ta có thể làm điều này bằng việc tạo một đối tượng mới với các phương thức và thuộc tính. Đối tượng mới của chúng ta sẽ là đối tượng Cell. Nó sẽ có phương thức Analyze nhằm định nghĩa kiểu của cell và đặt các thuộc tính CellType sang giá trị mà chúng ta có thể sử dụng được trong các đọan mã của chúng ta. Chúng ta cũng sẽ có thuộc tính DescriptiveCellType mà chúng ta có thể thể hiện kiểu của cell như là text (tôi muốn giữ nguyên bản).
Bên dưới đây là mã của class module CCell. Class module này được dùng để tạo ra một đối tượng Cell người dùng đại diện cho một dạng cell đặt biệt, phân tích các thành phần mà cell chứa đựng và trả về kiểu của cell như là một chuổi text thân thiện với người dùng hơn.
Class module CCell có chứa một public enumeration với bốn thành phần, một thành phần sẽ đại diện cho một kiểu của cell. Mặc định chúng có các giá trị từ 0 đến 3. (Giải thích sơ về enumeration: các bạn để ý rằng khi các bạn lập trình trong VBA, một khi các bạn gõ Application.Calculation. thì các bạn sẽ thấy hiện ra như hình sau:
Đó chính là Enumeration.
Enumeration sẽ giúp cho các đọan mã của chúng ta dễ đọc và dễ sửa chữa hơn.
Chúng ta hãy xem thủ tục AnalyzeActiveCell
Nếu bạn chọn một cell trên worksheet và thực hiện thủ tục trên, nó sẽ tạo một instance mới của class module CCell để lưu trữ biến đối tượng clsCell. Thủ tục sẽ gán active cell cho thuộc tính Cell của đối tượng Cell, thực hiện phương thức Analyze và hiện thông báo thuộc tính DescriptiveCellType.
Cấu trúc của một Class Module
Một class module chứa đựng chi tiết (blueprint) của một đối tượng. Bạn có thể sử dụng class module để tạo nhiều instance của đối tượng tùy thuộc vào nhu cầu của bạn. Class module định nghĩa các phương thức và các thuộc tính của đối tượng. Bất kỳ một thủ tục (subroutine) họăc hàm (function) trong class module sẽ trở nên các phương thức của đối tượng. Bất kỳ public variables (biến tòan cục) hoặc property procedures (thủ tục thuộc tính) sẽ trở nên các thuộc tính của đối tượng.
Thủ tục thuộc tính (Property Procedures)
Thay vì phải dựa vào các public variables để định nghĩa các thuộc tính, chúng ta sẽ dùng property procedures để định nghĩa các thuộc tính của đối tượng. Nó sẽ giúp bạn dễ dàng điều khiển hơn trong việc gán các giá trị và trả về các giá trị. Thủ tục thuộc tính cho phép bạn kiểm tra các giá trị được truyền cho đối tượng và thực hiện các hành động thích hợp. Chúng cũng cho phép bạn tạo các thuộc tính chỉ đọc (read only) hoặc chỉ ghi (write only).
Class CCell sử dụng hai biến cục bộ (private module level variables) để lưu các thuộc tính nội bộ (properties internally). muCellType chứa đựng kiểu cell trong danh sách của enumeration anlCellType. mrngCell tham chiếu đến single-cell Range mà một đối tượng được tạo ra từ class CCell sẽ đại diện.
Thủ tục thuộc tính quản lý giao diện (interface) giữa các biến này với thế giới bên ngòai (tức là bên ngòai class module này). Thủ tục thuộc tính nó có ba dạng:
_ Property Let dùng để gán giá trị cho một thuộc tính.
_ Property Set dùng để gán một đối tượng cho một thuộc tính.
_ Property Get dùng để trả về giá trị hoặc đối tượng tham chiếu (object reference) trong một thuộc tính cho thế giới bên ngòai.
Tên của thuộc tính (thủ tục thuộc tính) là tên mà thế giới bên ngòai có thể gọi. Class CCell sử dụng Property Set Cell để cho phép bạn gán một Range tham chiếu cho thuộc tính Cell của đối tượng Cell. Thủ tục thuộc tính lưu tham chiếu đến biến mrnCell. Thủ tục có thể có kiểm tra giá trị để chắc chắn rằng chỉ có thể làm việc với single-cell range. Thủ tục Property Get Cell cho phép thuộc tính này được đọc.
Class CCell dùng hai thủ tục Property Get để trả về kiểu cell. Các thuộc tính này là thuộc tính chỉ đọc bởi vì nó không có thủ tục Property Let.
Phương thúc (Methods)
Class CCell có một phương thức được định bởi thủ tục Analyze. Nó định nghĩa kiểu dữ liệu trong một cell tham chiếu bởi biến mrngCell. Bởi vì đây là thủ tục nên phương thức này của class CCell không trả về giá trị cho bên ngòai. Nếu phương thức được tạo bởi một hàm (function), thì gía trị sẽ được trả về cho bên ngòai.
Phương thức Analyze sẽ trả về kiểu chuổi tùy thuộc vào giá trị của cell.
Tạo Collection
Bây giờ chúng ta đã có đối tượng Cell, chúng ta sẽ tạo nhiều instance object qua đó chúng ta có thể phân tích một worksheet hoặc tập họp các cell. Cách dễ nhất để quản lý các đối tượng này là lưu chúng trong một collection (tập họp). VBA cung cấp một đối tượng Collection mà bạn có thể dùng để lưu các đối tượng và dữ liệu. Một đối tượng Collection có bốn phương thức:
_ Add – Thêm
_ Count – Đếm
_ Item
_ Remove – Xóa
Không có sự giới hạn (no restriction) về kiểu dữ liệu được lưu trữ trong một Collection, các mục (items) với các kiểu dữ liệu khác nhau được lưu trong cùng một Collection.
Trong trường hợp của chúng ta, chúng ta muốn lưu chỉ đối tượng Cell trong cùng một Collection.
Để tạo một Collection mới, bước đầu tiên là thêm vào một module standart mới. Module này có tên MGlobals. Bước kế tiếp thêm vào khai báo biến như sau vào module MGlobals để khai báo biến đối tượng Collection dạng global.
Sẽ tiếp tục ở bài sau.
Lê Văn Duyệt
Sử dụng class module để tạo các đối tượng (Objects)
Class module được dùng để tạo một đối tượng. Đối với người phát triển một ứng dụng thì có nhiều lý do để thực hiện việc này, bao gồm các lý do sau:
_ Gói gọn VBA và Windows API để việc sử dụng được dễ dàng và có thể sử dụng lại. Các bạn có thể thấy ví dụ ở đây, Lập trình Windows API trong VB/VBA
_ Để bẫy các sự kiện. (To trap events)
_ Tạo các sự kiện. (To raise events).
_ Tạo các đối tượng của riêng bạn.
Các bạn có thể tham khảo các class module tại đây:
_Sưu tầm các class module.
_Class đọc công thức toán.
Giải thích thêm về class module tại đây:
_ Hỏi về module và class module.
_ Cũng hỏi về class module.
_ Tự tạo Object.
_ Hướng dẫn từng bước tạo thư viện.
Mục đích của bài viết này nhằm hướng dẫn bạn tạo đối tượng của riêng bạn.
Tạo đối tượng
Giả sử rằng chúng ta muốn phát triển một đọan mã nhằm phân tích một cell trong worksheet như sau:
Xem cell có :
_ Rổng hay không?
_Có chứa một nhãn hay không?
_Có chứa một giá trị số hay không?
_Có chứa công thức hay không?
Chúng ta có thể làm điều này bằng việc tạo một đối tượng mới với các phương thức và thuộc tính. Đối tượng mới của chúng ta sẽ là đối tượng Cell. Nó sẽ có phương thức Analyze nhằm định nghĩa kiểu của cell và đặt các thuộc tính CellType sang giá trị mà chúng ta có thể sử dụng được trong các đọan mã của chúng ta. Chúng ta cũng sẽ có thuộc tính DescriptiveCellType mà chúng ta có thể thể hiện kiểu của cell như là text (tôi muốn giữ nguyên bản).
Bên dưới đây là mã của class module CCell. Class module này được dùng để tạo ra một đối tượng Cell người dùng đại diện cho một dạng cell đặt biệt, phân tích các thành phần mà cell chứa đựng và trả về kiểu của cell như là một chuổi text thân thiện với người dùng hơn.
Mã:
Option Explicit
Public Enum anlCellType
anlCellTypeEmpty
anlCellTypeLabel
anlCellTypeConstant
anlCellTypeFormula
End Enum
Private muCellType As anlCellType
Private mrngCell As Excel.Range
Property Set Cell(ByRef rngCell As Excel.Range)
Set mrngCell = rngCell
End Property
Property Get Cell() As Excel.Range
Set Cell = mrngCell
End Property
Property Get CellType() As anlCellType
CellType = muCellType
End Property
Property Get DescriptiveCellType() As String
Select Case muCellType
Case anlCellTypeEmpty
DescriptiveCellType = "Empty"
Case anlCellTypeFormula
DescriptiveCellType = "Formula"
Case anlCellTypeConstant
DescriptiveCellType = "Constant"
Case anlCellTypeLabel
DescriptiveCellType = "Label"
End Select
End Property
Public Sub Analyze()
If IsEmpty(mrngCell) Then
muCellType = anlCellTypeEmpty
ElseIf mrngCell.HasFormula Then
muCellType = anlCellTypeFormula
ElseIf IsNumeric(mrngCell.Formula) Then
muCellType = anlCellTypeConstant
Else
muCellType = anlCellTypeLabel
End If
End Sub
Class module CCell có chứa một public enumeration với bốn thành phần, một thành phần sẽ đại diện cho một kiểu của cell. Mặc định chúng có các giá trị từ 0 đến 3. (Giải thích sơ về enumeration: các bạn để ý rằng khi các bạn lập trình trong VBA, một khi các bạn gõ Application.Calculation. thì các bạn sẽ thấy hiện ra như hình sau:
Đó chính là Enumeration.
Enumeration sẽ giúp cho các đọan mã của chúng ta dễ đọc và dễ sửa chữa hơn.
Chúng ta hãy xem thủ tục AnalyzeActiveCell
Mã:
Public Sub AnalyzeActiveCell()
Dim clsCell As CCell
' Create new instance of Cell object
Set clsCell = New CCell
' Determine cell type and display it
Set clsCell.Cell = Application.ActiveCell
clsCell.Analyze
MsgBox clsCell.DescriptiveCellType
End Sub
Nếu bạn chọn một cell trên worksheet và thực hiện thủ tục trên, nó sẽ tạo một instance mới của class module CCell để lưu trữ biến đối tượng clsCell. Thủ tục sẽ gán active cell cho thuộc tính Cell của đối tượng Cell, thực hiện phương thức Analyze và hiện thông báo thuộc tính DescriptiveCellType.
Cấu trúc của một Class Module
Một class module chứa đựng chi tiết (blueprint) của một đối tượng. Bạn có thể sử dụng class module để tạo nhiều instance của đối tượng tùy thuộc vào nhu cầu của bạn. Class module định nghĩa các phương thức và các thuộc tính của đối tượng. Bất kỳ một thủ tục (subroutine) họăc hàm (function) trong class module sẽ trở nên các phương thức của đối tượng. Bất kỳ public variables (biến tòan cục) hoặc property procedures (thủ tục thuộc tính) sẽ trở nên các thuộc tính của đối tượng.
Thủ tục thuộc tính (Property Procedures)
Thay vì phải dựa vào các public variables để định nghĩa các thuộc tính, chúng ta sẽ dùng property procedures để định nghĩa các thuộc tính của đối tượng. Nó sẽ giúp bạn dễ dàng điều khiển hơn trong việc gán các giá trị và trả về các giá trị. Thủ tục thuộc tính cho phép bạn kiểm tra các giá trị được truyền cho đối tượng và thực hiện các hành động thích hợp. Chúng cũng cho phép bạn tạo các thuộc tính chỉ đọc (read only) hoặc chỉ ghi (write only).
Class CCell sử dụng hai biến cục bộ (private module level variables) để lưu các thuộc tính nội bộ (properties internally). muCellType chứa đựng kiểu cell trong danh sách của enumeration anlCellType. mrngCell tham chiếu đến single-cell Range mà một đối tượng được tạo ra từ class CCell sẽ đại diện.
Thủ tục thuộc tính quản lý giao diện (interface) giữa các biến này với thế giới bên ngòai (tức là bên ngòai class module này). Thủ tục thuộc tính nó có ba dạng:
_ Property Let dùng để gán giá trị cho một thuộc tính.
_ Property Set dùng để gán một đối tượng cho một thuộc tính.
_ Property Get dùng để trả về giá trị hoặc đối tượng tham chiếu (object reference) trong một thuộc tính cho thế giới bên ngòai.
Tên của thuộc tính (thủ tục thuộc tính) là tên mà thế giới bên ngòai có thể gọi. Class CCell sử dụng Property Set Cell để cho phép bạn gán một Range tham chiếu cho thuộc tính Cell của đối tượng Cell. Thủ tục thuộc tính lưu tham chiếu đến biến mrnCell. Thủ tục có thể có kiểm tra giá trị để chắc chắn rằng chỉ có thể làm việc với single-cell range. Thủ tục Property Get Cell cho phép thuộc tính này được đọc.
Class CCell dùng hai thủ tục Property Get để trả về kiểu cell. Các thuộc tính này là thuộc tính chỉ đọc bởi vì nó không có thủ tục Property Let.
Phương thúc (Methods)
Class CCell có một phương thức được định bởi thủ tục Analyze. Nó định nghĩa kiểu dữ liệu trong một cell tham chiếu bởi biến mrngCell. Bởi vì đây là thủ tục nên phương thức này của class CCell không trả về giá trị cho bên ngòai. Nếu phương thức được tạo bởi một hàm (function), thì gía trị sẽ được trả về cho bên ngòai.
Phương thức Analyze sẽ trả về kiểu chuổi tùy thuộc vào giá trị của cell.
Tạo Collection
Bây giờ chúng ta đã có đối tượng Cell, chúng ta sẽ tạo nhiều instance object qua đó chúng ta có thể phân tích một worksheet hoặc tập họp các cell. Cách dễ nhất để quản lý các đối tượng này là lưu chúng trong một collection (tập họp). VBA cung cấp một đối tượng Collection mà bạn có thể dùng để lưu các đối tượng và dữ liệu. Một đối tượng Collection có bốn phương thức:
_ Add – Thêm
_ Count – Đếm
_ Item
_ Remove – Xóa
Không có sự giới hạn (no restriction) về kiểu dữ liệu được lưu trữ trong một Collection, các mục (items) với các kiểu dữ liệu khác nhau được lưu trong cùng một Collection.
Trong trường hợp của chúng ta, chúng ta muốn lưu chỉ đối tượng Cell trong cùng một Collection.
Để tạo một Collection mới, bước đầu tiên là thêm vào một module standart mới. Module này có tên MGlobals. Bước kế tiếp thêm vào khai báo biến như sau vào module MGlobals để khai báo biến đối tượng Collection dạng global.
Mã:
Public gcolCells As Collection
Sẽ tiếp tục ở bài sau.
Lê Văn Duyệt
Lần chỉnh sửa cuối: