Tối ưu hộ code

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

ThuNghi

Hãy cho rồi sẽ nhận!
Thành viên đã mất
Tham gia
16/8/06
Bài viết
3,808
Được thích
4,449
Tôi thấy form này cũng khá hay, file của Minhlev.
Code sau là khi y update thì kiểm tra ngày có hợp lệ
Nhờ các bạn tôi ưu hộ. Cám ơn
Private Sub y_AfterUpdate() 'MinhLev
If Me.m.Value > 12 Then MsgBox "Sai thang", , "Mr Minh"
If Me.m.Value = 2 And Me.d.Value > 29 Then MsgBox "Sai ngay", , "Mr Minh"
If Me.m.Value = 1 And Me.m.Value = 3 And Me.m.Value = 5 And _
Me.m.Value = 7 And Me.m.Value = 8 And Me.m.Value = 10 And Me.m.Value = 12 _
And Me.d.Value > 31 Then MsgBox "Sai ngay", , "Mr Minh"
If Me.m.Value = 4 And Me.m.Value = 6 And Me.m.Value = 9 And _
Me.m.Value = 11 And Me.d.Value > 30 Then MsgBox "Sai ngay", , "Mr Minh"
If Len(Me.y.Value) >= 5 Or Len(Me.y.Value) = 3 Or Len(Me.y.Value) = 1 _
Then MsgBox "Sai nam", , "Mr Minh"
End Sub
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
ThuNghi đã viết:
Tôi thấy form này cũng khá hay, file của Minhlev.
Code sau là khi y update thì kiểm tra ngày có hợp lệ
Nhờ các bạn tôi ưu hộ. Cám ơn

Em chẳng biết có rút gọn hơn không, nhưng dễ hiểu hơn thôi :
PHP:
Option Explicit
Private Sub y_AfterUpdate()
    Select Case Me.m.Value
    Case Is > 12
        MsgBox "Sai thang", , "Mr Minh"
    Case 2
        If Me.d.Value > 29 Then MsgBox "Sai ngay", , "Mr Minh"
    Case 1, 3, 5, 7, 8, 10, 12
        If Me.d.Value > 31 Then MsgBox "Sai ngay", , "Mr Minh"
    Case 4, 6, 9, 11
        If Me.d.Value > 30 Then MsgBox "Sai ngay", , "Mr Minh"
    End Select
    
    Select Case Len(Me.y.Value)
    Case Is <> 0, Is <> 2, Is <> 4
        MsgBox "Sai nam", , "Mr Minh"
    End Select
End Sub


Thân!
 
Upvote 0
Gởi Mr.Hiếu
Hình như chưa ổn, mình nhập 11/12/2007 nó vẫn báo Sai năm và nhập 35/15/2007 thì chỉ báo Sai tháng

Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
tedaynui đã viết:
Gởi Mr.Hiếu
Hình như chưa ổn, mình nhập 11/12/2007 nó vẫn báo Sai năm và nhập 35/15/2007 thì chỉ báo Sai tháng

Thân!
Em chưa thử File, em mới dịch từ code của bác ThuNghi thôi. Còn File thì . . . để xem đã.

Thân!
 
Upvote 0
Vậy xin mình mượn code của Mr.Hiếu để thêm tí và xin được góp ý
Mã:
Option Explicit
Private Sub y_AfterUpdate()
Dim kq As String
    Select Case Me.m
    Case 2
        If Me.d > 29 Then kq = kq & "Sai ngay" & Chr(13)
    Case 1, 3, 5, 7, 8, 10, 12
        If Me.d > 31 Then kq = kq & "Sai ngay" & Chr(13)
    Case 4, 6, 9, 11
        If Me.d > 30 Then kq = kq & "Sai ngay" & Chr(13)
    End Select
    If Me.d > 31 Then kq = kq & "Sai ngay" & Chr(13)
    If Me.m > 12 Then kq = kq & "Sai thang" & Chr(13)
    If Len(Me.y) <> 4 Then kq = kq & "Sai nam"
    If kq <> "" Then MsgBox kq, , "Mr Minh"
End Sub
Thanks Mr.Hiếu
Thân!
TDN
 
Upvote 0
Sẽ điệu nghệ hơn nếu khai thêm 1 biến chuỗi để chứa các chữ:
"Tháng"/"Năm"/"Ngày"
Sau đó dùng 1 MsgBox mà thôi!

&ui thôi nha!
Mã:
    Msgbox "Sai " & STemp, , "CFC là lẹ mà!"
 
