Kết hợp and và or trong VBA (1 người xem)

Người dùng đang xem chủ đề này

canguocs

Thành viên hoạt động
Tham gia
28/6/14
Bài viết
100
Được thích
7
Chào anh, chị
Nhờ anh chị giúp em viết một đoạn code về toán tử and và or
Chi tiết em gửi file đính kèm ah. Đây là đoạn code em mới tập viết cho bài này nhưng chưa ra:

Mã:
Sub Kiemtra()
Sheets("Sheet1").Activate
If D4 = 0 And D5 = 0 Then
MsgBox "Dung roi"
Else
If N872 <> 0 Or N873 <> 0 Then
MsgBox "Sai roi, lam lai"
End If
End If
End Sub
Đoạn code em biết có nhiều mâu thuẫn nhưng chưa biết sửa ah (Báo lỗi end if)

Em cảm ơn!
 

File đính kèm

Chắc là thế này
Sub Kiemtra()
Sheets("Sheet1").Activate
If [D4] = 0 And [D5] = 0 Then
MsgBox "Dung roi"
Else
MsgBox "Sai roi, lam lai"
End If
End Sub
Ở dưới cũng là D4 và D5 đấy ah
Do em viết nhầm anh ah
Anh có thể giúp em sửa lại đoạn code trên được ko ah
 
Upvote 0
Thì bạn ấy gtri đã sửa đúng rồi còn gì?
Anh ý vừa thay đổi bài anh ah
Em cảm ơn anh
Em biết sai ở đâu rồi ah
Lúc đầu em làm đúng câu lệnh như Anh gtri
nhưng D4 và D5 em ko cho trong [D4] nên thành bị quẩn ah
câu lệnh lúc đầu của em đây ah
Mã:
Sub kiemtra()
Sheets("so sanh").Activate
If N872 = 0 And N873 = 0 Then
MsgBox "Dung roi"
Else
MsgBox "Sai roi, lam lai"
End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Làm gì có vụ so sánh kiểu này ta?
Chính xác là không thể so sanh như anh Hải được! Chắc anh có chút nhầm lẫn.
Em Test thử với code này nó luôn cho kết quả là "Sai roi lam lai".
Mã:
Sub Kiemtra2()
Sheets("Sheet1").Activate
If [D4] = [D5] = 0 Then
    MsgBox "Dung roi"
Else
    MsgBox "Sai roi, lam lai!"
End If
End Sub
 
Upvote 0
Làm gì có vụ so sánh kiểu này ta?

Ẹc ẹc mình gõ dấu + ai dè ra dấu =

Nhưng mà nói không có cấu trúc so sánh như thế thì em không chịu à nghen

Vì nếu D4= 0 và D5 = 0 thì ...
Vậy tại sao không cho viết If [D4]=[D5]=0 Then
Ai test thấy sai thì test vài lần nữa đi nhá
 
Lần chỉnh sửa cuối:
Upvote 0
Chính xác là không thể so sanh như anh Hải được! Chắc anh có chút nhầm lẫn.
Em Test thử với code này nó luôn cho kết quả là "Sai roi lam lai".
Mã:
Sub Kiemtra2()
Sheets("Sheet1").Activate
If [D4] = [D5] = 0 Then
    MsgBox "Dung roi"
Else
    MsgBox "Sai roi, lam lai!"
End If
End Sub

Em test cũng thấy vậy ah
Em chia sẻ thêm một chút ah, em học VBA chủ yếu là học hỏi thêm và hiểu được code anh chị viết (công việc của em khá bận)
Sau này có nhờ anh chị viết code cũng dễ đọc hơn
Tranh thủ trong giờ làm việc em đọc sách của anh Hướng và thủ làm những code theo mẫu
Em luôn mong được sự góp ý và chia sẻ kinh nghiệm của anh chị để càng học hỏi được nhiều hơn ah
Chúc anh, chị một ngày vui
 
Upvote 0
Nếu vậy thì If [D4] = [D5] <> 0 Then
Có biết bài toán có dữ liệu thế nào đâu, nhưng phải cho so sánh ghép chứ

Nói chung là trong VBA hổng có kiểu so sánh như vậy
Hoặc là:
If ([D4] = [D5]) <> 0 Then
hoặc là:
If [D4] = ([D5] <> 0) Then
Ý Hải muốn nói đến cái trên hay dưới
Mà dù là "trên" hay "dưới" gì thì cũng... kỳ cục: Trong ngoặc ra kết quả TRUE, FALSE lại đi so với 1 giá trị khác hổng phải dạng Boolean
 
Upvote 0
Ẹc ẹc mình gõ dấu + ai dè ra dấu =

Nhưng mà nói không có cấu trúc so sánh như thế thì em không chịu à nghen

Vì nếu D4= 0 và D5 = 0 thì ...
Vậy tại sao không cho viết If [D4]=[D5]=0 Then
Ai test thấy sai thì test vài lần nữa đi nhá

