Thực hiện nhiều phép kiểm tra với If...ElseIf là một kỹ thuật thuận tiện. Các bạn có thể tham khảo bài viết đầy đủ về cách sử dụng 03 dạng cú pháp câu lệnh If...Then, trong đó bao gồm: cú pháp, sơ đồ khối, các ví dụ thực tiễn áp dụng kèm giải thích chi tiết. Các bạn có thể truy cập bài viết tại đây.
Tuy nhiên, nếu muốn có nhanh chóng một số lượng các kiểm tra mà bạn cần lớn hơn thì câu lệnh Select...Case sẽ là lựa chọn tốt hơn.
Đối với câu lệnh Select...Case được sử dụng, bạn phải cung cấp một biểu thức logic ở phần đầu và sau đó liệt kê một loạt các kết quả khả thi. Mỗi giá trị được gọi là một Case, bạn cung cấp một hoặc nhiều câu lệnh VBA để thực thi sẽ là Case True. Câu lệnh Case Else được thực thi nếu biểu thức kiểm tra không khớp với bất kỳ trường hợp nào được chỉ định bởi người dùng.
Câu lệnh VBA Select... Case được sử dụng thay cho nhiều câu lệnh If lồng nhau. VBA Select Case làm cho chương trình VBA dễ hiểu và thời gian thực hiện nhanh hơn.
Cú pháp:
Select Case expression
Case expressionlist1
[statements1]
Case expressionlist2
[statements2]
....
Case expressionlistn
[ Statementsn]
Case Else
[ Elsestatements]
End Select
Trong đó:
Expression: Đây là biểu thức kiểm tra, được xét ở phần đầu cấu trúc. Nó phải trả về một giá trị (logic (đúng/sai), số, chuỗi...).
Expressionlist: Mỗi danh sách biểu thức có một hoặc nhiều kết quả khả thi cho expression. Kết quả này là các giá trị hoặc các biểu thức tách biệt nhau bằng dấu phẩy (,). VBA sẽ xem xét mỗi phần tử trong danh sách để xem một giá trị có thỏa mãn expression hay không ? Biểu thức có thể chấp nhận bất cứ một các dạng sau:
Expression (giá trị, biểu thức).
Expression to expression (một miền giá trị, biểu thức).
Is logical expression (một biểu thức logic).
Ở đây từ khóa to được sử dụng để xác định giá trị biến đổi trong một miền (ví dụ: 1 to 100). Từ khóa Is được sử dụng để xác định một miền giá trị mở (ví dụ: Is ≥ 1000).
[Statements]: Khối lệnh, mỗi khối lệnh có thể chứa 0 hay nhiều dòng lệnh. Các câu lệnh mà VBA chạy nếu bất kỳ các phần nào gắn với Expressionlist thỏa mãn biểu thức kiểm tra Expression. VBA sẽ chạy khối lệnh [ Elsestatements] nếu không có Expressionlist nào chứa giá trị thỏa mãn biểu thức kiểm tra Expression.
Sơ đồ khối:
Bạn nên sử dụng Select...Case trong một số trường hợp như sau:
● Chỉ kiểm tra 1 biến giá trị với nhiều điều kiện khác nhau.
● Nhiều điều kiện rời rạc nhưng so sánh với 1 biến cố định và có thể nhóm được.
● Biến kiểm tra đơn giản, không cần xử lý. Còn IF sẽ sử dụng cho các câu điều kiện phức tạp hơn.
● Cần lệnh dễ đọc và chỉnh sửa.
Ví dụ:
Xác định trạng thái của đất theo Bảng dưới đây:
Mở Tab Developer > chọn Trình soạn thảo Visual Basic từ nhóm Code hoặc bạn cũng có thể nhấn tổ hợp phím Alt + F11 để mở. Nhấn vào Insert > chọn Module. Hãy nhập đoạn code sau:
Sub Trang_thai_dat()
Dim do_set as single
Dim i as integer
For i = 3 To 8
Sheets(“Sheet1”).Select
do_set = cells(i,2).value
Select case do_set
Case 1, 1 to 10
cells(i,2).offset(0,1).value=”Chay”
Case 0.75 to 1
cells(i,2).offset(0,1).value=”Deo Chay”
Case 0.5 to 0.75
cells(i,2).offset(0,1).value=”Deo Mem”
Case 0.25 to 0.5
cells(i,2).offset(0,1).value=”Deo Cung”
Case 0 to 0.25
cells(i,2).offset(0,1).value=”Nua Cung”
Case is < 0
cells(i,2).offset(0,1).value=”Cung”
Case Else
End Select
Next i
End Sub
Giải thích mã:
Sử dụng từ khóa Sub để bắt đầu một thủ tục.
Sử dụng từ khóa Dim để khai báo các biến và kiểu dữ liệu của nó (biến đếm i là kiểu nguyên và biến do_set là kiểu single).
Sử dụng vòng lặp For...Next để duyệt qua các ô ở cột B từ ô B3 đến ô B8.
Sử dụng câu lệnh Select ... Case để kiểm tra giá trị độ sệt xem nó nằm trong miền giá trị nào. Nếu thỏa mãn điều kiện sẽ thực thi câu lệnh phân loại trạng thái đất bằng cách chuyển giá trị sang cột kế bên tương ứng (cột C) thông qua thuộc tính offset(0,1).
Để chạy thủ tục trên đây. Các bạn nhấn chuột phải vào Sheet1 > chọn View code > cửa sổ soạn thảo mã VBA sẽ mở ra, các bạn nhấn vào Insert > chọn Module. Sau đó chép đoạn mã trên dán vào Module. Nhấn F5 để thực thi thủ tục.
Kết quả thực thi như hình ảnh dưới đây:
Ví dụ 2: Về Xếp loại của Học sinh
Thủ tục này Xếp loại học sinh dựa trên điểm kiểm tra của họ. Trong ví dụ này, tiêu chí trường hợp thể hiện một loạt các giá trị. Bạn cũng sẽ nhận thấy rằng bạn có thể đặt các tiêu chí và hướng dẫn trên cùng một dòng. Tách tiêu chí khỏi hướng dẫn bằng dấu hai chấm.
Sub Xep_Loai_HS()
Dim Diem_TB As Range, Cot_Diem_TB As Range, Xep_Loai As Range
Set Cot_Diem_TB = Range("B2", Range("B2").End(xlDown))
For Each Diem_TB In Cot_Diem_TB
Set Xep_Loai = Diem_TB.Offset(0, 1)
Select Case Diem_TB
Case 0 To 9: Xep_Loai = "G"
Case 10 To 24: Xep_Loai = "F"
Case 25 To 34: Xep_Loai = "E"
Case 35 To 49: Xep_Loai = "D"
Case 50 To 64: Xep_Loai = "C"
Case 65 To 79: Xep_Loai = "B"
Case 80 To 89: Xep_Loai = "A"
Case 90 To 100: Xep_Loai = "A*"
End Select
Next Diem_TB
End Sub
Ví dụ 3: Trường hợp Select... Case lồng nhau
Quy trình này tính toán tổng chiết khấu. Phần trăm chiết khấu là khác nhau đối với từng loại sản phẩm nhưng cũng phụ thuộc vào số lượng mua. Quy trình sử dụng cấu trúc Select... Case lồng nhau. Trong mỗi Select... Case cho danh mục sản phẩm, có Select... Case cho Số lượng lồng nhau trả về phần trăm chiết khấu chính xác.
Sub Select_Case_Tinh_CK()
Dim Loai As Range, Cot_Loai As Range, So_Luong As Range, Gia_SP As Range, Tong_CK As Range
Dim P_tram_CK As Single
Set Cot_Loai = Range("G3", Range("G3").End(xlDown))
For Each Loai In Cot_Loai
Set So_Luong = Loai.Offset(0, 1)
Set Gia_SP = Loai.Offset(0, 2)
Set Tong_CK = Loai.Offset(0, 3)
Tong_CK.NumberFormat = "[$$-409]#,##0.00"
Select Case Loai
Case "A"
Select Case So_Luong
Case 0 To 9: P_tram_CK = 0
Case 10 To 24: P_tram_CK = 0.02
Case 25 To 49: P_tram_CK = 0.03
Case 50 To 99: P_tram_CK = 0.05
Case Is >= 100: P_tram_CK = 0.08
End Select
Tong_CK = So_Luong * Gia_SP * (1 - P_tram_CK)
Case "B"
Select Case So_Luong
Case 0 To 9: P_tram_CK = 0
Case 10 To 24: P_tram_CK = 0.05
Case 25 To 49: P_tram_CK = 0.08
Case 50 To 99: P_tram_CK = 0.1
Case Is >= 100: P_tram_CK = 0.15
End Select
Tong_CK = So_Luong * Gia_SP * (1 - P_tram_CK)
Case "C"
Select Case So_Luong
Case 0 To 9: P_tram_CK = 0
Case 10 To 24: P_tram_CK = 0
Case 25 To 49: P_tram_CK = 0.05
Case 50 To 99: P_tram_CK = 0.07
Case Is >= 100: P_tram_CK = 0.1
End Select
Tong_CK = So_Luong * Gia_SP * (1 - P_tram_CK)
End Select
Next Loai
End Sub
Giải thích mã:
Sử dụng từ khóa Dim để khai báo các biến và kiểu dữ liệu tương ứng.
Sử dụng từ khóa Set để lưu giá trị vào các biến đã khai báo.
Sử dụng câu lệnh For Each ... Next để duyệt qua các phần tử của cột G từ G3 đến G8 (loại sản phẩm). Sử dụng từ khóa set kết hợp với thuộc tính offset để lưu các giá trị của cột H, cột I và cột J tương ứng.
Với mỗi giá trị tương ứng của loại sản phẩm ta sử dụng một câu lệnh Select...Case để kiểm tra về mặt số lượng sản phẩm. Nếu thỏa mãn một trong số các điều kiện về số lượng sản phẩm, sẽ thực hiện câu lệnh tương ứng (gán giá trị phần trăm chiết khấu vào biến số) và thực hiện tính tổng chiết khấu tại các ô của cột J từ J3 đến J8.
Mở Tab Developer > chọn Trình soạn thảo Visual Basic từ nhóm Code hoặc bạn cũng có thể nhấn tổ hợp phím Alt + F11 để mở. Nhấn vào Insert > chọn Module. Sau đó chép đoạn mã trên dán vào Module. Nhấn F5 để thực thi thủ tục.
Kết quả thực thi như hình ảnh dưới đây:
Tham khảo các chủ đề có liên quan khác: