Biến số tĩnh không bị mất giá trị

vbano1

SMod
Thành viên BQT
Một biến được khai báo trong một thủ tục hay một hàm, được coi là biến cục bộ. Khi thủ tục hay hàm này kết thúc thì biến cục bộ cũng được giải phóng.
Mỗi lần thủ tục hay hàm này được thực thi thì biến số cục bộ lại được làm mới lại và vì vậy giá trị trong những lần chạy trước đó không còn được lưu lại.
Mã:
Sub Sample44()
    Dim Number As Long
    MsgBox Number
    Number = Number + 1
    MsgBox Number
End Sub
Mỗi lần chạy thủ tục trên thì sẽ hiển thị thông báo như sau:
[Lần 1]
Bạn cần đăng nhập để thấy đính kèm

[Lần 2]
Bạn cần đăng nhập để thấy đính kèm

Tôi không muốn như vậy, nói tóm lại là dù thủ tục trên kết thúc thì giá trị của biến số vẫn còn được lưu lại, đó là điều tôi muốn. Giá trị của biến số trong lần thực thi code trước đó vẫn được lưu lại để sử dụng trong lần chạy code tiếp theo, chúng ta nghĩ tới biến số tĩnh, hay còn gọi là biến static. Vì vậy tôi sẽ sửa lại code như sau:
Mã:
Sub Sample45()
    Static Number As Long
    MsgBox Number
    Number = Number + 1
    MsgBox Number
End Sub
[Lần 1]
Bạn cần đăng nhập để thấy đính kèm

[Lần 2]
Bạn cần đăng nhập để thấy đính kèm

Biến số tĩnh chỉ có thể được khai báo với tư cách là biến nội bộ, tức là khai báo bên trong hàm hay thủ tục. Tất cả các thủ tục hay hàm khác không thể sử dụng biến static. Biến static cũng không thể tồn tại với tư cách là một biến public.
Biến static không phải trong bất cứ trạng thái nào cũng lưu trữ dữ liệu. Chẳng hạn bây giờ tôi viết thêm một thủ tục mới trong module.
Mã:
Sub Sample46()
End Sub
Bây giờ dù bạn chạy thủ tục Sample45 thì sẽ thấy biến Number không còn lưu giá trị trước đó nữa. Là vì module đã phát sinh thủ tục mới nên toàn bộ project VBA đã được biên dịch lại, cho nên giá trị biến static trước đó không còn được lưu trữ nữa.
Ngoài ra, nếu chạy tới lệnh End như sau, thì biến static cũng bị làm sạch, không còn lưu trữ dữ liệu.
Mã:
Sub Sample47()
    Static Number As Long
    MsgBox Number
    Number = Number + 1
    If MsgBox(Number & vbCrLf & "Ban muon xoa gia tri khong?", vbYesNo) = vbYes Then
        End
    End If
End Sub
Nguồn tham khảo và dịch:
 
Top