2016-04-01 2 views
0

私はUserformを実装しており、Userformを実行する前に入力データにいくつかのチェックを含めることを望みます。特に、Userformテキストボックスへのすべての入力をチェックするのは数値ですが、テキストボックスが空白またはNullであることが有効です。私は次の実装を試みました:Userformテキストボックスは数値です(およびnull)

Select Case KeyAscii 
    Case 0, 46, 48 To 57 
    Case Else 
    MsgBox "Only numbers allowed" 
    End Select 

しかし、これは動作しません。 お願いします。 ありがとうございます!!!!!!!!!

答えて

0

たぶん少し長いですね。私は通常、クラスモジュールとコントロールのタグプロパティを使って、テキストボックスに何が入力できるかを決定します。

4つのテキストボックスを含むフォームを作成します。
テキストボックスを与えるこれらのタグ:

  • 1; CDBL
  • 2; CINT
  • 3; CSTR
  • 4; CSENTENCE

番号が貼り付けするカラムでありますフォームが保存されるときの値(私はここでそのビットを記述していません)。
テキストボックスに入力できる内容をテキストで示します.CDBLは小数点以下2桁の数値、CINTは小数点以下0桁の数値、CSTRは適切なテキスト、CSENTENCEは文章のテキストです。

clsControlTextというクラスモジュールを作成します。
は、クラスモジュールにこのコードを追加します。

Public WithEvents txtBox As MSForms.TextBox 

Private Sub txtBox_Change() 
    Static LastText As String 
    Static SecondTime As Boolean 
    Const MaxDecimal As Integer = 2 
    Const MaxWhole As Integer = 1 

    With txtBox 
    If InStr(.Tag, ";") > 0 Then 
     Select Case Split(.Tag, ";")(1) 
      Case "CDBL", "CCur" 
       'Allow only numbers with <=2 decimal places 
       If Not SecondTime Then 
        If .Text Like "[!0-9.-]*" Or Val(.Text) < -1 Or _ 
         .Text Like "*.*.*" Or .Text Like "*." & String$(1 + MaxDecimal, "#") Or _ 
         .Text Like "?*[!0-9.]*" Then 
         Beep 
         SecondTime = True 
         .Text = LastText 
        Else 
         LastText = .Text 
        End If 
       End If 
       SecondTime = False 
      Case "CINT" 
       'Allow only whole numbers. 
       If .Text Like "[!0-9]" Or Val(.Text) < -1 Or .Text Like "?*[!0-9]*" Then 
        Beep 
        .Text = LastText 
       Else 
        LastText = .Text 
       End If 
      Case "CSTR" 
       'Convert text to proper case. 
       .Text = StrConv(.Text, vbProperCase) 
      Case "CSENTENCE" 
       'Convert text to sentence case (capital after full-stop). 
       .Text = ProperCaps(.Text) 
      Case Else 
       'Allow anything. 
     End Select 
    End If 
    End With 
End Sub 

Private Function ProperCaps(strIn As String) As String 
    Dim objRegex As Object 
    Dim objRegMC As Object 
    Dim objRegM As Object 
    Set objRegex = CreateObject("vbscript.regexp") 
    strIn = LCase$(strIn) 
    With objRegex 
     .Global = True 
     .ignoreCase = True 
     .Pattern = "(^|[\.\?\!\r\t]\s?)([a-z])" 
     If .Test(strIn) Then 
      Set objRegMC = .Execute(strIn) 
      For Each objRegM In objRegMC 
       Mid$(strIn, objRegM.firstindex + 1, objRegM.Length) = UCase$(objRegM) 
      Next 
     End If 
     ProperCaps = strIn 
    End With 
End Function 

は、ユーザーフォームにこのコードを追加します。

Private colTextBoxes As Collection 

Private Sub UserForm_Initialize() 

    Dim ctrlSelect As clsControlText 
    Dim ctrl As Control 


    Me.Caption = ThisWorkbook.Name 

    Set colTextBoxes = New Collection 
    For Each ctrl In Me.Controls 
     Select Case TypeName(ctrl) 
      Case "TextBox" 
       Set ctrlSelect = New clsControlText 
       Set ctrlSelect.txtBox = ctrl 
       colTextBoxes.Add ctrlSelect 
     End Select 
    Next ctrl 

End Sub 

NBを:すべてこのコードは私のものです。私はProperCapsとCDBLのコードをこのサイトの他の場所、またはMrExcelというコードで見つけました。

+0

を使用することができます!どうもありがとう! –

+0

KeyAsciiでそれを行う方法があるのだろうか?確かに道があるはずですか? –

0

あなたはそれについて移動するための非常に興味深い方法である基本的なLIKEまたはRegexp

Sub Test() 
Debug.Print StrCheck("") 
Debug.Print StrCheck("hello kitty") 
Debug.Print StrCheck("4156") 
End Sub 

機能

Function StrCheck(strIn As String) As String 
Dim objRegex As Object 
Set objRegex = CreateObject("vbscript.regexp") 
objRegex.Pattern = "\d+" 
'vaidate empty string 
If Len(Trim(strIn)) = 0 Then 
    StrCheck = True 
Else 
'validate whether non-empty string is numeric 
    StrCheck = objRegex.Test(strIn) 
End If 
End Function 
関連する問題