Upvote 0
tedaynui đã viết:
Vậy xin mình mượn code của Mr.Hiếu để thêm tí và xin được góp ý
Mã:
Option Explicit
Private Sub y_AfterUpdate()
Dim kq As String
    Select Case Me.m
    Case 2
        If Me.d > 29 Then kq = kq & "Sai ngay" & Chr(13)
    Case 1, 3, 5, 7, 8, 10, 12
        If Me.d > 31 Then kq = kq & "Sai ngay" & Chr(13)
    Case 4, 6, 9, 11
        If Me.d > 30 Then kq = kq & "Sai ngay" & Chr(13)
    End Select
    If Me.d > 31 Then kq = kq & "Sai ngay" & Chr(13)
    If Me.m > 12 Then kq = kq & "Sai thang" & Chr(13)
    If Len(Me.y) <> 4 Then kq = kq & "Sai nam"
    If kq <> "" Then MsgBox kq, , "Mr Minh"
End Sub
Thanks Mr.Hiếu
Thân!
TDN
Bác thân mến !

Sao trong Select Case lại có kq = kq & "Sai ngay" & Chr(13)
Chẳng phải trước đó kq = "" sao, vì vậy có thêm để làm gì nhỉ ???
Theo em chỉ cần kq = "Sai ngay" & Chr(13)

Dòng : If Me.m > 12 Then kq = kq & "Sai thang" & Chr(13)
sao không cho vào select case luôn để dễ kiểm soát ??

Thân!
 
Upvote 0
Hi hi, cám ơn Hiếu nha. Bây giờ nhìn lại mới thấy bùn cười. Thiệt tình là ngớ ngẩn.
Code trên sẽ có trường hợp trong thông báo có hai lần "Sai ngày". Đồng thời tiếp thu góp ý của Mr.Hiếu mình sửa lại như sau
Mã:
Option Explicit
Private Sub y_AfterUpdate()
Dim kq As String
If Me.d > 31 Then
    kq = "Sai ngay" & Chr(13)
Else
    Select Case Me.m
    Case 2
        If Me.d > 29 Then kq = "Sai ngay" & Chr(13)
    Case 1, 3, 5, 7, 8, 10, 12
        If Me.d > 31 Then kq = "Sai ngay" & Chr(13)
    Case 4, 6, 9, 11
        If Me.d > 30 Then kq = "Sai ngay" & Chr(13)
    End Select
End If
    If Me.m > 12 Then kq = kq & "Sai thang" & Chr(13)
    If Len(Me.y) <> 4 Then kq = kq & "Sai nam"
    If kq <> "" Then MsgBox kq, , "Mr Minh"
End Sub

Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
Giờ em mới xem File !!!!!!!!!!!!!
Ai lại tạo cái nhập ngày tháng như vậy. Sao không chỉ là 1 textboxt thì có phải là lập trình nhanh hơn rất nhiều không.

Ai lại làm 3 textbox : d,m,y !!!! Bill cười chết.

Thân!
 
Upvote 0
Mr Okebab đã viết:
Giờ em mới xem File !!!!!!!!!!!!!
Ai lại tạo cái nhập ngày tháng như vậy. Sao không chỉ là 1 textboxt thì có phải là lập trình nhanh hơn rất nhiều không.
Ai lại làm 3 textbox : d,m,y !!!! Bill cười chết.
Thân!
Hiếu gợi ý xem, thật sự mình chưa hình dung được nếu nhập trên 1 textbox. Vì khi làm 1 textbox thì mình phải nhập luôn 2 dấu "/"...

Thanks !
Thân!
 