Có lẽ là If [D4] & [D5] = 0 Then
 
Upvote 0
Tại sao không: If .... And .... Then cho nó đơn giản
mà phải lòng vòng và rắc rối (và chưa chắc đã trúng)
 
Upvote 0
Nói chung là trong VBA hổng có kiểu so sánh như vậy
Hoặc là:
If ([D4] = [D5]) <> 0 Then
hoặc là:
If [D4] = ([D5] <> 0) Then
Ý Hải muốn nói đến cái trên hay dưới
Mà dù là "trên" hay "dưới" gì thì cũng... kỳ cục: Trong ngoặc ra kết quả TRUE, FALSE lại đi so với 1 giá trị khác hổng phải dạng Boolean
Đọc xong bài này thì em ngộ được 1 vấn đề, nhưng không nói ra đâu vì sợ xấu...cọp. Phải liều vậy mới hiểu thêm chút
 
Upvote 0
Nếu vậy thì If [D4] = [D5] <> 0 Then
Có biết bài toán có dữ liệu thế nào đâu, nhưng phải cho so sánh ghép chứ

Biểu thức lôgíc a = b = c được tính như sau: Trước hết tính mệnh đề a = b và kết quả trung gian là x. Tiếp theo tính kết quả của x = c và trả về kết quả là kết quả của "a = b = c". Tóm lại "a = b = c" được tính y như "(a = b) = c"

Dù là "... = 0" hay "... <> 0" thì không thể tương đượng với [D4] = 0 and [D5] = 0

Ví dụ.

1. D4 = 0, D5 = 0 => [D4] = 0 and [D5] = 0 trả về TRUE
Nhưng D4 = D5 = 0 => (D4 = D5) = 0 => TRUE = 0 => kết quả là FALSE

2. D4 = 1, D5 = 1 => [D4] = 0 and [D5] = 0 trả về FALSE
Nhưng D4 = D5 <> 0 => (D4 = D5) <> 0 => TRUE <> 0 => kết quả là TRUE
----------
Trong VBA:
1. Nếu s được khai báo là Variant và s = "chuỗi bất kỳ" thì (s = TRUE) và (s = FALSE) đều trả về FALSE, và (s <> TRUE) và (s <> FALSE) đều trả về TRUE
Nếu s được khai báo là String thì phép so sánh có lỗi.

2. (TRUE = -1) và (FALSE = 0) đều trả về TRUE, và (TRUE <> -1) và (FALSE <> 0) đều trả về FALSE
Cụ thể vd. nếu b = TRUE thì (b <> -1) trả về FALSE và (b = -1) trả về TRUE.
 
Upvote 0
Sau khi đọc kỹ bài 16 và bài 20 em quyết định hỏng thèm so sánh kiểu này nữa, nhức đầu quá. Dùng thêm cái And hoặc thêm 1 cái If nữa cho gọn.
Khó nhai như thế mà các anh hiểu được tài thiệt đó.
 
Upvote 0
Đối với VBA, biểu thức (a = b = c) không được hiểu theo quy ước toán học là a = b và b = c; và vì = có tính truyền dẫn cho nên a = c

VBA coi biểu thức này ở dạng:
biểu thức a . toán tử 1 . biểu thức b . toán tử 2 . biểu thức c

Nếu một biểu thức có trên 1 toán tử thì VBA phải áp dụng luật sử lý thứ tự.

VD, nếu trong biểu thức a + b * c thì VBA phải áp dụng luật * ưu tiên hơn +. Và nó tính b*c trước rồi đem cộng cho a

Theo luật thứ tự, hai toán tử giống nhau hoặc cùng đẳng cấp nhau thì sẽ sử lý từ phải sang trái.

Trong VBA, đồng thời toán tử = cũng được dịch tuỳ theo ngữ cảnh

Biểu thức a = b = c nếu chỉ đứng riêng thì được dịch theo ngữ cảnh dấu = thứ nhất là phép gán và dấu = thứ 2 là phép so sánh. Tức là đem b so với c và đem kết quả gán cho a.

Biểu thức a = b = c nếu đặt trong ngữ cảnh so sảnh (những lệnh như IF, select) thì cả hai dấu = đều được coi là phép so sánh. Vì phép = là loại toán tử 2 ngôi (cần một vế trái và 1 vế phải) cho nên VBA phải sử dụng luật thứ tự toán tử. Tức là nó sử lý toán tử = thứ nhất trước, sau đó đem kết quả làm vế trái cho toán tử = thứ hai.

Lưu ý là cùng biểu thức (a = b = c) nhưng trong trường hợp thứ nhất, hai dấu = là hai toán tử khác nhau, dấu = thứ hai (phép so sánh) được ưu tiên hơn dấu thứ nhất (phép gán). Trong trường hợp thứ hai, cả hai dấu = đều là toán tử so sánh, không có thằng nào ưu tiên, cho nên thằng thứ nhất được sử trước.
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom