• Giúp đở khai báo tên trường chỉ nhận giá trị là 3 chữ cái in hoa
  • RE: Giúp đở khai báo tên trường chỉ nhận giá trị là 3 chữ cái in hoa

    MTNQ > 28-03-14, 07:20 PM

    Cảm ơn bạn trunghieu đã bổ sung. Về sự kiện OnKeyPress mình đã giới thiệu tại đường link đầu tiên trong bài #7

    Theo như đánh giá của Mod Noname thì cách của mình là tệ nhất?
    Sao vậy nhỉ? 027
  • RE: Giúp đở khai báo tên trường chỉ nhận giá trị là 3 chữ cái in hoa

    MTNQ > 29-03-14, 12:09 PM

    Chào các bạn!
    Mình tiếp tục chỗ "một số vấn đề" còn bỏ dở trong bài viết trước (bài #9)

    1-Vấn đề 1:
    -Trước tiên mình giải thích lý do tại sao mình không dùng sự kiện On KeyPress
    Nếu dùng On KeyPress ta không code đơn giản như hướng dẫn của MS hay bạn trunghieu được do vướng mắc về Tiếng Việt có dấu và các bộ gõ khác nhau mà sẽ phải code khá vất vả theo kiểu như sau:
    Mã:
    Select Case KeyAscii
            Case ... To .., ... to ...
                 KeyAscii = 0
            Case 97 To 122
                KeyAscii = Asc(UCase(Chr(KeyAscii)))
            ..........
        End Select

    Nhưng chỗ then chốt không nằm ở vấn đề trên mà là nếu người dùng không nhập trực tiếp từ bàn phím mà copy và paste thì sự kiện On KeyPress sẽ vô tác dụng

    2-Vấn đề 2:
    Do chủ top chỉ đưa ra dk 3 chữ cái in hoa, không đề cập đến có dấu TV hay không nên mình bỏ qua dk này
    Nếu thêm Dk không dấu TV vào thì làm như sau:

    -Validation rule (trong bảng hoặc trong thuộc tính của text box ) là:
    Mã:
    (Len([Text3])=3 And Not Like "*[!a-z]*")  ' Hoặc like "???" And Not Like "*[!a-z]*"
    Nếu chấp nhận bỏ trống thì thêm Or Is Null

    Sau đó tại sự kiện after update của text box bạn code như sau:
    Mã:
    Private Sub Text3_AfterUpdate()
        Me!Text3 = UCase(ConvertToNotSign(Me!Text3))
    End Sub

    Trong code trên thì:
    -Text3 là tên text box
    -ConvertToNotSign là Hàm chuyển từ có dấu sang không dấu trong Tiếng Việt Của Mod Xuân Thanh giới thiệu tại link sau:
    http://thuthuataccess.com/forum/thread-7061.html

    Như vậy cho dù người dùng nhập chữ in hoa hay chữ thường, có dấu hay không có dấu thì đều được chuyển thành In hoa không dấu

    Chúc các bạn luôn trẻ khỏe và diễn đàn ngày một phát triển! 034
  • RE: Giúp đở khai báo tên trường chỉ nhận giá trị là 3 chữ cái in hoa

    Xuân Thanh > 29-03-14, 04:42 PM

    Chắc chỉ cần thế này là đủ theo ý của chủ topic

    Mã PHP:
    Private Sub txtABC_AfterUpdate()
        If 
    UCase(txtABC) <> txtABC Then
            MsgBox 
    "Phai nhap chu hoa" , , "Chu y"
            
    Exit Sub        '''' hoac gi gi do
        ElseIf 
    Len(txtABC) <> 3 Then
            MsgBox 
    "Chi duoc nhap 3 ky tu" , , "Chu y"
            
    Exit Sub
        
    ElseIf IsNumeric(Mid(txtABC,1,1)) = True Or IsNumeric(Mid(txtABC,2,1)) = True Or IsNumeric(Mid(txtABC,3,1)) = True Then
            MsgBox 
    " Khong duoc nhap so" , , "Chu y"
            
    Exit Sub
        End 
    If
    End Sub 

    Góp vui, các bạn tiếp tục nhé
    Thân mến
  • RE: Giúp đở khai báo tên trường chỉ nhận giá trị là 3 chữ cái in hoa

    paulsteigel > 31-03-14, 02:34 PM

    Góp vui thêm cùng bác Xuân thanh.... Thay vì dùng Msgbox thì nên dùng ngay lệnh cắt đi mấy ký tự thừa! Hoặc sử dụng kết hợp giữa Mask Edit và các kỹ thuật đã được giới thiệu cùng mấy cái dưới đây mà tôi hay dùng!

    Xin giới thiệu thêm một cách vẫn hay làm (mọi người cũng đã nói hết cả rồi) đối với việc ngăn cấm nhập một số loại số liệu và một số loại hành động (ví dụ Cắt chẳng hạn) trong ứng dụng
    Mã PHP:
    '//Khai báo kiểu cho phép nhập liệu cho dễ dùng sau này
    Public Enum KeyinMode
        NumberType = 1      ' 
    Chỉ cho nhập số
        DateType 
    2        ' Chỉ cho nhập kiểu ngày
        FormularType = 3    ' 
    Chỉ cho nhập dạng công thức
        NumberOnlyType 
    ' chỉ cho nhập số
        FreeType = 5 ' 
    cho nhập tất cả
    End Enum
    '////////////////////Đây là những thủ tục gắn trên form - giả sử là đối với textbox txtFIG_PLNST_DATE
    '
    //
    Private Sub txtFIG_PLNST_DATE_keypress(ByVal KeyAscii As MSForms.ReturnInteger)
        
    ValidateKeycode KeyAsciiDateType
    End Sub

    '///Cái này để ngăn cấm dùng cắt dán chẳng hạn (tất nhien cả phần bấm phải chuột nữa cũng phải tính đến
    Private Sub txtFIG_PLN_DATE_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        NoCutAction KeyCode, Shift
    End Sub
    '
    ///////////////////Đây là những thủ tục để trong 1 module để có thể dùng nhiều với các textbox khác nhau
    '//Cái này cấm dán
    Sub NoCutAction(kCde As MSForms.ReturnInteger, ByVal ShiftKey As Integer)
        If (ShiftKey And 2) And (kCde = Asc("V")) Then kCde = 0
    End Sub
    '
    //Cái này cho phép gõ một số thứ tùy theo lựa chọn
    Sub ValidateKeycode(kCde As MSForms.ReturnIntegerOptional iNum As KeyinMode 1)
        
    Select Case iNum
        
    Case 1:
            If 
    kCde <> vbKeyBack Then
                
    If InStr("0123456789"ChrW(kCde)) = 0 Then
                    
    If InStr("."ChrW(kCde)) <> 0 Then
                        kCde 
    AscW(AppLocale.DecimalSeparator)
                    Else
                        
    kCde 0
                    End 
    If
                
    End If
            
    End If
        Case 
    2:
            If 
    InStr("0123456789/"ChrW(kCde)) = And kCde <> vbKeyBack Then kCde 0
        
    Case 3:
            If 
    InStr("()+-*/0123456789"ChrW(kCde)) = And kCde <> vbKeyBack Then kCde 0
        
    Case 4:
            If 
    InStr("0123456789"ChrW(kCde)) = And kCde <> vbKeyBack Then kCde 0
        
    Case 5:
            
    ' enable free type
        End Select
    End Sub 
    Các bạn tham khảo qua nhé. Tất nhiên là tôi chưa kiểm soát phần chiều dài ký tự, cái đó cũng dễ kiểm soát thôi, nhưng sử dụng khi thủ tục lost_focus của textbox được kích hoạt!