Private Sub Text1_KeyPress(KeyAscii As Integer)
If (Chr(KeyAscii) > "9" Or Chr(KeyAscii) < "0") And Chr(KeyAscii) <> "." Then
    KeyAscii = 0
End If
End Sub

解决方案 »

  1.   

    在keypress中进行判断,如果不合格就sendkeys(vb_backspace)
    具体函数的参数我不太会写了,就是用sendkeys的
      

  2.   

    Private Sub Text1_KeyPress(KeyAscii As Integer)
       Select Case KeyAscii
           Case Asc("-") '允许负数
                If Text1.SelStart = 0 Then
                   If Left(Text1.Text, 1) = "-" Then
                      KeyAscii = 0
                      Beep
                   End If
                Else
                   KeyAscii = 0
                   Beep
                End If
            Case 8
                   '无变化,退格键不屏蔽
            Case Asc(" ") '32
                 If Text1.SelLength = 0 Then
                    KeyAscii = 0
                 End If
            Case Asc(".") '46 '允许小数点
                 If InStr(Text1.Text, ".") Then
                    KeyAscii = 0
                 End If
            Case Is < Asc(0) '48
                   KeyAscii = 0
            Case Is > Asc(9) '57
                   KeyAscii = 0
       End Select
    End Sub
      

  3.   

    Private Sub Text1_KeyPress(KeyAscii As Integer)
        Select Case KeyAscii
            Case Asc("0") To Asc("9")
                'do nothing
            Case Asc(".")
                'do nothing
            Case Else
                KeyAscii = 0
        End Select    
    End Sub
      

  4.   

    啊,来晚了
    同意playyuer(女爱㊣) 
      

  5.   

    playyuer(女爱㊣) 的代码很不错
      

  6.   

    Function ValiText(KeyIn As Integer, ValidateString As String, _
    Editable As Boolean) As Integer
    Dim ValidateList As String
    Dim KeyOut As Integer
    If Editable = True Then
    ValidateList = UCase(ValidateString) & Chr(8)
    Else
    ValidateList = UCase(ValidateString)
    End If
    If InStr(1, ValidateList, UCase(Chr(KeyIn)), 1) > 0 Then
    KeyOut = KeyIn
    Else
    KeyOut = 0
    Beep
    End If
    ValiText = KeyOut
    End Function
    在工程中加入此函数后,你就可以使用它了。方法:在需要限制输入的控件的 KeyPress
    加入以下代码:
    KeyAscii=ValiText(Keyascii, "0123456789/-",True)
    现在你就可以过虑掉你不希望的字符了。在此例中,我们只接受第二个参数提供的字符,
    即:"0123456789/-", 而此函数的第三个函数就决定了能否使用 [Backspace] 键。最后
    值得一提的是此函数对大小写是不敏感的。
      

  7.   

    to ttyp(懒人) 代码共享的思想不错!
    但没考虑某些细节:
    小数点只能有一个、"-"的位置只能在最左、空格键的处理!
    另外我 (playyuer) 有改进"空格键的处理"了一下:Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii <> 13 Then
       Select Case KeyAscii
           Case Asc("-") '只能在最左
                If Text1.SelStart = 0 Then
                   If Left(Text1.Text, 1) = "-" Then
                      KeyAscii = 0
                      Beep
                   End If
                Else
                   KeyAscii = 0
                   Beep
                End If
            Case Asc(vbBack)
                   '无变化,退格键不屏蔽
            Case Asc(" ") '32
                 KeyAscii = 0
                 If Text1.SelLength > 0 Then
                    Text1.SelText = ""
                 End If
            Case Asc(".") '46 Only One!!!!
                 If InStr(Text1.Text, ".") Then
                    KeyAscii = 0
                 End If
            Case Is < Asc(0) '48
                   KeyAscii = 0
            Case Is > Asc(9) '57
                   KeyAscii = 0
       End Select
    End Sub
      

  8.   

    用检测key_press或key_down的方法可行吗???!!!
    这种方法人家用ctrl+v就会出问题!
    最根本就是在onvalidate或textchange中检测。
      

  9.   

    是啊------textchange中一个right就搞定
      

  10.   

    to Wuxyingshu(无影石):
      要改 "111999111" 为 "111111" 咋办?
    to gameboy999(无名):
       playyuer 的代码 ctrl+v 没事!
       弹出"菜单"到是有必要屏蔽!Form1:
    Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    If Button = vbRightButton Then
       OldWindowProc = GetWindowLong(Text1.hWnd, GWL_WNDPROC)
       ' 取得窗口函数的地址
       Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf SubClass1_WndMessage)
       ' 用SubClass1_WndMessage代替窗口函数处理消息
    End If
    End Sub
    Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
    If Button = vbRightButton Then
       Call SetWindowLong(Text1.hWnd, GWL_WNDPROC, OldWindowProc)
       ' 恢复窗口的默认函数   ' 弹出自定义菜单
    End If
    End SubModule1:Option Explicit
    Public OldWindowProc As Long
        ' 保存默认的窗口函数的地址
    Public Const WM_CONTEXTMENU = &H7B
        ' 当右击文本框时,产生这条消息
    Public Const GWL_EXSTYLE = (-20)
    Public Const GWL_HINSTANCE = (-6)
    Public Const GWL_HWNDPARENT = (-8)
    Public Const GWL_ID = (-12)
    Public Const GWL_STYLE = (-16)
    Public Const GWL_USERDATA = (-21)
    Public Const GWL_WNDPROC = (-4)
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Function SubClass1_WndMessage(ByVal hWnd As OLE_HANDLE, ByVal Msg As OLE_HANDLE, ByVal wp As OLE_HANDLE, ByVal lp As Long) As Long
    If Msg = WM_CONTEXTMENU Then
       SubClass1_WndMessage = True
    Else
       SubClass1_WndMessage = CallWindowProc(OldWindowProc, hWnd, Msg, wp, lp)
       ' 如果消息不是WM_CONTEXTMENU,就调用默认的窗口函数处理
    End IfEnd Function
      

  11.   

    to playyuer:
        你的代码ctrl+v当然会有问题咯,如果人家拷贝的是"11abc22",你的代码将不能够去除掉中间的"1122".
    而ttyp的方法也是检验keypress/keydown之类的,自然也会对ctrl+v贴进来的无效数据束手无策。其实我有段代码在textbox的onchange中处理,不过很不想写出来(因为记不得了)~
    方法有不少,看你的需要。