Xin chỉ giúp phần hiện bảng thông báo! (2 người xem)

  • Thread starter Thread starter trungnt
  • Ngày gửi Ngày gửi
Liên hệ QC

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

trungnt

Thành viên hoạt động
Tham gia
2/2/07
Bài viết
135
Được thích
88
Tôi có viết 1 code để hiện ra bảng thông báo kiểm tra, nhưng trong quá trình kiểm tra các trường hợp, thì có trường hợp bảng thông báo hiện ra không đầy đủ hoặc hiện thị nội dung sai theo cầu kiểm tra. Tôi đã kiểm tra lại rất kỹ lưỡng vị trí các ô gán và cú pháp nhưng trình độ mới tập tành viết nên tôi vẫn chưa tìm thấy chỗ nào gây ra lỗi đó ..... mong các pác cao thủ trên diễn đàn tìm và sửa lỗi giúp...... xin chân thành cảm Pác nhiều nhiều! Tôi kèm theo File dưới đây:
 

File đính kèm

Vì không phải trong ngành nên nhìn các biến không hiểu lắm.
Tuy nhiên bạn xem lại :


1. Bạn xem đọan trích sau:

- If Ech > KEyc And Pgku1 < Pcku1 Then ...[/font]
- ElseIf Ech < KEyc And Pgku1 > Pcku1 Then ...
- ElseIf Pgku1 > Pcku1 Then ...
- ElseIf Ech < KEyc Then ...
Các điều kiện hình như không hoàn toàn loại bỏ nhau mà còn có phần trùng nhau:

- dòng ElseIf thứ 3 và thứ 2 đều có Pgku1 > Pcku1 nhưng dòng 3 không có đk nào về Ech.
- Dòng ElseIf thứ tư giống dòng thứ 2 ở Ech < KEyc nhưng dòng 4 lại không có đk về Pgku1.

Tôi không thể có lời khuyên nào để sửa, vì chả biết đặt đk thế nào là đúng theo ngành của bạn. Nhưng nếu bạn đừng cười thì xem thí dụ sau:

- If A > B and C > D then ...
- ElseIf A > B and C < D then ...
- ElseIf A < B and C > D then ...
- ElseIf A < B and C < D then ...
- Else
- End If

Như vậy ở 4 dòng đầu, không có trường hợp nào bị trùng (loại bỏ nhau hoàn toàn) và ở dòng 5 kể thêm được tất cả các trường hợp còn lại ( có dấu bằng trong bất kỳ 1 cặp nào hoặc cả 2 cặp đều bằng nhau).

2. Lập luận tương tự cho đoạn sau:

1- If Ech < KEyc And Tgrt > Tctr Then ...
End If

2- If Ech < KEyc And Pgku1 > Pcku1 Then ...
End If

3- If Tgtr > Tctr And Pgku1 > Pcku1 Then
End If

4 - If Ech > KEyc And Tgtr < Tctr And Pgku1 < Pcku1 Then ...
End If

5 - If Ech < KEyc And Tgtr > Tctr And Pgku1 > Pcku1 Then ...
End If
Nếu bạn là máy, gặp Ech < KEyc And Tgrt > Tctr, bạn thực hiện lệnh trong if 1 hay if 5?
Gặp Tgtr > Tctr And Pgku1 > Pcku1 , bạn thực hiện lệnh trong if 3 hay if 4?
Gặp Ech < KEyc And Pgku1 > Pcku1 , bạn thực hiện lệnh trong if 2 hay if 5?
 
Còn 1 chút nữa:
Select Case ...
Case >=1600
Case <=300
End Select

Vậy nếu giá trị nằm trong khoảng 300 --> 1600 thì sao? Có thể bạn bỏ qua thì vẫn được và code vẫn chạy không bị lỗi, nhưng người dùng khi nhấn nút CmdButton không thấy cái gì hiện ra, (vì bạn chả cho dòng lệnh nào,) người dùng sẽ cho rằng nút lệnh không tác dụng. Thực tế là code có chạy và xét qua các trường hợp 1 lần nhưng không có gì để thực hiện cho trường hợp đó.
Vậy bạn cho 1 Case Else, thông báo là chẳng hạn: "Đúng rồi, đi nhậu thôi!"
 
Lần chỉnh sửa cuối:
Tôi cố gắng vận dụng tất cả những điều anh đã viết để tránh sự trùng lặp bằng cách là: với 3 điều trên tôi nhóm lại thành đôi một cụ thể là A với (B và C) nhưng vẫn còn 1 trường hợp hiện thị thông báo trống rỗng....... suy nghĩ hoài mà vẫn chưa ra, mong a ra tay cứu giúp 1 lần nữa. Còn giá trị nằm trong khoảng 300 --> 1600 là không có nên tôi không đưa vào vì tôi đã khống chế giá trị đó không bao giờ xảy ra.

