Tôi mở thớt này để giải thích bài #1 trong thớt này
www.giaiphapexcel.com
15 năm chưa thấy câu trả lời thích đáng.
Bài $1 đố tại sao theo code này:
Private Sub CommandButton1_Click()
K = K + 1
Range("A1").Value = K
End Sub
Biến K không thay đổi, cứ luôn luôn là #1.
Các bài kế tiếp, kể từ bài #2 chỉ mách cho biết cách "khắc phục", tức là làm cho biến K thay đổi chứ không giải thích.
Đây là giải thích, lưu ý là người đọc cần một trình độ tối thiểu về lý thuyết bộ nhớ.
Và cũng cần một ít kiến thức về tầm vực, và mức độ hiển thị (được nhìn thấy) của biến và sub/function.
Ở bài này, tôi nói về mức độ hiển thị trước, bởi vì có thấu hiểu từ này mới dễ hiểu biến toàn cụ, biến nội ... (tấu xảo, nó liên quan đến câu hỏi thứ hai)
VBA chia một Project ra nhiều Modules với mục đích gói gọn và ly khai, giới hạn tầm vực của các món bên trong từng Module.
Người code VBA chia các món này thành hai loại:
1. Loại chỉ dùng trong Module nó khai báo. Các Module khác không được động đến.
2. Loại dùng chung, chia sẻ với mọi Modulkes khác
Loại 1 được khai báo với từ khóa Private. Loại 2 được khai báo với từ khóa Public (VBA mặc định)
Khi một biến hoặc Sub/Function được khai báo dạng 1, nó chỉ được Module này thấy thôi. Code ở các Modules khác sẽ không thấy nó.
Module1:
Private x ' x là biến toàn cục, nhưng chỉ hiện hữu trong Module1
Sub m1()
x = 5 ' x ở đây là x được khai báo ở trên
End Sub
Module2:
Sub m2()
x = 10 ' x ở đây là của Module2, không liên quan gì đến x bên Module1
' nếu Module2 có "Option Explicit" thì trình dịch sẽ báo lỗi là x chưa khai báo.
End Sub
Khi một biến hoặc Sub/Function được khai báo dạng 2, nó được mọi Modules nhìn thấy. Code ở các Modules khác tha hồ sử dụng nó.
Module3:
Public x ' x là biến toàn cục, nhưng chỉ hiện hữu trong Module1
Sub m3()
x = 5 ' x ở đây là x được khai báo ở trên
End Sub
Module4:
Sub m4()
x = 10 ' x ở đây là của Module1
' nếu Module4 có "Option Explicit" thì trình dịch cũng không báo lỗi, vì nó tìm được x ở Module3
End Sub
Vì vậy, cái gì khai là Private trong môt Module là tác giả muốn nó chỉ nhìn thấy được bên trong Module. Cái gì khai Public là tác giả muốn nó dùng tùm lum, ở đâu cũng được.
Lưu ý về từ khóa "che" (hide):
Nếu ở Module4 trên, tác giả khai báo biến x thì biến x này sẽ che biến x khai báo bên trong Module3. Muốn sử dụng x của Module3, code trong Module4 phải ghép tiền tố Module3, tức là Module3.x
Buồn ngủ quá. Để mai sẽ tiếp trả lời câu #1.
23/01/2023 01:00 pm Bổ sung và đính chính:
Đêm qua buồn ngủ quá cho nên lúc copy/paste quên chỉnh nchoox nnayf
Module3:
Public x ' x là biến toàn cục, nhưng chỉ hiện hữu trong Module1
Sub m3()
x = 5 ' x ở đây là x được khai báo ở trên
End Sub
Xin đọc là:
Biến x khai báo thế này là biến toàn cục, hiện hữu trong Module3 và có thể nhìn thấy, truy cập được trong tất cả các Modules khác.

