biến là biến đổi, còn gọi là sự thay đổi, thay đổi ở đây là giá trị.
Trong thế giới lập trình biến được gọi 1 vùng bộ nhớ để lưu các giá trị cần thiết, khi phần mềm chạy làm một công việc nào đó thì biến được tạo ra để lưu vào bộ nhớ giúp cho việc tính toán.
Ví dụ vba đơn giản như sau: bạn viết 1 phần mềm tính tổng 2 số thì bạn cần tạo ra 2 biến để lưu 2 số cần tính tổng.
a=2
b=10
Msgbox a+b
Như vậy máy tính làm gì với 3 dòng lệnh VBA trên ?
a=2 : Phần mềm VBA sẽ yêu cầu máy tính cấp phát 1 vùng bộ nhớ có tên là a, để lưu trữ số 2
b=10: Phần mềm VBA sẽ yêu cầu máy tính cấp phát 1 vùng bộ nhớ có tên là b, để lưu trữ số 10
Msgbox a+b : Phần mềm VBA sẽ truy xuất bộ nhớ tên a,b từ máy tính và cộng kết quả 2 số lại và in ra màn hình.
3 dòng lệnh VBA trên thì dòng nào là dòng khai báo biến ?
Bạn có đặt câu hỏi là khi VBA chạy qua lệnh a=2,b=10 thì biến này lưu vào RAM hay lưu vào ổ cứng ?
Khi Msgbox a+b thì phần mềm VBA truy xuất biến a,b ở đâu ? là RAM hay ổ cứng
bạn hãy viết 1 đoạn code VBA có khai báo biến
Biến a, gán giá trị cho a là 20
Biến b, gán giá trị cho b là 2
Iin kết quả: chia biến a cho biến b.
bạn hãy viết 1 đoạn có khai báo biến
Biến a, gán giá trị cho a là 10
Biến b, gán giá trị cho b là 20
Biến c, gán giá trị biến c là giá trị biến b chia cho 2
In kết quả: biến a nhân biến b, lấy tổng giá trị 2 biến a và b chia cho giá trị biến c
viết 1 đạn code khai báo biến
Biến a, gán giá trị cho biến a là TRAN VAN
Biến b, giá giá trị cho biến b là D
Msgbox a+b sẽ cho ra kết quả như thế nào ?
Cũng như ví dụ 3, ta đổi là a gia tri là NGUYEN VAN, b giá trị BINH
Thì kết quả in ra NGUYEN VANBINH, bạn có nhận ra sự bất cập gì không, và cách sửa lại ?
Qua bài 3, bạn rút được điều gì ?
- Điều 1:?
- Điều 2: ?
Trong VBA, có 2 cách khai báo biến hay sử dụng:
Dạng khai báo ngầm( Implicitly )
a=2
* là khai báo dạng ngầm
Dạng khai rõ ràng ( Explicitly ).
dim a as Interger
* là dạng rõ ràng ( Explicitly )
Trong thực tế làm ứng dụng VBA Excel khi nào chọn cách khai báo ngầm, khi nà khai báo rõ ràng ?
* Sẽ giải thích bài tiếp theo, bài này bạn chỉ đặt câu hỏi ?
Interger là kiểu dữ liệu số nguyên, sẽ nói chi tiết phần tiếp theo.
Cú pháp chung: Dim TEN_BIEN as KIEU_BIEN
Chữ màu xanh luôn cố định, chữ màu đỏ thay đổi lại cho phù hợp.
Nguyên tắt khai báo biến:
' không có dấu cách
' không có ký tự đặc biệt
' không có dấu _ đầu của biến
‘ Không có con số đầu của tên biến
Dim ho____ten As String
Dim HOTEN____ As String
Dim _HOTEN____ As String
Dim A1 As String
Dim 1A As String
Trong VBA (Visual Basic for Applications), phạm vi của biến (variable scope) xác định nơi trong chương trình bạn có thể truy cập và sử dụng biến đó. Có 4 loại phạm vi chính:
Khai báo bên trong một Sub hoặc Function bằng từ khóa Dim.
Biến chỉ tồn tại và có thể sử dụng bên trong thủ tục đó.
Sau khi thủ tục kết thúc, biến sẽ bị xóa khỏi bộ nhớ.
📌 Ví dụ:
Sub TestScope()
Dim message As String
message = "Hello"
MsgBox message
End Sub
Khai báo ngoài tất cả các thủ tục trong cùng một Module, dùng Dim hoặc Private.
Biến có thể được dùng bởi tất cả các thủ tục trong cùng một Module.
Không thể dùng từ các Module khác nếu dùng Private.
📌 Ví dụ:
Private counter As Integer ' Module-level
Sub Increment()
counter = counter + 1
MsgBox counter
End Sub
Sub ResetCounter()
counter = 0
End Sub
Khai báo bằng từ khóa Public trong Module chuẩn (Module, không phải UserForm hay Class).
Có thể được truy cập từ bất kỳ Module nào trong cùng một project.
📌 Ví dụ:
Public appName As String
Sub InitApp()
appName = "MyApp"
End Sub
Sub ShowAppName()
MsgBox appName
End Sub
Dùng từ khóa Static bên trong thủ tục.
Biến chỉ dùng được bên trong thủ tục, nhưng không bị reset giá trị giữa các lần gọi.
📌 Ví dụ:
Sub CountCalls()
Static count As Integer
count = count + 1
MsgBox "Called " & count & " times"
End Sub
Trong VBA, vòng đời của biến (variable lifetime) chỉ khoảng thời gian mà biến tồn tại trong bộ nhớ, từ lúc nó được tạo đến lúc nó bị hủy.
Dưới đây là phân tích chi tiết theo từng loại biến:
Vòng đời: Bắt đầu khi thủ tục được gọi, kết thúc khi thủ tục kết thúc.
Không giữ giá trị sau mỗi lần gọi.
📌 Ví dụ:
Sub ShowName()
Dim name As String
name = "Nhật"
MsgBox name
End Sub
→ Biến name sẽ bị xóa khỏi bộ nhớ khi ShowName kết thúc.
Vòng đời: Tồn tại suốt thời gian chương trình chạy (từ lúc biến được tạo cho đến khi ứng dụng VBA kết thúc).
Giữ giá trị giữa các lần gọi thủ tục.
📌 Ví dụ:
Sub CountCall()
Static count As Integer
count = count + 1
MsgBox "Called " & count & " times"
End Sub
→ Biến count giữ giá trị mỗi lần gọi CountCall.
Vòng đời: Tồn tại suốt thời gian chương trình chạy.
Có thể dùng lại trong các thủ tục khác của cùng Module.
📌 Ví dụ:
Private userName As String ' Biến cấp mô-đun
Sub SetName()
userName = "Nhật"
End Sub
Sub ShowName()
MsgBox userName
End Sub
Vòng đời: Tồn tại suốt thời gian chương trình chạy.
Có thể truy cập từ bất kỳ Module nào trong project.
📌 Ví dụ:
Public appVersion As String
Sub Init()
appVersion = "1.0"
End Sub
Sub ShowVersion()
MsgBox appVersion
End Sub
Data type | Storage size | Range |
---|---|---|
Boolean | 2 bytes | True or False |
Byte | 1 byte | 0 to 255 |
Collection | Unknown | Unknown |
Currency (scaled integer) | 8 bytes | -922,337,203,685,477.5808 to 922,337,203,685,477.5807 |
Date | 8 bytes | -657,434 (January 1, 100), to 2,958,465 (December 31, 9999) |
Decimal | 14 bytes | +/-79,228,162,514,264,337,593,543,950,335 with no decimal point +/-7.9228162514264337593543950335 with 28 places to the right of the decimal Smallest non-zero number is+/-0.0000000000000000000000000001 |
Dictionary | Unknown | Unknown |
Double (double-precision floating-point) | 8 bytes | -1.79769313486231E308 to -4.94065645841247E-324 for negative values 4.94065645841247E-324 to 1.79769313486232E308 for positive values |
Integer | 2 bytes | -32,768 to 32,767 |
Long (Long integer) | 4 bytes | -2,147,483,648 to 2,147,483,647 |
LongLong (LongLong integer) | 8 bytes | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 Valid on 64-bit platforms only. |
LongPtr (Long integer on 32-bit systems, LongLong integer on 64-bit systems) | 4 bytes on 32-bit systems 8 bytes on 64-bit systems |
-2,147,483,648 to 2,147,483,647 on 32-bit systems -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 on 64-bit systems |
Object | 4 bytes | Any Object reference |
Single (single-precision floating-point) | 4 bytes | -3.402823E38 to -1.401298E-45 for negative values 1.401298E-45 to 3.402823E38 for positive values |
String (variable-length) | 10 bytes + string length | 0 to approximately 2 billion |
String (fixed-length) | Length of string | 1 to approximately 65,400 |
Variant (with numbers) | 16 bytes | Any numeric value up to the range of a Double |
Variant (with characters) | 22 bytes + string length (24 bytes on 64-bit systems) | Same range as for variable-length String |
User-defined (using Type) | Number required by elements | The range of each element is the same as the range of its data type. |
Hằng nó giống biến VBA, nhưng cái khác là khi cấp giá trị cho hằng (giá trị gán vào RAM) thì không thay đổi được.
Trong VBA Excel, hằng số (constant) là giá trị không thay đổi trong suốt quá trình thực thi chương trình.
Const tên_hằng As kiểu_dữ_liệu = giá_trị
Const PI As Double = 3.14159
Const TenCongTy As String = "Công ty IIF"
Const SoNgayLamViec As Integer = 26
Đặc điểm | Mô tả |
---|---|
Không thay đổi | Không thể gán lại giá trị mới sau khi khai báo |
Tăng độ rõ ràng | Giúp chương trình dễ đọc, dễ hiểu |
Tối ưu hiệu năng | Trình biên dịch có thể tối ưu tốt hơn so với biến |
Sub TinhLuong()
Const LUONG_NGAY As Double = 500000
Dim soNgayCong As Integer
Dim tongLuong As Double
soNgayCong = 22
tongLuong = soNgayCong * LUONG_NGAY
MsgBox "Tổng lương: " & Format(tongLuong, "#,##0") & " VNĐ"
End Sub
Hãy khai báo biến để phần mềm VBA Excel lưu được thông tin trên ?
Biến là gì ? hằng là gì và kiểu kiểu biến trong VBA sử dụng như thế nào cho hợp lý.