Select Case Kiemtra
Case 1600 To 2000
If Ech > KEyc And Pgku1 < Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi, kéo uốn đều đạt yêu cầu ...!!!!"
ElseIf Ech > KEyc And Pgku1 > Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "kéo uốn không đạt yêu cầu, mời bạn chọn lại kết cấu .....!!!!"
ElseIf Ech < KEyc And Pgku1 > Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi, kéo uốn không đạt yêu cầu, mời bạn chọn lại kết cấu .....!!!!"
ElseIf Ech < KEyc And Pgku1 < Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi không đạt yêu cầu, mời bạn chọn lại kết cấu ...!!!!"
End If
Case 250 To 300
If Ech < KEyc And (Tgtr > Tctr And Pgku1 > Pcku1) Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi, cắt trượt, kéo uốn không đạt yêu cầu, mời bạn chọn lại kết cấu ...!!!!"
ElseIf Ech < KEyc And (Tgtr < Tctr And Pgku1 < Pcku1) Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi không đạt yêu cầu, mời bạn chọn lại kết cấu ...!!!!"
ElseIf Ech < KEyc And (Tgrt > Tctr And Pgku1 < Pcku1) Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi và cắt trượt không đạt yêu cầu, mời bạn chọn lại kết cấu ...!!!!"
ElseIf Ech < KEyc And (Tgtr < Tctr And Pgku1 > Pcku1) Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi và kéo uốn không đạt yêu cầu, mời bạn chọn lại kết cấu ...!!!!"

ElseIf Ech > KEyc And (Tgtr < Tctr And Pgku1 < Pcku1) Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi, cắt trượt, kéo uốn đều đạt yêu cầu ...!!!!"
ElseIf Ech > KEyc And (Tgtr > Tctr And Pgku1 > Pcku1) Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "cắt trượt và kéo uốn không đạt yêu cầu, mời bạn chọn lại kết cấu .....!!!!"
ElseIf Ech > KEyc And (Tgtr < Tctr And Pgku1 > Pcku1) Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "kéo uốn không đạt yêu cầu, mời bạn chọn lại kết cấu .....!!!!"
ElseIf Ech > KEyc And (Tgtr > Tctr And Pgku1 < Pcku1) Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "cắt trượt không đạt yêu cầu, mời bạn chọn lại kết cấu .....!!!!"
End If
End Select
 
Lần chỉnh sửa cuối:
Bạn test kỹ 2 chuyện:
1. Trước khi sửa : thông báo trống rỗng xảy ra cho mấy trường hợp, trường hợp nào, liệt kê.
2. Sau khi sửa: thông báo trống rỗng xảy ra cho mấy trường hợp, trường hợp nào, liệt kê.

Nhớ phải test hết mọi trường hợp.

Theo lý thuyết của logic học thì bạn đã sửa đúng:
với 2 đk đúng sai thì có 2^2 = 4 trường hợp, Case 1 đúng
với 3 đk đúng sai thì có 2^3 = 8 trường hợp, Case 2 cũng đúng

Nhưng vẫn còn trường hợp cuối cùng là phủ định chưa hoàn toàn: A > B chưa phủ định hoàn toàn A < B. nghĩa là còn sót A = B
Tương tự là sót C = D và E = F
Bài trước tôi cũng có đề cập rồi. Chỉ cần 1 trong 3 cái dấu bằng xảy ra là nằm ngoài 8 trường hợp trên. Kết quả là tb="" là giá trị ban đầu của nó không bị lệnh nào làm thay đổi. Msgbox vẫn hiện lên thông báo nhưng thông báo là 1 chuỗi rỗng.
 
+ KHAI XUÂN - giúp bạn trọn vẹn lun

+ Bạn xem kỹ và cũng dễ hỉu thôi,

+ đôi khi ta cũng nên đơn giản hóa vấn đề - quan trọng là kết quả hiển thị hợp lý và sáng, gọn là được

PHP:
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" 
Select Case Kiemtra
Case 1600 To 2000
   If Ech > KEyc And Pgku1 < Pcku1 Then
                    TB = TB & Chr(10) & "ĐẠT yêu cầu:" & Chr(10) &  "cả 2 Đ/k: ĐỘ VÕNG ĐÀN HỒI, và KÉO UỐN"
   Else
                     TB = TB & Chr(10) & "KHÔNG ĐẠT yêu cầu!!!!"
                    If Ech > KEyc Then   
                                        TB = TB  & Chr(10) & "-  đ/k ĐỘ VÕNG ĐÀN HỒI     - ĐẠT"
                     Else : TB = TB  & Chr(10) & "-  đ/k ĐỘ VÕNG ĐÀN HỒI     - KHÔNG ĐẠT" : EndIf
                       If  Pgku1 < Pcku1 Then 
                                          TB = TB  & Chr(10) & "-  đ/k KÉO UỐN     - ĐẠT"
                     Else :  TB = TB  & Chr(10) & "-  đ/k KÉO UỐN     - KHÔNG ĐẠT"  : EndIf
                     TB = TB  & Chr(10) & " Mời bạn CHỌN LẠI kết cấu .....!!!!"  
   End If
