Khai báo hàm Private và Public trong VBA
Trong bài viết này, Học Excel Online sẽ giới thiệu với bạn cách khai báo hàm Private và hàm Public trong VBA. Ý nghĩa thực sự của Private và Public Trong VBA, khái niệm Private và Public ám chỉ việc khai báo phương thức truy cập giá trị khác mà chúng được gán cho. Giả sử ví dụ Private đại ...
Trong bài viết này, Học Excel Online sẽ giới thiệu với bạn cách khai báo hàm Private và hàm Public trong VBA.
Ý nghĩa thực sự của Private và Public
Trong VBA, khái niệm Private và Public ám chỉ việc khai báo phương thức truy cập giá trị khác mà chúng được gán cho. Giả sử ví dụ Private đại diện cho một công ty tư nhân và Public đại diện cho một công ty đại chúng. Khi bạn muốn tìm kiếm thông tin liên quan đến công ty tư nhân, bạn gần như sẽ không thể thấy gì cả bởi vì chỉ có những người đặc biệt mới có quyền được biết về các thông số sức khỏe tài chính của công ty. Ngược lại, nếu ta muốn biết chi phí khấu hao của một công ty cỡ Microsoft, việc tìm kiếm chỉ trong nháy mắt bởi vì đây là một công ty đại chúng và tất cả mọi người đều có thể tiếp cận được với các báo cáo tài chính của công ty. Trong VBA, việc sử dụng hai hàm Private và Public cũng có những nét tương đồng như vậy.
Phần lớn hai hàm này được dùng để khai báo phạm vi giá trị của một biến số hay một hàm thủ tục. Đối khi hàm Dim cũng được dùng để khai báo biến số. Khi đó, ta có thể coi Dim ở đây giống với Private vậy, tuy nhiên mỗi hàm sẽ có một chức năng khác nhau và được sử dụng vào từng trường hợp khác nhau.
Khái niệm về Private
Private Sub sẽ quy định phạm vi cho phép của một hàm thủ tục sao cho các hàm thủ tục khác không thuộc một mô-đun lệnh sẽ không thể kích hoạt được hàm thủ tục đó. Nói cách khác, một hàm thủ tục nằm trong mô-đun 1 sẽ không thể kích hoạt được một hàm Private Sub thuộc mô-đun 2 (Lưu ý: Nếu như bạn bắt đầu từ bước Application, bạn có thể sử dụng lệnh Run để chép đè lên quy tắc trên và từ đó có thể truy cập Private Sub như bình thường).
Private [chèn tên biến số ở đây] là lệnh quy định rằng biến số đó sẽ không thể truy xuất hoặc được sử dụng bởi bất kỳ hàm thủ tục nào trong các mô-đun khác. Để có thể sử dụng được nó, bạn phải khai báo biến ấy nằm bên ngoài hàm thủ tục (tức là có thể ở phần đầu tiên trong mô-đun lệnh). Dạng biến số này trở nên hữu ích khi bạn có một giá trị biến được xuất từ một hàm thủ tục và bạn muốn chuyển giá trị ấy sang một hàm khác trong cùng một mô-đun lệnh.
Dim [chèn tên biến số ở đây] là lệnh quy định phạm vi hoạt động bên trong một hàm thủ tục (bạn không thể dùng hàm Private để thay thế). Dim có thể được dùng ở trong cũng như ở ngoài phạm vi nội dung hàm thủ tục (khi được sử dụng ở ngoài nội dung hàm thì Dim sẽ có chức năng hoạt động tương tự với Private).
Khái niệm về Public
Public Sub có nghĩa là hàm thủ tục của bạn có thể được kích hoạt bởi một hàm khác trong một mô-đun khác. Public là phạm vi mặc định cho tất cả các hàm cho nên bạn không cần thiết phải điền từ “public” trước từ “sub”. Tuy vậy, việc này giúp người đọc có thể dễ dàng phân biệt hơn. Thường thì ta sẽ ghi đầy đủ là “Public Sub” nếu như chuỗi lệnh trở nên quá phức tạp do chứa nhiều hàm thuộc nhiều phạm vi khác nhau.
Public [chèn tên biến số ở đây] là lệnh quy định rằng biến số đó có thể truy xuất hoặc được sử dụng bởi bất kỳ hàm thủ tục nào trong các mô-đun khác. Để có thể sử dụng được nó, bạn phải khai báo biến ấy nằm ngoài hàm thủ tục (tức là có thể ở phần đầu tiên trong mô-đun lệnh). Dạng biến số này trở nên hữu ích khi bạn có một giá trị biến được xuất từ một hàm thủ tục và bạn muốn chuyển giá trị ấy sang một hàm khác trong cùng một mô-đun lệnh.
Sắp xếp private và public đồng thời
Giả sử trong ví dụ dưới đây, ta có 2 mô-đun khác nhau trong cùng 1 bảng tính Excel:
Mô-đun 1
Dim x As Integer
Public y As Integer
Sub Start_Process()
x = 15
y = 12
Call Print_Values
End Sub
‘=========================================================
Private Sub Display_Message()
MsgBox “We ran all three subroutines!”
End Sub
Mô-đun 2
Sub Print_Values()
Debug.Print x
Debug.Print y
Call Display_Message
End Sub
Trước khi chạy macro, ta để ý thấy có 2 biến số x và y được khai báo bên ngoài hàm thủ tục. Điều đó có nghĩa là các macro có thể sử dụng giá trị của 2 biến này. Biến x nằm trong phạm vi giá trị riêng tư, vì thế chỉ những hàm thủ tục thuộc cùng mô-đun với nó mới có thể truy cập giá trị x được. Ngược lại, biến y lại có phạm vi giá trị phổ thông, tức là tất cả các hàm thủ tục bất kể đến từ mô-đun nào đều có thể trích xuất giá trị của nó.
Mở đầu ta sẽ khởi chạy macro Start_Process. Macro này có tác dụng gán giá trị cho x và y rồi sau đó sẽ tiếp tục kích hoạt macro Print_Values. Ta có thể khởi chạy nó kể cả khi macro này không nằm trong cùng mô-đun lệnh, đơn giản bởi vì đây là một Public Sub.
Chuyển sang macro có tên Print_Values . Ta sẽ dùng nó để in giá trị x và y ra cửa sổ tạm thời (bằng tổ hợp phím Ctrl + G). Lưu ý rằng nếu bạn in trực tiếp giá trị của x ra thì kết quả sẽ không có gì cả. Điều này là bởi x không tồn tại trong mô-đun 2. Do đó một biến x mới sẽ được tạo ở bên mô-đun 2 và bởi vì biến mới này chưa được gán bất kỳ giá trị nào, vì thế nên khi in giá trị x ra sẽ không có kết quả.
Để ý thấy khi in các giá trị của y thì số 12 sẽ xuất hiện ở bên cửa sổ tạm thời. Lý do là bởi các hàm ở mô-đun 2 được quyền truy cập các biến phổ thông được khai báo ở bên mô-đun 1.
Dòng lệnh cuối của macro Print_Values khi chạy thì không may là sẽ xuất hiện lỗi. Lý do là vì ta đang cố gắng khởi động macro Display_Message ngay từ mô-đun 1. Do macro này được khai báo dưới dạng hàm riêng tư (Private sub), cho nên Print_Values không có quyền tự khởi chạy nó. Dưới đây là các bước để xử lý vấn đề này:
- Xóa bỏ từ “Private” trong hàm Display_Message
- Thay từ “Private” bằng “Public”
- Hoặc ta có thể tiếp cận từ bước Application và đồng thời sử dụng lệnh Call, khi đó ta có thể viết lại hàm này dưới dạng Application.Run “Display_Message ” (phương pháp này có tác dụng viết đè lên lệnh cũ trong trường hợp ta vẫn muốn hàm Display_Message là hàm riêng tư)
Khóa học VBA Excel online