Thí dụ: khai báo biến kiểu chuỗi dùng để chứa tên một biểu mẫu và biến N kiểu số nguyên: Dim strFrmName As String Dim intN As Integer - Kiểu dữ liệu: là một trong các kiểu dữ liệu cơ
Trang 1Bài 8 GIỚI THIỆU NGƠN NGỮ VBA
(VISUAL BASIC FOR APPLICATIONS) 8.1 GIỚI THIỆU
Là ngơn ngữ lập trình cho Microsoft Office và các ứng dụng cĩ liên kết với nĩ Được sử dụng để liên kết các đối tượng trong ứng dụng lại với nhau tương tự như Macro nhưng linh động hơn
Ta cĩ thể sử dụng VBA để thực hiện các cơng việc sau:
Dễ dàng bảo trì các ứng dụng
Tạo ra các hàm của riêng mình
Che đi các thơng báo lỗi của hệ thống
Tạo hoặc hiệu chỉnh các đối tượng
b) MODULE RI NG CỦA Đ I TƯỢNG FORM, REPORT
Dùng để chứa các thủ tục xử lý sự kiện liên kết với Form hay Report Ta khơng thể lưu riêng module loại này mà chúng gắn liền với Form hoặc Report Khi ta sao chép Form hay Report từ tập tin CSDL này sang tập tin CSDL khác thì các Module này cũng được chép sang cùng với nĩ và nếu ta xĩa Form hoặc Report thì chúng cũng bị xĩa theo
8.2.2 C CH MỞ CỬA SỔ MODULE ĐỂ VIẾT MÃ LỆNH
Trên thanh Ribbon chọn ngăn Create sau đĩ chọn Module
Trang 2Hình 8.1: Chọn muc Module để tạo mới Module
Xuất hiện màn hình soạn thảo
Hình 8.2: Cửa s soạn thảo m lệnh
b) MỞ MODULE RIÊNG CỦA FORM HOẶC REPORT
Mở Form hay Report ở chế độ Design rồi bấm vào nút Code
Trang 3Hình 8.3: Nút Code trên thanh phiếu Design của thanh Ribbon
Xuất hiện cửa sổ soạn thảo mã lệnh
Hình 8.4: Cửa s soạn thảo m lệnh của Form
8.2.3 C C TH NH PHẦN TRONG M T MODULE
a) C C KHAI B O
Là các câu lệnh dùng định nghĩa các biến, hằng, loại dữ liệu người dùng
b) THỦ TỤC XỬ LÝ SỰ KIỆN (EVENT PROCEDURE)
Là các thủ tục nằm tại các Module của Form hoặc Report Chúng sẽ được thực hiện khi các sự kiện của Form hoặc Report hoặc của các điều khiển xảy ra
c) THỦ TỤC CHUNG GENERAL PROCEDURE
Là các thủ tục không trực tiếp liên quan đến một đối tượng hoặc biến cố nào
cả Ta có thể tạo chúng trên Module chung hoặc Module của Form, Report Thủ tục chung chỉ được thi hành khi nào ta gọi đến nó
8.2.4 THỦ TỤC XỬ LÝ SỰ KIỆN EVENT PROCEDURE)
Trang 4Form Report Tên biến cố
Tên Control Tên biến cố
Thí dụ:
- Thủ tục biến cố cho sự kiện Mở Form có tên là Form_Open
- Thủ tục biến cố cho sự kiện Click chuột vào nút tên cmdThem là
Bước : Mở bảng thuộc tính của đối tượng cần tạo thủ tục biến cố
Hình 8.6: Bảng thuộc tính của n t cmd chao
Bước 2: Chọn thẻ Event, chọn giá trị Event Procedure trong biến cố và bấm
vào nút có dấu ba chấm bên phải biến cố
Trang 5Xuất hiện cửa sổ viết Code cho thủ tục biến cố
Hình 8.7: Chuẩn bị viết thủ tục biến cố cho n t cmd chao
- Cách 2
Bước : Bấm chuột phải vào nút cmd Hello và chọn Build Event
Hình 8.8: Chọn lệnh Build Event trong menu đối tượng
Bước 2: Xuất hiện hộp thoại Choose Builder, chọn Code Builder
Hình 8.9: Hộp thoại Choose Builder
- Cách 3
Trong cửa sổ soạn thảo mã lệnh, ta chọn Đối tượng cần tạo biến cố ở Combo Box bên trái
Trang 6Hình 8.10: Chọn đối tượng cần viết thủ tục biến cố
Và chọn tên Biến cố ở Combo Box bên phải
- Muốn các thủ tục này được sử dụng chung cho toàn bộ chương trình ứng dụng
- Tránh các đoạn lệnh trùng lắp và giúp người lập trình dễ bảo trì chương trình ứng dụng
b) PH N LOẠI
Bao gồm Thủ tục Hàm (Function) và Thủ tục Con (Sub)
Thủ tục hàm cho phép trả về một giá trị Do đó, thủ tục hàm được sử
dụng trong các biểu thức Có thể nhận tham số vào
Thủ tục con cho phép thực hiện các hành động nhưng không trả về một
giá trị và do đó thủ tục con không được dùng trong biểu thức Có thể nhận
Trong đó
Trang 7- Kh i lệnh là dãy các câu lệnh VBA mà ta muốn thi hành khi thủ tục được
gọi
- Tham s danh sách các tham số gởi vào để có giá trị cần cho thủ tục để
tính toán bên trong
Cú pháp gọi thủ tục con
Tên thủ tục tham số 1 tham số 2 …
Hoặc Call Tên thủ tục (tham số 1 tham số 2 …)
Thí dụ Viết thủ tục con truyền vào 2 tham trị x và y Tính và in ra USCLN
của 2 số đó
Hình 8.12: Thủ tục con để tìm USCLN của 2 số x và y
Gọi thủ tục con ta có thể gọi thủ tục con bằng một trong 2 cách sau:
Cách 1: Call <tên thủ tục con>(<danh sách tham số>)
Ví dụ: Call USCLN(6,9)
Cách 2: <tên thủ tục con> <danh sách tham số>
Ví dụ: USCLN 6,9
Lưu ta không được đặt cặp dấu ngoặc đơn vào danh sách các tham số khi
gọi nó (trừ cú pháp gọi thủ tục con bằng lệnh Call)
Trang 8- Kh i lệnh là dãy các câu lệnh VBA mà ta muốn thi hành khi thủ tục được
gọi
- Tham s danh sách các tham số gởi vào để có giá trị cần cho thủ tục để
tính toán bên trong
- Giá trị trả về là giá trị mà hàm trả về sau khi tính toán bên trong thủ tục
- Thông thường câu lệnh cuối cùng trong thủ tục hàm phải là câu lệnh gán
<Tên hàm <Giá trị trả về của hàm>
- Khi gọi đến một hàm phải có một biến hoặc điều khiển nhận giá trị trả về
từ hàm
e) CÖ PH P KHAI B O C C THAM S TRONG THỦ TỤC CON H M
[Byval | ByRef] <Tên tham số> As <Kiểu dữ liệu> [=<Giá trị m c định>]
Trong đó
Trang 9- ByVal: tham số được truyền theo giá trị Nếu tham số được truyền theo giá
trị thì giá trị của đại lượng truyền vào cho tham số sẽ không thay đổi theo tham số trong thủ tục
- ByRef: tham số được truyền theo địa chỉ (mặc định) Nếu tham số được
truyền theo địa chỉ thì giá trị của đại lượng truyền vào cho tham số sẽ thay đổi theo sự thay đổi của tham số trong thủ tục
- Giá trị m c định là một giá trị cụ thể được gán vào tham số trong trường
hợp tham số gởi vào không có giá trị
f) TẠO THỦ TỤC
Trong cửa sổ soạn thảo lệnh (View Code), ta chọn Insert / Procedure…
Hình 8.14: Chọn lệnh Insert Procedure để tạo thủ tục cho Module
Xuất hiện hộp thoại
Hình 8.15: Hộp thoại khai báo tạo thủ tục
Gõ tên thủ tục vào ô Name, chọn loại thủ tục là Sub hay Function ở mục Type
và chọn phạm vi áp dụng Public hay Private ở mục Scope
All Local variables as Statics: toàn bộ các biến trong thủ tục là biến tĩnh
g) BI N DỊCH THỦ TỤC
Chọn lệnh Debug / Compile… để biên dịch tất cả các thủ tục trong tập tin CSDL Nếu có lỗi sẽ dừng lại cho ta sửa
Trang 118.2.6 C C QUY ƯỚC ĐẶT T N C C TH NH PHẦN TRONG VBA
Trong quá trình viết các đoạn lệnh trong VBA ta phải khai báo, đặt tên cho các thành phần: thủ tục, biến, hằng,…theo các quy định sau:
- Bắt đầu phải là một ký tự
- Không được chứa khoảng trắng hoặc ký tự đặc biệt như: “.” , “ ” , “@” , “&”,
“$” , “#”
- Độ dài tối đa là 255 ký tự
- Không chứa các từ khóa của VBA như : Dim,If, Do,…
8.2.7 KHAI B O BIẾN
a) Ý NGH A
- Là đối tượng trung gian dùng để lưu trữ các giá trị tính toán khi chạy chương trình
- Giá trị của các biến sẽ mất đi khi chương trình ứng dụng chấm dứt hoạt động
- Microsoft Access có hai cơ chế khi sử dụng biến: tường minh (khai báo) và không tường minh (không khai báo biến) trước khi sử dụng
b) CÖ PH P
Dim <Tên biến> [As <Kiểu dữ liệu>]
- Tên biến: là tên do ta tự đặt theo quy ước đặt tên mà Microsoft Access đã quy ước Tên biến không phân biệt chữ hoa hoặc chữ thường Ta không nên đặt tên biến quá dài mà nên đặt tên biến ngắn gọn mang tính gợi nhớ Thông thường tên biến gồm 2 phần: phần đầu nói lên kiểu dữ liệu của biến, phần cuối là tên gợi nhó của biến
Thí dụ: khai báo biến kiểu chuỗi dùng để chứa tên một biểu mẫu và biến N
kiểu số nguyên:
Dim strFrmName As String
Dim intN As Integer
- Kiểu dữ liệu: là một trong các kiểu dữ liệu cơ bản Nếu ta bỏ qua phần khai báo kiểu dữ liệu thì biến sẽ có kiểu dữ liệu thay đổi (Variant)
c) KHAI B O BIẾN TƯỜNG MINH V KHÔNG TƯỜNG MINH
Để bắt buộc người lập trình phải khai báo biến tường minh trước khi sử dụng
ta dùng câu lệnh câu lệnh Option Explicit ở đầu Module Ngược lại nếu không có
câu lệnh này thì coi như ta khai báo biến không tường minh Việc khai báo biến tường minh giúp ta tránh được việc sử dụng sai tên các biến vì khi biên dịch Access sẽ thông báo lỗi khi phát hiện ra các biến có sử dụng nhưng chưa khai báo
để ta có thể sửa đổi
Trang 12d) TẦM ẢNH HƯỞNG CỦA BIẾN
- Khi ta khai báo biến trong một thủ tục thì chỉ có các câu lệnh bên trong thủ tục mới đọc hoặc tác động làm thay đổi giá trị của biến đó Ta nói tầm ảnh hưởng của biến mang tính cục bộ trong thủ tục đó Nếu ta muốn có tầm ảnh hưởng là tất cả thủ tục trong một Module hoặc tất cả các Module của ứng dụng thì ta phải khai báo nó ở đầu Module kết hợp với các từ khóa Public hoặc Private Tóm lại tầm ảnh hưởng của biến phụ thuộc vào vị trí khai báo biến và các từ khóa
- Bảng tầm ảnh hưởng theo tứ khóa:
Cấp thủ tục
Các biến có tính cục bộ ngay trong thủ tục khai báo biến
Không thể khai báo biến toàn cục trong thủ tục Cấp Module
Các biến có tính cục bộ ngay tại Module được khai báo
Các biến có thể sử dụng cho tất cả các Module chung trong ứng dụng
e) C C BIẾN SỬ DỤNG TRONG M T THỦ TỤC
Các biến cấp thủ tục chỉ được nhận ra ở tại thủ tục mà chúng khai báo Chúng
được xem như một dạng biến cục bộ Ta có thể khai báo nó bằng các lệnh Dim hoặc Static
Thí dụ: khai báo biến cục bộ X có kiểu số nguyên
Dim intX As Integer hoặc
Static intX As Integer
Lưu các biến cục bộ được khai báo bằng từ khóa Dim chỉ tồn tại khi thủ tục
đang thực hiện Còn những biến cục bộ được khai báo bằng từ khóa Static sẽ tồn
tại trong toàn bộ thời gian ứng dụng đang thực hiện
f) C C BIẾN SỬ DỤNG TRONG CÙNG M T MODULE
Để khai báo biến sử dụng chung cho cùng một Module ta đặt chúng ở đầu
Module và dùng từ khóa Dim hoặc Private
Thí dụ: khai báo biến X có kiểu nguyên dùng chung cho một Module
Option Compare Database
Option Explicit
Dim intX As Integer hoặc
Private intX As Integer
g) C C BIẾN SỬ DỤNG CHUNG CHO TẤT CẢ C C MODULE
Để khai báo biến sử dụng chung cho tất cả các Module ta đặt chúng ở đầu
Module và dùng từ khóa Public
Trang 13Thí dụ: khai báo biến X có kiểu nguyên dùng chung cho các Module
Option Compare Database
Option Explicit
Public intX As Integer
h) THỜI GIAN S NG CỦA C C BIẾN
- Thời gian sống của biến là thời gian từ lúc biến được khởi tạo cho đến khi nó được giải phóng
- Thời gian sống của những biến toàn cục hoặc những biến trong cấp Module chung hoặc Module của Form hoặc Report là bằng với thời gian tập tin CSDL được mở
- Thời gian sống của những biến cục bộ trong các thủ tục chỉ bằng với thời gian
mà thủ tục đó được chạy Nó được khởi tạo khi chạy thủ tục và được giải phóng khi chạy xong thủ tục Nếu muốn lưu giữ lại thì ta có thể dùng từ khóa
- Một hằng là một tên đầy đủ dùng thay thế cho một chuỗi hay một số mà giá trị của nó không thay đổi trong suốt thời gian ứng dụng vận hành
- Ta không thể sửa đổi hoặc gán giá trị mới vào cho một hằng
- Hằng có từ một trong hai nguồn: thứ nhất là do hệ thống định nghĩa, thứ hai do người dùng định nghĩa
b) CÖ PH P
[Public | Private] Const Tên hằng [As Kiểu dữ liệu] = biểu thức
- Tên hằng: theo quy ước đặt tên đã nói ở trên
- Kiểu dữ liệu: là một trong các kiểu dữ liệu cơ bản
- Biểu thức: là sự kết hợp của số hay hằng chuỗi và các toán tử
c) TH DỤ
Const Pi = 3.14159 Khai báo hằng Pi có giá trị 3.14159
Const DoublePi = Pi * 2 Khai báo hằng DoulePi có giá trị bằng 2*Pi
Khai báo hằng Max có giá trị bằng 10
Trang 148.2.9 C C KIỂU DỮ LIỆU ĐƠN GIẢN THƯỜNG SỬ DỤNG
a) Ý NGH A
Khi khai báo hằng hoặc biến ta cần phải chỉ ra kiểu dữ liệu của nó Kiểu dữ liệu của biến dùng chỉ định loại dữ liệu mà biến sẽ lưu trữ Mặc định khi ta khai báo biến mà không chỉ ra kiểu dữ liệu thì kiểu dữ liệu của nó sẽ là Variant (là kiểu thay đổi được)
b) C C KIỂU DỮ LIỆU CƠ BẢN
Single Số thực -3.402823E38 -1.401298E-45 (âm)
1.401298E-45 3.402823E38 (dương)
4
-4.94065645841247E-324 (âm) 4.94065645841247E-324 1.79769313486232E308 (dương)
- Dùng để khai báo cho các biến kiểu số
- Nếu biến chứa giá trị nguyên thì ta dùng kiểu Integer hoặc Long
- Nếu biến chứa giá trị lẻ thì ta dùng kiểu Single, Double, Currency
d) KIỂU DỮ LIỆU CHUỖI
- Dùng để khai báo cho các biến chứa giá trị là một chuỗi ký tự
- Khi khai báo một biến kiểu chuỗi thì chiều dài của nó thay đổi tùy theo giá trị
Trang 15- Nếu ta gán giá trị cho biến Ten có chiều dài nhỏ hơn 8 thì nó tự động thêm vào
cá ký tự trắng bên phải để cho đủ 8 ký tự Ngược lại, nếu ta gán giá trị có chiều dài lớn hơn 8 thì nó sẽ bỏ bớt các ký tự dư bên phải
- Có thể dùng các hàm RTRIM, LTRIM, TRIM để cắt các khoảng trắng dư
thừa bên phải và bên trái của một biến chuỗi
e) KIỂU DỮ LIỆU LOGIC
- Dùng để khai báo cho các biến chỉ chứa hai giá trị là Yes/No hoặc True/False
- Giá trị mặc định cho biến kiểu Logic là False
- Ta có thể dùng hàm Cdate để chuyển đổi 1 con số thành kiểu dữ liệu ngày
Thí dụ: Cdate(2) = #1/1/1900#
g) KIỂU DỮ LIỆU THAY ĐỔI VARIANT
- Là kiểu dữ liệu có thể lưu trữ nhiều loại dữ liệu khác nhau
- Biến có kiểu Variant có thể chứa các loại dữ liệu số, chuỗi, ngày hoặc giá trị Null
- VBA sẽ tự động chuyển đổi kiểu dữ liệu cho phù hợp khi ta gán những kiểu dữ liệu này cho các biến kiểu Variant
- Thí dụ:
Dim X Biến X được khai báo có kiểu Variant
X = “10” X chứa giá trị kiểu chuỗi “10”
X = X – 2 X chứa giá trị kiểu số là 8
X = X & “A” X chứa giá trị kiểu chuỗi là “8A”
- Có thể dùng hàm IsNumeric để kiểm tra xem biến có chứa giá trị kiểu số hay không Hàm này trả về giá trị True khi biến được kiểm tra chứa giá trị kiểu số
- Có thể dùng hàm IsDate để kiểm tra xem biến có chứa giá trị kiểu ngày hay
không Hàm này trả về giá trị True khi biến được kiểm tra chứa giá trị kiểu
ngày
- GI TRỊ RỖNG EMPTY
Khi một biến có kiểu Variant khi khởi tạo nó sẽ được gán một giá trị rỗng Giá trị rỗng là giá trị đặc biệt Giá trị này khác với giá trị không, một chuỗi rỗng (có chiều dài bằng không) hoặc giá trị Null Để kiểm tra một biến có giá trị
Trang 16- GI TRỊ NULL
Biến có kiểu dữ liệu thay đổi có thể chứa một giá trị đặc biệt gọi là giá trị Null Null dùng để chỉ một dữ liệu thất lạc hoặc không xác định được Các Field hoặc các Control mà không được khởi tạo trước thì giá trị mặc định là Null Ta
có thể dùng hàm IsNull để kiểm tra một biến có chứa giá trị Null hay không
Hàm này trả về giá trị True khi biến được kiểm tra chứa giá trị Null
Lưu :
- Một biểu thức có chứa giá trị Null thì kết quả trả về luôn là Null
- Phần lớn các hàm trả về giá trị Null nếu tham số mà ta truyền vào cho hàm có giá trị Null
- Có thể dùng từ khóa Null để gán giá trị Null cho một biến kiểu Variant Thí dụ
X = Null
- Chỉ có biến có kiểu dữ liệu thay đổi là có thể chứa giá trị Null
h) KIỂU DỮ LIỆU Đ I TƯỢNG OBJECT
- Các biến kiểu đối tượng sẽ lưu trữ địa chỉ của các đối tượng trong một ứng dụng hoặc trong một số ứng dụng khác
- Một biến kiểu đối tượng có thể được gán giá trị bằng câu lệnh SET
- Thí dụ: khai báo biến để tham chiếu đến một Recordset của Table
T HOSONV nằm trong tập tin CSDL hiện hành
Dim Rs As Recordset
Set Rs = CurrentDB.OpenRecordset “T HOSONV” dbOpenDynaset
8.2.10 M T S CHÚ Ý KHI SOẠN THẢO LỆNH
a) M T S QUY ƯỚC KHI SOẠN THẢO LỆNH TRONG VB
Ngôn ngữ lập trình VB không phân biệt chữ thường hay chữ in khi soạn thảo lệnh
Ví dụ:
Dim A As Byte
ta cũng có thể viết
DIM A AS BYTE hoặc dim a as byte
Mỗi lệnh phải đặt nằm trọn vẹn trên cùng một dòng màn hình
o Nếu lệnh ngắn thì ta có thể đặt nhiều lệnh trên cùng một dòng màn hình nhưng giữa các lệnh phải cách nhau bằng dấu hai chấm “:”
Ví dụ:
A=2 B=3 C=A+B
ba lệnh trên có thể được viết trên cùng một dòng màn hình là:
A=2 : B=3 : C=A+B