Case 250 To 300
   If  Ech > KEyc And Tgtr < Tctr And Pgku1 < Pcku1 Then
                     TB = TB & Chr(10) & "ĐẠT yêu cầu!!!!" & Chr(10) &  "cả 3 Đ/k: ĐỘ VÕNG ĐÀN HỒI, CẮT TRƯỢT, và KÉO UỐN"
   Else
                     TB = TB & Chr(10) & "KHÔNG ĐẠT yêu cầu:"
 
                       If Ech > KEyc Then   
                                          TB = TB  & Chr(10) & "-  đ/k ĐỘ VÕNG ĐÀN HỒI     - ĐẠT"
                     Else : TB = TB  & Chr(10) & "-  đ/k ĐỘ VÕNG ĐÀN HỒI     - KHÔNG ĐẠT" : EndIf
                       If  Tgtr < Tctr Then 
                                          TB = TB  & Chr(10) & "-  đ/k CẮT TRƯỢT     - ĐẠT"
                     Else :  TB = TB  & Chr(10) & "-  đ/k CẮT TRƯỢT     - KHÔNG ĐẠT"  : EndIf
                       If  Pgku1 < Pcku1 Then 
                                          TB = TB  & Chr(10) & "-  đ/k KÉO UỐN     - ĐẠT"
                     Else :  TB = TB  & Chr(10) & "-  đ/k KÉO UỐN     - KHÔNG ĐẠT"  : EndIf
                     TB = TB  & Chr(10) & " Mời bạn CHỌN LẠI kết cấu .....!!!!"   
   EndIf
Case Else
 TB = TB & Chr(10) & "NGOÀI VÙNG KIỂM TRA"
End Select
 
Lần chỉnh sửa cuối:
To Trungnt: Dù bạn dùng code của TigerTiger thành công, bạn cũng nên xét lại lập luận của mình trước đây, xem thiếu sót chỗ nào để rút kinh nghiệm lần sau.
To TigerTiger: Code của bạn rút gọn rất hay, nhưng không biết chỗ case else có phù hợp với yêu cầu bài toán không, mình nghĩ hơi khác, không biết trungnt thế nào.
Chào, chúc mừng năm mới.
 
Lần chỉnh sửa cuối:
Cám ơn các anh rất nhiều. Từ hôm qua đến giờ tôi tiếp tục suy nghĩ và vận dụng tất cả những điều 2 anh đã nêu đồng thời sửa lại code cho dễ hiểu, trong sáng hơn nhưng kết quả vẫn chưa như mong muốn là thông báo xuất hiện bị rỗng......... chắc tôi đành bó tay quá. Nhờ 2 anh xem xét thêm một lần nữa đoạn code đã sửa của tôi. Nhân dịp năm mới tôi chúc 2 anh cùng gia đình thật nhiều sức khỏe, vạn sự như ý, tỉ sự như mơ và luôn có nhiều bài viết hay giúp đỡ các thành viên trong đại gia đình giaiphapexcel.com. Chào thân ái!

If Ech > KEyc Then
Select Case Kiemtra
Case Is >= 1200
If Pgku1 <= Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi, kéo uốn đều đạt yêu cầu ...!!!!"
End If
If Pgku1 > Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "kéo uốn không đạt yêu cầu, mời bạn chọn lại kết cấu .....!!!!"
End If
Case Is <= 300
If Tgtr <= Tctr And Pgku1 <= Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi, cắt trượt, kéo uốn đều đạt yêu cầu ...!!!!"
End If
If Tgtr <= Tctr And Pgku1 > Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "kéo uốn không đạt yêu cầu, mời bạn chọn lại kết cấu .....!!!!"
End If
If Tgtr > Tctr And Pgku1 <= Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "cắt trượt không đạt yêu cầu, mời bạn chọn lại kết cấu .....!!!!"
End If
If Tgtr > Tctr And Pgku1 > Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "cắt trượt và kéo uốn không đạt yêu cầu, mời bạn chọn lại kết cấu .....!!!!"
End If
End Select
MsgBoxUni VNI(TB), vbOKOnly + vbExclamation, VNI("KẾT QỦA KIỂM TRA")
End If