Upvote 0
Cập nhật đây
Mã:
Private Sub y_AfterUpdate()
    Dim kq As String
    Dim HO As Integer, mo As Variant
    '----------------------------
    Const wrongyear = "Nhap sai nam", wrongmonth = "Nhap sai thang", wrongday = "Nhap sai nagy "

    y = Me.y.Value
    m = Me.m.Value
    d = Me.d.Value
    
    If y > 9999 Or y < 1 Then ' tuy yeu cau ve nam vd 1900 - 2099
        kq = wrongyear
        Exit Sub
    End If
    If m < 1 Or m > 12 Then
        kq = wrongmonth
        Exit Sub
    End If

    If Year(y) Mod 4 = 0 And (Year(y) Mod 100 <> 0) Or (Year(y) Mod 400 = 0) Then HO = 29 Else HO = 28
    mo = Array(31, HO, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
    EOM = mo(m - 1)
    
    If Me.d < 1 Or Me.d > EOM Then
        kq = wrongday
        Exit Sub
    End If

    If Len(kq) > 0 Then MsgBox kq, , "Mr Minh"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
tedaynui đã viết:
Hiếu gợi ý xem, thật sự mình chưa hình dung được nếu nhập trên 1 textbox. Vì khi làm 1 textbox thì mình phải nhập luôn 2 dấu "/"...

Thanks !
Thân!

Mình có thể tạo một UF để biến chuỗi 8 chữ số thành ngày. Tuy nhiên ta phải nhập đủ.
VD :
24092007 --->> 24/09/2007

thân!
 
Upvote 0
Mr Okebab đã viết:
Mình có thể tạo một UF để biến chuỗi 8 chữ số thành ngày. Tuy nhiên ta phải nhập đủ.
VD :24092007 --->> 24/09/2007
thân!
Cái này dựa vào giải pháp của Anh Tuấn mình có làm rồi, khá đơn giản, khỏang chục dòng.

Thân!
 
Upvote 0
tedaynui đã viết:
Cái này dựa vào giải pháp của Anh Tuấn mình có làm rồi, khá đơn giản, khỏang chục dòng.

Thân!
Cũng chẳng biết là có giống anh Tuân không. Bác tham khảo nhé :
(Em sử dụng UF)
Còn cái của bác đâu, show cho anh em chứ, ai lại giấu thế.
Thân!
 

File đính kèm

Upvote 0
Mr Okebab đã viết:
Cũng chẳng biết là có giống anh Tuân không. Bác tham khảo nhé :
(Em sử dụng UF)
Còn cái của bác đâu, show cho anh em chứ, ai lại giấu thế.
Thân!
Ac ac, nào có dám giấu. Số là hôm trước chát với Anh Tuấn nên viết nhanh qua chát, không lưu. Chỉ là 1 đoạn ngắn, xử lý trên Sheet. Nhưng quên mất rồi. hic hic.. Anh Tuấn ơi post giúp em với, cứu bồ nhé. Thanks!

Thân!
TDN
 
Upvote 0
tedaynui đã viết:
Ac ac, nào có dám giấu. Số là hôm trước chát với Anh Tuấn nên viết nhanh qua chát, không lưu. Chỉ là 1 đoạn ngắn, xử lý trên Sheet. Nhưng quên mất rồi. hic hic.. Anh Tuấn ơi post giúp em với, cứu bồ nhé. Thanks!

Thân!
TDN

Hồi hộp nhỉ ???--=----=--

Về việc có định dang __/__/____ en nghĩ đến format, nhưng lại làm không được. Thôi thì đành dùng tiểu xảo vậy (UF) !!--=0 Bác thấy được không ???
Còn việc kiểm tra ngày tháng thì . . quá dễ rồi phải không bác.

Thân!
 
Upvote 0
Thật sự Hiếu rất sáng tạo. Mình cũng nghĩ mãi mà vẫn không biết cách Format textbox thành "__/__/___". Bây giờ thì không phải mệt óc nữa, hi hi
Cám ơn Hiếu nhiều nhé !

Thân!
 
Upvote 0
Nó đây nè.. dùng Worksheet_Change.. Bắp xem có cải tiến gì dc nữa ko?
ANH TUẤN
 

File đính kèm

Upvote 0
anhtuan1066 đã viết:
Nó đây nè.. dùng Worksheet_Change.. Bắp xem có cải tiến gì dc nữa ko?
ANH TUẤN
Cái này em khai báo biến hơi bị ngược ( y là d, mà d là y) hic hic
Cái này có thể dùng kết hợp với Form của Hiếu chắc là tốt thôi.

Thân!
 
Upvote 0
anhtuan1066 đã viết:
Nó đây nè.. dùng Worksheet_Change.. Bắp xem có cải tiến gì dc nữa ko?
ANH TUẤN
Cũng là một ý hay, tuy nhiên công dụng khác. (Dĩ nhiên công thức của các bác là hay rồi, nếu là em thì em không làm được thế, vì thế em sẽ phải . . làm khác--Vì khác nhau ý tưởng thôi)
Tuy nhiên :
  1. Biến r để làm gì nhỉ ???
  2. Nên tạo thành 1 UF là CheckDay thì hơn, để sử dụng dễ dàng ở bất cứ TH nào, sheet nào.
Thân!
 
Upvote 0
Web KT

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

Back
Top Bottom