Đố vui về VBA!
Nhằm cũng cố kiến thức về VBA cho các bạn mới bắt đầu và cả những bạn đang ứng dụng mà chưa hiểu nhiều về nó, tôi mở topic này với mong mõi qua những câu hỏi vui, các bạn sẽ nhận định lại sự hiểu biết cũa mình... (Kễ cã chính tôi cũng đang tập tành nên có rất nhiều cái chưa biết) Mong rằng...

Bài $1 đố tại sao theo code này:
Private Sub CommandButton1_Click()
K = K + 1
Range("A1").Value = K
End Sub
Biến K không thay đổi, cứ luôn luôn là #1.
Các bài kế tiếp, kể từ bài #2 chỉ mách cho biết cách "khắc phục", tức là làm cho biến K thay đổi chứ không giải thích.
Đây là giải thích, lưu ý là người đọc cần một trình độ tối thiểu về lý thuyết bộ nhớ.
Và cũng cần một ít kiến thức về tầm vực, và mức độ hiển thị (được nhìn thấy) của biến và sub/function.
Ở bài này, tôi nói về mức độ hiển thị trước, bởi vì có thấu hiểu từ này mới dễ hiểu biến toàn cụ, biến nội ... (tấu xảo, nó liên quan đến câu hỏi thứ hai)
VBA chia một Project ra nhiều Modules với mục đích gói gọn và ly khai, giới hạn tầm vực của các món bên trong từng Module.
Người code VBA chia các món này thành hai loại:
1. Loại chỉ dùng trong Module nó khai báo. Các Module khác không được động đến.
2. Loại dùng chung, chia sẻ với mọi Modulkes khác
Loại 1 được khai báo với từ khóa Private. Loại 2 được khai báo với từ khóa Public (VBA mặc định)
Khi một biến hoặc Sub/Function được khai báo dạng 1, nó chỉ được Module này thấy thôi. Code ở các Modules khác sẽ không thấy nó.
Module1:
Private x ' x là biến toàn cục, nhưng chỉ hiện hữu trong Module1
Sub m1()
x = 5 ' x ở đây là x được khai báo ở trên
End Sub
Module2:
Sub m2()
x = 10 ' x ở đây là của Module2, không liên quan gì đến x bên Module1
' nếu Module2 có "Option Explicit" thì trình dịch sẽ báo lỗi là x chưa khai báo.
End Sub
Khi một biến hoặc Sub/Function được khai báo dạng 2, nó được mọi Modules nhìn thấy. Code ở các Modules khác tha hồ sử dụng nó.
Module3:
Public x ' x là biến toàn cục, nhưng chỉ hiện hữu trong Module1
Sub m3()
x = 5 ' x ở đây là x được khai báo ở trên
End Sub
Module4:
Sub m4()
x = 10 ' x ở đây là của Module1
' nếu Module4 có "Option Explicit" thì trình dịch cũng không báo lỗi, vì nó tìm được x ở Module3
End Sub
Vì vậy, cái gì khai là Private trong môt Module là tác giả muốn nó chỉ nhìn thấy được bên trong Module. Cái gì khai Public là tác giả muốn nó dùng tùm lum, ở đâu cũng được.
Lưu ý về từ khóa "che" (hide):
Nếu ở Module4 trên, tác giả khai báo biến x thì biến x này sẽ che biến x khai báo bên trong Module3. Muốn sử dụng x của Module3, code trong Module4 phải ghép tiền tố Module3, tức là Module3.x
Buồn ngủ quá. Để mai sẽ tiếp trả lời câu #1.
23/01/2023 01:00 pm Bổ sung và đính chính:
Đêm qua buồn ngủ quá cho nên lúc copy/paste quên chỉnh nchoox nnayf
Module3:
Public x ' x là biến toàn cục, nhưng chỉ hiện hữu trong Module1
Sub m3()
x = 5 ' x ở đây là x được khai báo ở trên
End Sub
Xin đọc là:
Biến x khai báo thế này là biến toàn cục, hiện hữu trong Module3 và có thể nhìn thấy, truy cập được trong tất cả các Modules khác.
Lần chỉnh sửa cuối: