Thay thế cấu trúc IF...elseif

Liên hệ QC

tony_lx

Thành viên mới
Tham gia
26/1/18
Bài viết
2
Được thích
0
Giới tính
Nam
Chào các anh, chị,

Mình đang học lập trình VBA và có một vấn đề muốn hỏi như sau, mình có thể thay cấu trúc If..elseif với hàm array hoặc hàm nào khác cho gọn code hơn không ah, mình có thử với array nhưng không thành công. Cụ thể mình có cấu trúc như sau :
- Biến a được chọn từ danh sách cụ thể trong một cell tham chiếu (Bánh kẹo, Thức uống, Mì gói)
- Biến b là kết quả đơn giá tương ứng với biến a.

var a as string
b as integer
If a = "Bánh kẹo" then
b = 50.000
elseif a = "Thức uống" then
b = 60.000
elseif a = "Mì gói" then
b = 70.000
else b = 80.000
end if
 
Nếu lựa chọn giá trị như trên thì dùng cấu trúc Select Case phù hợp hơn.

Muốn dùng mảng thì có thể ví dụ như sau:
PHP:
Dim ds, giatri
Dim i as long, ten as string, chk as boolean, kq as double
ds= array("Bánh kẹo", "Thức uống", "Mì gói")
giatri = array(50,60,70,80)
ten=sheet1.range("A1").value ''ten lấy giá trị từ ô A1 của bảng tính
For i=lbound(ds) to ubound(ds)
If ten=ds(i) then ''Tìm thấy ten trong danh sách
chk =true ''Đánh dấu tìm thấy
kq=1000*giatri(i)
Exit for
End if
Next i
''Nếu không tìm thấy thì lấy giá trị cuối cùng trong mảng giatri
if chk=false then kq=1000*giatri(ubound(giatri))
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các anh, chị,

Mình đang học lập trình VBA và có một vấn đề muốn hỏi như sau, mình có thể thay cấu trúc If..elseif với hàm array hoặc hàm nào khác cho gọn code hơn không ah, mình có thử với array nhưng không thành công. Cụ thể mình có cấu trúc như sau :
- Biến a được chọn từ danh sách cụ thể trong một cell tham chiếu (Bánh kẹo, Thức uống, Mì gói)
- Biến b là kết quả đơn giá tương ứng với biến a.

var a as string
b as integer
If a = "Bánh kẹo" then
b = 50.000
elseif a = "Thức uống" then
b = 60.000
elseif a = "Mì gói" then
b = 70.000
else b = 80.000
end if
Thử tạo sẵn 1 danh sách trên sheet, rồi dùng hàm find thì cú pháp sẽ ngắn hơn. Vả lại khi cần điều chỉnh thì điều chỉnh trên list bên ngoài sẽ thuận tiện hơn
 
Upvote 0
Thêm 1 hàm này để vui xuân:
PHP:
Function SwitchGPE(AA As String)    'AA=Left$([B2].Value,1) '
 Dim Bb As Integer
 On Error GoTo GPE
  Bb = Switch(AA = "B", 5, AA = "T", 6, AA = "M", 7, AA = "GPE.COM", 13)
Err_:
    SwitchGPE = Bb * 10 ^ 4:            Exit Function
GPE:
 If Err = 94 Then
    Bb = 8:                             Resume Err_
 End If
End Function
 
Upvote 0
Với tiền đề so sánh trị thì thay thế cấu trúc If-Then-Else bằng Select Case là đúng nhất
Select Case a
Case "Bánh kẹo"
b = 50000
Case "Thức uống"
b = 60000
Case "Mì gói"
b = 70000
Case Else
b = 80000
End Select

Muốn dùng mảng thì dùng hàm Choose và Application.Match
chiSo = Application.Match(a, Array("Bánh kẹo", "Thức uống", "Mì gói"))
If IsNumeric(chiSo) Then
b = Choose(chiSo, 50000, 60000, 70000)
Else
b = 80000
End If

Nếu khong dài lắm thì có thể dùng hàm Instr
b = Choose(Int(Instr(a, "1234567890Bánh kẹo--Thức uống-Mì gói---") / 10) + 1, 80000, 50000, 60000, 70000)
 
Upvote 0
Nếu khong dài lắm thì có thể dùng hàm Instr
b = Choose(Int(Instr(a, "1234567890Bánh kẹo--Thức uống-Mì gói---") / 10) + 1, 80000, 50000, 60000, 70000)
Em nhớ có một bài ghép chuỗi để xác định vị trí của anh rất hay mà chưa có cơ hội (đôi khi chẳng nhớ tới) để áp dụng.
 
Upvote 0
Công thức này có quá nhiều con số 0 được đem xài:
PHP:
b = Choose(Int(Instr(a, "1234567890Bánh kẹo--Thức uống-Mì gói---") / 10) + 1, 80000, 50000, 60000, 70000)

Chúc mọi người vui vẻ!
 
Upvote 0
Công thức này có quá nhiều con số 0 được đem xài:
PHP:
b = Choose(Int(Instr(a, "1234567890Bánh kẹo--Thức uống-Mì gói---") / 10) + 1, 80000, 50000, 60000, 70000)
Nếu nói về độ dài code thì đúng là có thể ngắn hơn. Nhưng trong công thức này thì khi tính ra Int(...) thì có ngay kết quả. Rút ngắn lại thành vd.
Mã:
 b = 10000*Choose(Int(Instr(a, "1234567890Bánh kẹo--Thức uống-Mì gói---") / 10) + 1, 8, 5, 6, 7)
thì khi tính được Int(...) còn phải làm phép nhân. Mà là phép nhân với 10000. Nếu là phép nhân với lũy thừa của 2 thì rất có thể optimizer code của VBA sẽ biến thành phép dịch bit (trong Delphi là shl, shr), mà đây là thao tác cực nhanh. Vd. nhân giá trị Long với 2 = 2¹ là dịch 32 bit (giá trị Long) sang trái 1 bit - nhân 17 = 10001 với 2¹ được thực hiện bằng cách dịch sang trái 1 bit tức sẽ có 100010 = 34. Còn nhân với 10000 thì chậm hơn nhiều.
Khi viết code thì độ dài code không quan trọng nhất. Có nhiều lúc tốc độ chưa quan trọng bằng sự đơn giản, dễ hiểu của code, nhưng chắc chắn tốc độ quan trọng hơn độ dài code. Tức khi 2 code dễ hiểu như nhau thì code dài hơn chút nhưng có tốc độ nhanh hơn chắc chắn ưu việt hơn code ngắn hơn nhưng tốc độ thực hiện chậm hơn.

Đóng góp một ý kiến chủ quan thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình cảm ơn tất cả các anh, chị đã đóng góp ý kiến rất nhiều.
 
Upvote 0
... khi tính được Int(...) còn phải làm phép nhân. Mà là phép nhân với 10000. Nếu là phép nhân với lũy thừa của 2 thì rất có thể optimizer code của VBA sẽ biến thành phép dịch bit (trong Delphi là shl, shr), mà đây là thao tác cực nhanh. Vd. nhân giá trị Long với 2 = 2¹ là dịch 32 bit (giá trị Long) sang trái 1 bit - nhân 17 = 10001 với 2¹ được thực hiện bằng cách dịch sang trái 1 bit tức sẽ có 100010 = 34. Còn nhân với 10000 thì chậm hơn nhiều.
Khi viết code thì độ dài code không quan trọng nhất. Có nhiều lúc tốc độ chưa quan trọng bằng sự đơn giản, dễ hiểu của code, nhưng chắc chắn tốc độ quan trọng hơn độ dài code. Tức khi 2 code dễ hiểu như nhau thì code dài hơn chút nhưng có tốc độ nhanh hơn chắc chắn ưu việt hơn code ngắn hơn nhưng tốc độ thực hiện chậm hơn.

Đóng góp một ý kiến chủ quan thôi.

1. Ngay cả nếu luỹ thừa 2 thì tôi cũng không tin VBA có optimiser như các ngôn ngữ hiện đại khác.

2. Đối với kỹ thuật diễn giải code, đem 10000 ra ngoài còn hàm một ý nghĩa khác. Code kiểu 1 ngụ ý rằng các con số trong dãy không bắt buộc phải có ước số (bội số) chung. Code kiểu 2 ngụ ý rằng các số trong dãy là bội số của 10000.
Lúc viết code, tôi chỉ cốt đưa ra giải thuật. Sửa đổi như thế nào là tuỳ thuộc vào mục đích cuối cùng.

3. Rất tiếc rằng VBA không có kiểu trình bày số theo ký hiệu khoa học (1E10 thay vì 1000000000). Mỗi lần dùng các số này đếm lượng 0's hoa cả mắt.

4. Hầu hết các bạn trên GPE này coi trọng tốc dộ và độ dài code. Sự dễ hiểu dễ chỉnh sửa là điều thứ yếu.
Vì vậy, việc bạn nêu ra "thêm một con toán nhân 10000" là điều đánh dúng vào tâm lý.

(đương nhiên cả 4 điều trên cũng là ý kiến chủ quan)
 
Upvote 0
Web KT
Back
Top Bottom