Bài 4. Biến trong VBA

Liên hệ QC

befaint

|||||||||||||
Tham gia
6/1/11
Bài viết
14,383
Được thích
19,367
Bài 4. Biến trong VBA

(Danh sách các bài viết về VBA xem ở đây Index - Các bài viết về VBA)

1. Các kiểu dữ liệu

(Tham khảo)
Data type.png

2. Khai báo biến và đặt tên biến trong VBA
- Mỗi chương trình ứng dụng thường xử lý nhiều dữ liệu, ta dùng khái niệm "biến" để lưu trữ dữ liệu trong bộ nhớ máy tính, mỗi biến lưu trữ một dữ liệu của chương trình.
- Mặc dù VBA không yêu cầu (*), nhưng ta nên định nghĩa rõ ràng từng biến trước khi truy xuất nó để code của chương trình được rõ ràng, dễ hiểu, dễ bảo trì và phát triển.
- Định nghĩa 1 biến là :
• Định nghĩa tên nhận dạng cho biến,
• Kết hợp kiểu với biến để xác định cấu trúc dữ liệu của biến,
• Định nghĩa tầm vực (phạm vi) truy xuất biến.
- Cú pháp định nghĩa biến:
PHP:
[Static|Public|Private|Dim] AVariable [As Type]
+ Static, Public, Private, Dim (**): Các từ khóa để khai báo một biến.
+ AVariable: Tên biến cần khai báo.
Tại từng thời điểm, biến chứa một giá trị (nội dung) cụ thể. Theo thời gian nội dung của biến sẽ bị thay đổi theo tính chất xử lý của code.
Cách đặt tên cho một biến :
• Tên biến có độ dài tối đa 255 ký tự
• Ký tự đầu tiên phải là một ký tự chữ (letter), không phải ký tự số (0-9)
• Các ký tự tiếp theo có thể là các ký tự chữ (letter), ký số (digit), dấu gạch dưới
• Tên biến không được chứa các ký tự đặc biệt như các ký tự : ^, &, ), (,%, $, #, @, !, ~, +, -, *, …
• VBA không phân biệt chữ HOA hay chữ thường trong tên biến.
Ví dụ:
Tên biến hợp lệ:
PHP:
Bien1_dong
KhoiLuong
Tên biến không hợp lệ:
PHP:
Bien-1: ''Vì có dấu gạch ngang
Bien&1: ''Vì có ký tự &
1Bien_dong: ''Vì có ký tự số ở đầu

Các lưu ý khi đặt tên biến:
- Nên chọn tên biến ngắn gọn nhưng thể hiện rõ ý nghĩa.
Ví dụ: Ta muốn có một biến để lưu mã khác hàng thì có thể đặt: MaKH
- Khi viết tên biến ta nên viết hoa chữ đầu tiên của một từ có ý nghĩa.
Ví dụ: Đặt tên biến xác định khối lượng, số tiền: Kluong, SoTien
- Không được dùng tên biến trùng với các từ khoá như: Print, Sub, End… (từ khóa là những từ mà ngôn ngữ VBA đã dùng cho những thành phần xác định của ngôn ngữ).
+ As: Từ khóa để gán với kiểu dữ liệu nào cho biến.
+ Type: Kiểu dữ liệu cần gán cho biến đang khai báo. Nếu bỏ qua [As Type] thì biến đó mặc định nhận kiểu dữ liệu Variant.

Chú thích (*): Có hay không bắt buộc khai báo biến trong VBA
- Khi ở trên cùng trong các môi trường VBA Project (Worksheet, Workbook, Module, Class module, UserForm) có dòng Option Explicit thì các biến phải được khai báo trước khi sử dụng.
- Hai cách thiết lập Option Explicit:
Một là nhập trực tiếp ở trên cùng của môi trường viết code.
Hai là thiết lập Options trong VBA, yêu cầu khai báo biến (mục Require Variable Declaration được chọn) thì ở trên cùng trong các môi trường VBA Project (Worksheet, Workbook, Module, Class module, UserForm) sẽ tự động thêm dòng Option Explicit.

upload_2017-10-23_15-22-49.pngupload_2017-10-23_15-22-53.png

Chú thích (**): Giải thích các từ khóa đứng trước tên biến trong cú pháp khai báo biến
PHP:
[Static|Public|Private|Dim] AVariable [As Type]
Public, Private, Static là các từ khoá dùng để xác định phạm vi (tầm vực) của một vật thể (variable, sub, hoặc function). (Tham khảo bài #10)
Phạm vi/ tầm vực có hai tính chất: tính chất "có thể thấy được" và tính chất "tồn tại".
- Tồn tại: chỉ áp dụng cho biến (variable), không tồn tại có nghĩa là chưa được thiết lập, hoặc đã bị huỷ.
- Có thể thấy được: áp dụng cho mọi loại (variable, sub, hoặc function). Tùy theo cách khai báo mà vật thể có thể thấy được trong một phạm vi này nhưng lại bị che khuất trong phạm vi khác. Lưu ý là vật thể có thể vẫn tồn tại, chỉ ở ngoài phạm vi thì không chạm được tới nó mà thôi.

Ở nội dung phần này, ta chỉ xét tới variable.
Public: phạm vi toàn cục, ở đâu trong VBAProject cũng có thể thấy / dùng được.
- Cấu trúc:
PHP:
Public AVariable [As Type]
- Tồn tại: Biến chỉ giải phóng khi thoát file.
- Vị trí:
Để ngoài Sub/Function, trên cùng của môi trường VBA Project (Worksheet, Workbook, Module, Class module, UserForm).
- Ví dụ:
Module1:
PHP:
Option Explicit
'Yeu cau phai khai bao bien'

Public Var1 As Long
Public Var2 As Long

Sub GanGiaTri()
'Gan gia tri vao bien'
'Do khai bao toan cuc (tren cung module) nen duoc phep su dung 2 bien nay'
    Var1 = 10
    Var2 = 20
End Sub

Sub XemGiaTri()
    'Chay Sub GanGiaTri roi chay Sub nay'
    MsgBox "Var1 is: " & Var1 & vbNewLine & "Var2 is: " & Var2
    'Gia tri cua 2 bien Var1 va Var2 van ton tai'
End Sub
Module2:
PHP:
Option Explicit
'Yeu cau phai khai bao bien'

Sub XemGT()
    'Chay Sub Module1.GanGiaTri roi chay Sub nay'
    MsgBox "Var1 is: " & Var1 & vbNewLine & "Var2 is: " & Var2
    'Hai bien Var1 va Var2 da duoc khai bao trong Module1'
    'Gia tri cua 2 bien Var1 va Var2 van ton tai'
End Sub
Private: phạm vi nội bộ khi xét cả VBAProject, nó khai báo trên cùng module thì nó là toàn cục của module đó, các code trong module đó đều thấy nó.
- Cấu trúc:
PHP:
Private Avariable [As Type]
- Tồn tại: Biến chỉ giải phóng khi thoát file.
- Vị trí:
Để ngoài Sub/Function, trên cùng của môi trường VBA Project (Worksheet, Workbook, Module, Class module, UserForm).
- Ví dụ:
Module1:
PHP:
Option Explicit
'Yeu cau phai khai bao bien'

Private Var1 As Long
Private Var2 As Long

Sub GanGiaTri()
'Gan gia tri vao bien'
'Do khai bao toan cuc (tren cung module) nen duoc phep su dung 2 bien nay'
    Var1 = 10
    Var2 = 20
End Sub

Sub XemGiaTri()
    'Chay Sub GanGiaTri roi chay Sub nay'
    MsgBox "Var1 is: " & Var1 & vbNewLine & "Var2 is: " & Var2
    'Gia tri cua 2 bien Var1 va Var2 van ton tai'
End Sub
Module2:
PHP:
Option Explicit
'Yeu cau phai khai bao bien'

Sub XemGT()
    'Chay Sub Module1.GanGiaTri roi chay Sub nay'
    MsgBox "Var1 is: " & Var1 & vbNewLine & "Var2 is: " & Var2
    'Hai bien Var1 va Var2 chua duoc khai bao, xay ra loi: Variable not defined'
End Sub
Dim: Khai báo biến ở phạm vi toàn cục trong môi trường được khai báo (để ở ngoài Sub/ Function, trên cùng module) nhưng là phạm vi nội bộ khi xét cả VBAProject, hoặc nội bộ trong Sub/ Function.
- Cấu trúc:
PHP:
Dim AVariable [As Type]
- Tồn tại: Biến giải phóng khi thoát file (phạm vi toàn cục của module), giải phóng khi thoát Sub/Function (phạm vi nội bộ của Sub/Function).
- Vị trí:
+ Để ở ngoài Sub/ Function: Khai báo biến ở phạm vi toàn cục của môi trường khai báo.
+ Khai báo trong Sub/ Function: Phạm vi nội bộ của Sub/Function.

Static: Khai báo biến ở phạm vi nội bộ trong Sub/ Function
- Cấu trúc:
PHP:
Static AVariable [As Type]
- Tồn tại: Biến chỉ giải phóng khi thoát file.
- Vị trí: Chỉ đặt trong Sub/Function.
Ví dụ:
PHP:
Sub Vidu_Static()
    Static a As Long
    a = a + 10
    MsgBox "a = " & a
    'Chay Sub nay 3 lan: Bien a van duoc luu gia tri sau cac lan Sub duoc chay'
    'Lan 1: a=10'
    'Lan 1: a=20'
    'Lan 1: a=30'
End Sub

Lưu ý: Tất cả các kiểu khai báo biến, kể cả Public hay Static đều được giải phóng khi code bị bất cứ lỗi nào làm dừng chương trình hoặc khi VBA được Reset.
 

File đính kèm

  • Public variable.xlsb
    13.6 KB · Đọc: 107
  • Private variable.xlsb
    14.6 KB · Đọc: 74
  • Dim variable.xlsb
    15.1 KB · Đọc: 78
  • Static variable.xlsb
    13.7 KB · Đọc: 76
Lần chỉnh sửa cuối:
Bài 4. Biến trong VBA

(Danh sách các bài viết về VBA xem ở đây Index - Các bài viết về VBA)

1. Các kiểu dữ liệu
(Tham khảo)
View attachment 185348

2. Khai báo biến và đặt tên biến trong VBA
- Mỗi chương trình ứng dụng thường xử lý nhiều dữ liệu, ta dùng khái niệm "biến" để lưu trữ dữ liệu trong bộ nhớ máy tính, mỗi biến lưu trữ một dữ liệu của chương trình.
- Mặc dù VBA không yêu cầu (*), nhưng ta nên định nghĩa rõ ràng từng biến trước khi truy xuất nó để code của chương trình được rõ ràng, dễ hiểu, dễ bảo trì và phát triển.
- Định nghĩa 1 biến là :
• Định nghĩa tên nhận dạng cho biến,
• Kết hợp kiểu với biến để xác định cấu trúc dữ liệu của biến,
• Định nghĩa tầm vực (phạm vi) truy xuất biến.
- Cú pháp định nghĩa biến:
PHP:
[Static|Public|Private|Dim] AVariable [As Type]
+ Static, Public, Private, Dim (**): Các từ khóa để khai báo một biến.
+ AVariable: Tên biến cần khai báo.
Tại từng thời điểm, biến chứa một giá trị (nội dung) cụ thể. Theo thời gian nội dung của biến sẽ bị thay đổi theo tính chất xử lý của code.
Cách đặt tên cho một biến :
• Tên biến có độ dài tối đa 255 ký tự
• Ký tự đầu tiên phải là một ký tự chữ (letter), không phải ký tự số (0-9)
• Các ký tự tiếp theo có thể là các ký tự chữ (letter), ký số (digit), dấu gạch dưới
• Tên biến không được chứa các ký tự đặc biệt như các ký tự : ^, &, ), (,%, $, #, @, !, ~, +, -, *, …
• VBA không phân biệt chữ HOA hay chữ thường trong tên biến.
Ví dụ:
Tên biến hợp lệ:
PHP:
Bien1_dong
KhoiLuong
Tên biến không hợp lệ:
PHP:
Bien-1: ''Vì có dấu gạch ngang
Bien&1: ''Vì có ký tự &
1Bien_dong: ''Vì có ký tự số ở đầu

Các lưu ý khi đặt tên biến:
- Nên chọn tên biến ngắn gọn nhưng thể hiện rõ ý nghĩa.
Ví dụ: Ta muốn có một biến để lưu mã khác hàng thì có thể đặt: MaKH
- Khi viết tên biến ta nên viết hoa chữ đầu tiên của một từ có ý nghĩa.
Ví dụ: Đặt tên biến xác định khối lượng, số tiền: Kluong, SoTien
- Không được dùng tên biến trùng với các từ khoá như: Print, Sub, End… (từ khóa là những từ mà ngôn ngữ VBA đã dùng cho những thành phần xác định của ngôn ngữ).
+ As: Từ khóa để gán với kiểu dữ liệu nào cho biến.
+ Type: Kiểu dữ liệu cần gán cho biến đang khai báo. Nếu bỏ qua [As Type] thì biến đó mặc định nhận kiểu dữ liệu Variant.


Chú thích (*): Có hay không bắt buộc khai báo biến trong VBA
- Khi ở trên cùng trong các môi trường VBA Project (Worksheet, Workbook, Module, Class module, UserForm) có dòng Option Explicit thì các biến phải được khai báo trước khi sử dụng.
- Hai cách thiết lập Option Explicit:
Một là nhập trực tiếp ở trên cùng của môi trường viết code.
Hai là thiết lập Options trong VBA, yêu cầu khai báo biến (mục Require Variable Declaration được chọn) thì ở trên cùng trong các môi trường VBA Project (Worksheet, Workbook, Module, Class module, UserForm) sẽ tự động thêm dòng Option Explicit.

View attachment 185350View attachment 185351

Chú thích (**): Giải thích các từ khóa đứng trước tên biến trong cú pháp khai báo biến
PHP:
[Static|Public|Private|Dim] AVariable [As Type]
Public, Private, Static là các từ khoá dùng để xác định phạm vi (tầm vực) của một vật thể (variable, sub, hoặc function). (Tham khảo bài #10)
Phạm vi/ tầm vực có hai tính chất: tính chất "có thể thấy được" và tính chất "tồn tại".
- Tồn tại: chỉ áp dụng cho biến (variable), không tồn tại có nghĩa là chưa được thiết lập, hoặc đã bị huỷ.
- Có thể thấy được: áp dụng cho mọi loại (variable, sub, hoặc function). Tùy theo cách khai báo mà vật thể có thể thấy được trong một phạm vi này nhưng lại bị che khuất trong phạm vi khác. Lưu ý là vật thể có thể vẫn tồn tại, chỉ ở ngoài phạm vi thì không chạm được tới nó mà thôi.


Ở nội dung phần này, ta chỉ xét tới variable.
Public: phạm vi toàn cục, ở đâu trong VBAProject cũng có thể thấy / dùng được.
- Cấu trúc:
PHP:
Public AVariable [As Type]
- Tồn tại: Biến chỉ giải phóng khi thoát file.
- Vị trí:
Để ngoài Sub/Function, trên cùng của môi trường VBA Project (Worksheet, Workbook, Module, Class module, UserForm).
- Ví dụ:
Module1:
PHP:
Option Explicit
'Yeu cau phai khai bao bien'

Public Var1 As Long
Public Var2 As Long

Sub GanGiaTri()
'Gan gia tri vao bien'
'Do khai bao toan cuc (tren cung module) nen duoc phep su dung 2 bien nay'
    Var1 = 10
    Var2 = 20
End Sub

Sub XemGiaTri()
    'Chay Sub GanGiaTri roi chay Sub nay'
    MsgBox "Var1 is: " & Var1 & vbNewLine & "Var2 is: " & Var2
    'Gia tri cua 2 bien Var1 va Var2 van ton tai'
End Sub
Module2:
PHP:
Option Explicit
'Yeu cau phai khai bao bien'

Sub XemGT()
    'Chay Sub Module1.GanGiaTri roi chay Sub nay'
    MsgBox "Var1 is: " & Var1 & vbNewLine & "Var2 is: " & Var2
    'Hai bien Var1 va Var2 da duoc khai bao trong Module1'
    'Gia tri cua 2 bien Var1 va Var2 van ton tai'
End Sub
Private: phạm vi nội bộ khi xét cả VBAProject, nó khai báo trên cùng module thì nó là toàn cục của module đó, các code trong module đó đều thấy nó.
- Cấu trúc:
PHP:
Private Avariable [As Type]
- Tồn tại: Biến chỉ giải phóng khi thoát file.
- Vị trí:
Để ngoài Sub/Function, trên cùng của môi trường VBA Project (Worksheet, Workbook, Module, Class module, UserForm).
- Ví dụ:
Module1:
PHP:
Option Explicit
'Yeu cau phai khai bao bien'

Private Var1 As Long
Private Var2 As Long

Sub GanGiaTri()
'Gan gia tri vao bien'
'Do khai bao toan cuc (tren cung module) nen duoc phep su dung 2 bien nay'
    Var1 = 10
    Var2 = 20
End Sub

Sub XemGiaTri()
    'Chay Sub GanGiaTri roi chay Sub nay'
    MsgBox "Var1 is: " & Var1 & vbNewLine & "Var2 is: " & Var2
    'Gia tri cua 2 bien Var1 va Var2 van ton tai'
End Sub
Module2:
PHP:
Option Explicit
'Yeu cau phai khai bao bien'

Sub XemGT()
    'Chay Sub Module1.GanGiaTri roi chay Sub nay'
    MsgBox "Var1 is: " & Var1 & vbNewLine & "Var2 is: " & Var2
    'Hai bien Var1 va Var2 chua duoc khai bao, xay ra loi: Variable not defined'
End Sub
Dim: Khai báo biến ở phạm vi toàn cục trong môi trường được khai báo (để ở ngoài Sub/ Function, trên cùng module) nhưng là phạm vi nội bộ khi xét cả VBAProject, hoặc nội bộ trong Sub/ Function.
- Cấu trúc:
PHP:
Dim AVariable [As Type]
- Tồn tại: Biến giải phóng khi thoát file (phạm vi toàn cục của module), giải phóng khi thoát Sub/Function (phạm vi nội bộ của Sub/Function).
- Vị trí:
+ Để ở ngoài Sub/ Function: Khai báo biến ở phạm vi toàn cục của môi trường khai báo.
+ Khai báo trong Sub/ Function: Phạm vi nội bộ của Sub/Function.


Static: Khai báo biến ở phạm vi nội bộ trong Sub/ Function
- Cấu trúc:
PHP:
Static AVariable [As Type]
- Tồn tại: Biến chỉ giải phóng khi thoát file.
- Vị trí: Chỉ đặt trong Sub/Function.
Ví dụ:
PHP:
Sub Vidu_Static()
    Static a As Long
    a = a + 10
    MsgBox "a = " & a
    'Chay Sub nay 3 lan: Bien a van duoc luu gia tri sau cac lan Sub duoc chay'
    'Lan 1: a=10'
    'Lan 1: a=20'
    'Lan 1: a=30'
End Sub

Lưu ý: Tất cả các kiểu khai báo biến, kể cả Public hay Static đều được giải phóng khi code bị bất cứ lỗi nào làm dừng chương trình hoặc khi VBA được Reset.
Trong file Public variable khi mình chạy thì đều thấy biến Var 1 và 2 có giá trị là 0. Vậy làm thế nào để gán được vào biến một con số cụ thể để có thể dùng giá trị biến đó trong một Sub khác?
Bài đã được tự động gộp:

Có vẻ mình hiểu qua qua được chút rồi

PHP:
Option Explicit
'Yeu cau phai khai bao bien'

Public Const Var1 = 7 / 24
Public Const Var2 = 20



Sub XemGiaTri()
    'Chay Sub GanGiaTri roi chay Sub nay'
    MsgBox "Var1 is: " & Var1 & vbNewLine & "Var2 is: " & Var2
    'Gia tri cua 2 bien Var1 va Var2 van ton tai'
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Trong file Public variable khi mình chạy thì đều thấy biến Var 1 và 2 có giá trị là 0. Vậy làm thế nào để gán được vào biến một con số cụ thể để có thể dùng giá trị biến đó trong một Sub khác?
Bài đã được tự động gộp:

Có vẻ mình hiểu qua qua được chút rồi

PHP:
Option Explicit
'Yeu cau phai khai bao bien'

Public Const Var1 = 7 / 24
Public Const Var2 = 20



Sub XemGiaTri()
    'Chay Sub GanGiaTri roi chay Sub nay'
    MsgBox "Var1 is: " & Var1 & vbNewLine & "Var2 is: " & Var2
    'Gia tri cua 2 bien Var1 va Var2 van ton tai'
End Sub
Khi đó không gọi là BIẾN (variable) mà là HẰNG (const)
 
Upvote 0
Trong file Public variable khi mình chạy thì đều thấy biến Var 1 và 2 có giá trị là 0. Vậy làm thế nào để gán được vào biến một con số cụ thể để có thể dùng giá trị biến đó trong một Sub khác?
Bài đã được tự động gộp:

Có vẻ mình hiểu qua qua được chút rồi

PHP:
Option Explicit
'Yeu cau phai khai bao bien'

Public Const Var1 = 7 / 24
Public Const Var2 = 20



Sub XemGiaTri()
    'Chay Sub GanGiaTri roi chay Sub nay'
    MsgBox "Var1 is: " & Var1 & vbNewLine & "Var2 is: " & Var2
    'Gia tri cua 2 bien Var1 va Var2 van ton tai'
End Sub
ở đây có 2 loại biến là biến toàn cục và biến cục bộ.
biến toàn cục là biến dùng cho cả 1 chương trình chính.lẫn chương trình con.
còn biến cục bộ là biến chỉ dùng cho 1 chương trình con khi thoát chương trình thì biến đó sẽ về không hết.
vậy nên cái bài của bạn nên dùng biến toàn cục nhé.đó là dạng puclic đó.:D
ở đây là mình nhớ vậy thôi :D không biết có gì sai không nữa.
 
Upvote 0
ở đây có 2 loại biến là biến toàn cục và biến cục bộ.
biến toàn cục là biến dùng cho cả 1 chương trình chính.lẫn chương trình con.
còn biến cục bộ là biến chỉ dùng cho 1 chương trình con khi thoát chương trình thì biến đó sẽ về không hết.
vậy nên cái bài của bạn nên dùng biến toàn cục nhé.đó là dạng puclic đó.:D
ở đây là mình nhớ vậy thôi :D không biết có gì sai không nữa.

Mình khai báo một lô lốc biến Public. Đến lúc chạy sub ở module khác thì cái biến ấy nó vẫn giữ nguyên không giải phóng thì phải.
 
Upvote 0
Mình khai báo một lô lốc biến Public. Đến lúc chạy sub ở module khác thì cái biến ấy nó vẫn giữ nguyên không giải phóng thì phải.
vậy bạn phải khai báo lại trong sub chứ nếu không nó vẫn giữ giá trị ở trương chình chính.
 
Upvote 0
Một type mới trong VBA đó là: LongLongLongPtr,
Thông thường bạn sẽ biết số nguyên có các kiểu:
- Interger (phạm vi 0đến 2^8)
- Long (phạm vi từ - 2^15 đến 2^15 -1)

Nhưng giờ hệ thống 64bit đã đại trà, nên phát sinh kiểu dữ liệu mới cho "số nguyên"
- LongPtr và LongLong là một kiểu mới, trong đó LongPtr có thể tự động thay đổi phạm vi giữa môi trường hệ thống 64bit và 32bit, còn LongLong chỉ ứng dụng trong môi trường hệ thống 64bit.
LongLong có phạm vi lên tới -2^63 đến 2^63 -1
LongPtr thì vẫn giống Long khi trên 32bit, nhưng sẽ giống LongLong khi trên 64bit.

Tham khảo chi tiết về:
LongLong
LongPtr

*Hy vọng có thể giúp ích cho mọi người,
 
Upvote 0
Web KT
Back
Top Bottom