Giới thiệu
Bài viết này mô tả cách sử dụng biến số trong thủ tục con Microsoft Excel trong Microsoft Visual Basic for Applications.
Xem thêm thông tin
Các biến trong một thủ tục con
Một tính năng mạnh mẽ của ngôn ngữ lập trình là khả năng lưu trữ một cái gì đó trong một biến để các nội dung của biến có thể được sử dụng hoặc có thể được thay đổi sau này trong thủ tục. Tài liệu này thảo luận về việc sử dụng các biến sau đây trong Visual Basic:
- Làm thế nào biến được khai báo.
- Các thủ tục và các dự án có thể sử dụng biến.
- Vòng đời của biến số.
Khai báo biến số trong macro
Cách đơn giản nhất để khai báo biến trong macro là sử dụng câu lệnh Dim. Dòng sau đây khai báo hai biến số, là số nguyên:
Dim x As Integer, y As Integer
Với x và y được xác định là số nguyên, bạn đang yêu cầu Visual Basic dành đủ bộ nhớ cho một biến số nguyên (2 byte cho mỗi số x và y) và thông tin được lưu trữ trong một trong hai x hoặc y là một số nguyên nằm trong khoảng từ -32768 đến 32767.
LƯU Ý: Nếu bạn khai báo nhiều biến số bằng cách sử dụng một câu lệnh Dim đơn, bạn phải xác định kiểu dữ liệu cho mỗi biến.
Nếu bạn không xác định kiểu dữ liệu cho mỗi biến, như trong mã Visual Basic sau đây, chỉ có biến y được thiết lập làm biến số nguyên. Biến x sẽ là một loại biến thể:
Dim x, y As Integer
Để biết thêm thông tin, hãy xem Kiểu dữ liệu Biến thể bên dưới.
Để thực hiện kiểm tra biến số, hãy làm theo các bước sau:
Lưu và đóng bất kỳ sổ làm việc nào đang mở, rồi mở một sổ làm việc mới.
Khởi động Trình soạn thảo Visual Basic (nhấn ALT+F11).
Trên menu Chèn , bấm vào Mô-đun.
Nhập mã sau:
Sub Variable_Test()
Dim x As Integer, y As Integer
x = 10
y = 100
MsgBox "giá trị của x là " & x & _
Chr(13) & "giá trị y là " & y
End SubChạy macro Variable_Test của bạn. Bạn nhận được thông báo sau đây:
the value of x is 10
the value of y is 100Bấm vào OK.
Trong macro Variable_Test thay đổi dòng sau đây:
x = 10Để:
x = "error"Chạy macro Variable_Test của bạn.
Bạn sẽ nhận được lỗi thời gian chạy vì "lỗi" không phải là số nguyên và bạn đang cố gắng gán giá trị chuỗi này cho biến số nguyên x.
Tóm tắt kiểu dữ liệu
Đây là các kiểu dữ liệu biến phổ biến:
Loại dữ liệu biến
Nếu bạn không xác định một kiểu dữ liệu khi bạn khai báo một biến, hoặc bạn không khai báo một biến ở tất cả, Visual Basic tự động xác định kiểu dữ liệu biến cho biến này. Sau đây là những ưu điểm của các biến được khai báo là kiểu dữ liệu này:
- Các biến số có thể chứa các giá trị chuỗi, ngày, thời gian, Boolean hoặc số.
- Các biến số có thể chuyển đổi các giá trị mà chúng chứa tự động.
Bất lợi là biến biến yêu cầu ít nhất 16 byte bộ nhớ. 16 byte bộ nhớ có thể có ý nghĩa trong các thủ tục lớn hoặc trong các mô-đun phức tạp.
Để xem cách hoạt động của macro Variable_Test, hãy làm theo các bước sau:
Thay đổi mã trong macro Variable_Test thành:
Sub Variable_Test()
Dim x, y
x = "string"
y = 1.23
MsgBox "the value of x is " & x & _
Chr(13) & "the value of y is " & y
End Sub
Chạy macro Variable_Test của bạn.
Bạn sẽ không nhận được lỗi vì bạn có thể gán bất cứ thứ gì cho biến thể x và y.
LƯU Ý: Bạn cũng có thể bỏ qua dòng sau đây và macro sẽ vẫn hoạt động như các biến x và y được coi là kiểu dữ liệu Biến_thể:
Dim x, y
Phạm vi của biến số
Khi bạn khai báo một biến, nó có thể hoặc không thể được nhìn thấy bởi các macro khác trong cùng một mô-đun, trong mô-đun khác, hoặc trong các dự án khác. Tính khả dụng này của biến trong mô-đun được gọi là phạm vi. Ba loại phạm vi là cấp thủ tục, mức mô-đun riêng và mức mô-đun công cộng. Phạm vi phụ thuộc vào cách thức và vị trí bạn khai báo biến số hoặc biến số của mình.
Phạm vi mức thủ tục
Một biến với phạm vi thủ tục cấp không được nhìn thấy bên ngoài thủ tục nơi nó được khai báo. Nếu bạn đặt giá trị của một biến có phạm vi mức thủ tục, các macro khác sẽ không nhìn thấy nội dung của biến đó.
Để xác minh rằng một biến với phạm vi mức thủ tục không được nhìn thấy bên ngoài thủ tục nơi nó được khai báo, hãy làm theo các bước sau đây:
Chèn mô-đun mới vào dự án của bạn.
Nhập cả hai macro sau đây vào mô-đun này:
Sub Macro1() Dim x As Integer x = 10 MsgBox "x, as seen by Macro1 is " & x 'the next line runs Macro2 Macro2 End Sub Sub Macro2() MsgBox "x, as seen by Macro2 is " & x End SubChạy Macro1 và bạn sẽ nhận được thông báo sau:
x, as seen by Macro1 is 10Bấm OK và bạn sẽ nhận được thông báo sau:
x, as seen by Macro2 isBấm vào OK.
Macro2 không hiển thị giá trị cho biến x vì biến x là cục bộ trong Macro1.
Phạm vi mức mô-đun riêng tư và công cộng
Bạn có thể xác định các biến trong phần khai báo của mô-đun (ở phía trên cùng của mô-đun, trên tất cả các thủ tục con) và đặt phạm vi biến của bạn bằng cách sử dụng Câu lệnh công khai, câu lệnh Dim hoặc câu lệnh Private. Nếu bạn đưa Tuyên bố công khai trước biến của mình, biến số của bạn sẽ sẵn dùng cho tất cả các macro trong tất cả các mô-đun trong dự án. Nếu bạn đặt câu lệnh Dim hoặc câu lệnh Private trước biến của bạn, biến số của bạn chỉ sẵn dùng cho macro trong mô-đun nơi nó được khai báo.
Để xem sự khác biệt giữa Tuyên bố công khai và câu lệnh Mờ, hãy làm theo các bước sau:
Lưu và đóng bất kỳ sổ làm việc nào đang mở, rồi mở một sổ làm việc mới.
Khởi động Trình soạn thảo Visual Basic.
Chèn mô-đun vào dự án của bạn.
-
Type the following code into this module: Public x As Integer Sub Macro_1a() x = 10 MsgBox x Macro_1b End Sub Sub Macro_1b() x = x * 2 MsgBox x Macro2 End Sub Chèn mô-đun khác vào dự án của bạn.
Nhập mã sau đây vào mô-đun này:
Sub Macro2()
x = x * 3
MsgBox x
End SubChạy macro Macro_1a trong mô-đun đầu tiên.
Với biến x được khai báo là "Public x As Integer", cả ba macro trong dự án đều có quyền truy nhập vào giá trị x. Hộp thông báo đầu tiên sẽ hiển thị giá trị là 10. Hộp thông báo thứ hai hiển thị giá trị là 20 (vì x được nhân với 2 trong Macro_1b). Hộp thông báo thứ ba hiển thị giá trị là 60 (vì giá trị x đã được thay đổi thành 20 trong Macro_1b và sau đó nó được nhân với 3 trong Macro2).
Thay đổi dòng khai báo trong mô-đun đầu tiên từ:
Public x As IntegerĐể:
Dim x As IntegerChạy macro Macro_1a của bạn.
Với biến x được khai báo là "Dim x As Integer", chỉ những macro trong mô-đun đầu tiên mới có quyền truy nhập vào giá trị x. Vì vậy, hộp thông báo đầu tiên hiển thị giá trị là 10, hộp thông báo thứ hai hiển thị giá trị là 20 , (vì x được nhân với 2 trong Macro_1b) và hộp thông báo thứ ba hiển thị giá trị là 0 (vì Macro2 không nhìn thấy giá trị x và giá trị không được khởi tạo được sử dụng bởi Macro 2).
Thay đổi dòng khai báo trong mô-đun đầu tiên từ:
Dim x As IntegerĐể:
Private x As IntegerChạy macro Macro_1a của bạn.
Các hộp thư giống nhau được hiển thị bằng cách sử dụng phạm vi câu lệnh Private như khi họ sử dụng câu lệnh Dim. Biến x có cùng phạm vi, riêng tư đến mô-đun nơi nó được khai báo.
LƯU Ý: Nếu bạn muốn phạm vi biến của bạn bị giới hạn trong mô-đun nơi nó được khai báo, hãy sử dụng Privatestatement thay vì câu lệnh Dim. Cả hai đều đạt được cùng một hiệu ứng, nhưng phạm vi rõ ràng hơn khi bạn đọc mã nếu bạn sử dụng câu lệnh Private.
Thời hạn của biến số
Thời gian trong đó một biến giữ lại giá trị của nó được gọi là tuổi thọ của nó. Giá trị của một biến có thể thay đổi trong suốt vòng đời của nó nhưng nó sẽ giữ lại một giá trị. Ngoài ra, khi một biến mất phạm vi, nó không còn có một giá trị.
Khởi tạo giá trị của một biến số
Khi bạn chạy macro, tất cả các biến số được khởi tạo thành một giá trị. Biến số được khởi tạo thành không, một chuỗi độ dài biến được khởi tạo thành chuỗi có độ dài bằng không ("") và một chuỗi có độ dài cố định được điền bằng mã ASCII 0. Biến biến biến được khởi tạo thành Trống. Biến Trống được thể hiện bằng số 0 trong ngữ cảnh số và chuỗi độ dài bằng 0 ("") trong ngữ cảnh chuỗi.
Biến mức thủ tục
Nếu bạn có một biến được khai báo trong macro bằng cách sử dụng câu lệnh Dim, biến đó sẽ giữ lại giá trị miễn là macro đang chạy. Nếu macro này gọi các macro khác, giá trị của biến sẽ được giữ lại (không sẵn dùng cho các macro khác) miễn là những macro khác này cũng đang chạy.
Để minh họa cách hoạt động của biến mức thủ tục, hãy làm theo các bước sau:
Chèn mô-đun mới vào dự án của bạn.
Nhập cả hai macro sau đây vào mô-đun này:
Sub Macro1()
'set x as a procedure level variable
Dim x As Integer
MsgBox "giá trị khởi tạo của x là " & x
x = 10
MsgBox "x is " & x
'dòng tiếp theo chạy Macro2
Macro2
MsgBox "x is still " & x
End Sub
Macro Phụ2()
MsgBox "x, như macro2 đã thấy là " & x
End SubChạy Macro1.
Bạn nhận được thông báo sau đây:
the initialized value of x is 0Bấm OK và bạn sẽ nhận được thông báo:
x is 10Bấm OK và bạn sẽ nhận được thông báo sau:
x, as seen by Macro2 isBấm vào OK.
Macro2 không hiển thị giá trị cho biến x vì biến x là cục bộ trong Macro1. Bạn nhận được thông báo sau đây:
x is still 10Bấm vào OK.
Chạy Macro1.
Bạn nhận được thông báo tương tự được mô tả trong bước 3 đến 6 vì ngay sau khi Macro1 ngừng chạy trong bước 6, giá trị của biến x đã bị mất. Do đó, khi bạn chạy lại Macro1 ở Bước 7, thông báo đầu tiên sẽ hiển thị giá trị x là không (giá trị khởi tạo).
Từ khóa tĩnh
Nếu một biến mức thủ tục được khai báo bằng cách sử dụng từ khóa Tĩnh, biến đó sẽ giữ lại giá trị của nó cho đến khi dự án của bạn được đặt lại. Vì vậy, nếu bạn có một biến tĩnh, lần sau khi bạn gọi thủ tục của bạn, biến tĩnh được khởi tạo để giá trị cuối cùng của biến.
Để xem cách hoạt động của từ khóa Tĩnh, hãy làm theo các bước sau:
1.
Change the code in Macro1 to:
Sub Macro1()
'set x as a procedure level variable
Static x As Integer
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
Chạy Macro1.
Bạn sẽ nhận được thông báo:
the initialized value of x is 0Bấm OK và bạn sẽ nhận được thông báo:
x is 10Bấm vào OK.
Chạy Macro1 và bạn nhận được thông báo sau:
the initialized value of x is 10Bấm OK và bạn sẽ nhận được thông báo sau:
x is 20Bấm vào OK.
Các giá trị xuất hiện trong thư là khác nhau lần thứ hai vì biến x được khai báo là một biến tĩnh và biến giữ lại giá trị của nó sau khi bạn chạy Macro1 lần đầu tiên.
LƯU Ý: Nếu bạn có một biến cấp mô-đun, thời hạn của nó giống như khi nó là một biến tĩnh mức thủ tục.
Để xác minh tuổi thọ của biến mức mô-đun, hãy làm theo các bước sau:
1.
Change the code in the module that contains Macro1 to the following:
Dim x As Integer 'create a module-level variable
Sub Macro1()
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
Chạy Macro1 và bạn sẽ nhận được thông báo sau:
the initialized value of x is 0Bấm OK và bạn sẽ nhận được thông báo sau:
x is 10Bấm OK,
Chạy Macro1 và bạn sẽ nhận được thông báo này:
the initialized value of x is 10Bấm vào OK.
Bạn nhận được thông báo sau đây:
x is 20Bấm vào OK.
Các giá trị xuất hiện trong thư là khác nhau lần thứ hai vì biến x được khai báo là một biến tĩnh và nó giữ lại giá trị của nó sau khi bạn chạy Macro1 lần đầu tiên.
Đặt lại dự án để đặt lại các biến số
Nếu bạn muốn đặt lại giá trị cho biến tĩnh hoặc cho biến cấp độ mô-đun, hãy bấm vào nút Đặt lại trên nút
Standard cụ của bạn hoặc bấm vào Đặt lại trên menu Chạy.
Nếu bạn thực hiện điều này cho dự án Macro1 và sau đó chạy lại Macro1, giá trị của biến x được khởi tạo trở lại không và bạn nhận được thông báo đầu tiên:
the initialized value of x is 0