If Ech < KEyc Then
Select Case Kiemtra
Case Is >= 1200
If Pgku1 > Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi, kéo uốn không đạt yêu cầu, mời bạn chọn lại kết cấu .....!!!!"
End If
If Pgku1 <= Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi không đạt yêu cầu, mời bạn chọn lại kết cấu ...!!!!"
End If
Case Is <= 300
If Tgtr > Tctr And Pgku1 > Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi, cắt trượt, kéo uốn không đạt yêu cầu, mời bạn chọn lại kết cấu ...!!!!"
End If
If Tgrt > Tctr And Pgku1 <= Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi và cắt trượt không đạt yêu cầu, mời bạn chọn lại kết cấu ...!!!!"
End If
If Tgtr <= Tctr And Pgku1 > Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi và kéo uốn không đạt yêu cầu, mời bạn chọn lại kết cấu ...!!!!"
End If
If Tgtr <= Tctr And Pgku1 <= Pcku1 Then
TB = "Kết qủa kiểm tra cường độ kết cấu mặt đường theo tiêu chuẩn" & Chr(10) & "độ võng đàn hồi không đạt yêu cầu, mời bạn chọn lại kết cấu ...!!!!"
End If
End Select
MsgBoxUni VNI(TB), vbOKOnly + vbExclamation, VNI("KẾT QỦA KIỂM TRA")
End If
End Sub
 
gần tới rồi bạn ơi:
1- chỉ còn sót Ech = KEyc
2- cái này không sai nhưng có thể rút gọn lại tí:

If Pgku1 <= Pcku1 Then
... 1
End If
If Pgku1 > Pcku1 Then
... 2
End If

Rút gọn thành:
If Pgku1 <= Pcku1 Then
... 1
Else
... 2
End If

Vì Pgku1 <= Pcku1 và Pgku1 > Pcku1 là phủ định của nhau hoàn toàn.

Nếu vẫn còn lỗi, bạn thêm cái này để kiểm tra, sau đó xoá đi:

Case Else
x = IIf( Ech > KEyc , "Ech > KEyc", IIf(Ech = KEyc , "Ech = KEyc ", "Ech < KEyc "))
y= IIf(Pgku1 < Pcku1 , "Pgku1 < Pcku1 " , IIf(Pgku1 = Pcku1 , "Pgku1 = Pcku1 "; "Pgku1 > Pcku1 "))
z= IIf(Tgtr < Tctr ,"Tgtr < Tctr " , IIf(Tgtr = Tctr , "Tgtr = Tctr ", "Tgtr > Tctr "))
TB = TB & Chr(10) & x & Chr(10) & y &Chr(10) & z

Mục đích là để biết thông báo rỗng rơi vào trường hợp nào.

Cũng có cách khác kiểm tra dễ nhưng giải thích hơi dài:
Trong cửa sổ code, click chuột đánh dấu từng dòng lệnh trên thanh dọc bên trái của code, đừng đánh dấu dòng if, end if, select case, end select.
Dòng nào đánh dấu sẽ bị tô màu đỏ.
Chạy code
Khi code Pause, dòng lệnh nào phải thực hiện, trước khi thực hiện sẽ bị tô màu vàng.
Dòng lệnh nào không thực hiện sẽ không bị Pause.
Vậy xem dòng bị tô màu vàng nằm trong trường hợp nào, kiểm tra.
Nếu code không bị Pause lần nào, là sót trường hợp.

TB: Bạn cũng chịu khó nhỉ, xài code của TigerTiger, sửa <= theo đk của bạn là OK mà.
 
ptm0412 đã viết:
To TigerTiger: Code của bạn rút gọn rất hay, nhưng không biết chỗ case else có phù hợp với yêu cầu bài toán không, mình nghĩ hơi khác, không biết trungnt thế nào.

Oh, cái này tùy thuộc trungnt quyết định - viết vậy vì để cho trungnt hiểu khống chế bắt các trường hợp có thể

ptm0412 đã viết:
TB: Bạn cũng chịu khó nhỉ, xài code của TigerTiger, sửa <= theo đk của bạn là OK mà.

+ Đúng rồi Trungnt bạn cứ làm khó mình thế - thêm dấu = chắc không khó khăn với bạn nhỉ - bạn tự làm nhé

+ hay là bạn ứng dụng vào cái khác chứ không phải thông báo - nếu thế bạn cứ nói rõ / mô tả thực tế dữ liệu, ứng dụng của bạnm, thế nhé
.
 
Sau nhiều lần chỉnh sửa và thử lại rất nhiều lần, tôi đã thành công trong việc hiển thị thông báo, không còn hiển thị thông báo rỗng nữa và kết qua hiện thị đúng theo yêu cầu kiểm tra. Một lần nữa cảm ơn 2 anh rất nhiều.....
 
Web KT

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

Back
Top Bottom