2016-04-03 25 views
0

入力ボックスからのユーザー入力をアルファベット、数字、および文字 'に制限する方法は? 次のコードを試しました。入力ボックスからの入力を英数字と ' - 'に制限する

For I = 1 To Len(UserInput) 

    If VBA.Asc(VBA.Mid(UserInput, I, 1)) >= 65 And VBA.Asc(VBA.Mid(UserInput, I, 1)) <= 90 Or VBA.Asc(VBA.Mid(UserInput, I, 1)) >= 0 And VBA.Asc(VBA.Mid(UserInput, I, 1)) <= 9 Or VBA.Asc(VBA.Mid(UserInput, I, 1)) = 45 
    Then 
     IsNumeric (UserInput) 
     UserInput = Cells(Row, 7).Value 
    Else 
     MsgBox ("Invalid Entry") 
    End If 
Next I 

アプリケーション定義またはオブジェクト定義エラーが表示されます。誰でも助けてもらえますか?

答えて

0

ASCIIコードの範囲が間違っているようです。数字が48から57にある、小さな文字が65から90までの範囲と大文字であるハイフンは45

さらに
Dim i As Long 
Dim result As String 
Dim UserInput As String 

For i = 1 To Len(UserInput) 

    If (Asc(Mid(UserInput, i, 1)) >= 48 And Asc(Mid(UserInput, i, 1)) <= 57) Or _ 
     (Asc(Mid(UserInput, i, 1)) >= 65 And Asc(Mid(UserInput, i, 1)) <= 90) Or _ 
     (Asc(Mid(UserInput, i, 1)) >= 97 And Asc(Mid(UserInput, i, 1)) <= 122) Or _ 
     Asc(Mid(UserInput, i, 1)) = 45 Then 
      result = result & Mid(UserInput, i, 1) 
    Else 
     Debug.Print "Removed invalid character " & Mid(UserInput, i, 1) & " (" & Asc(Mid(UserInput, i, 1)) & ")" 
    End If 
Next i 

Cells(Row, 7).Formula = result 

であなたのコード内で正しい97から122までの範囲で、あなたはいくつか欠落していました範囲が(48から57の間)または(次の範囲)または(次の範囲)またはハイフン(コード45)であることを保証する括弧。

+0

こんにちはラルフ、私のASCIIコードを修正するためのおかげで。しかし、私はまだこれに助けが必要です。ユーザー入力がたとえばMm012-1のようなものである場合、最初の文字のみが認識されます。 Userinputのすべての文字を見るためのプログラムの作成方法。 – Abhi0609

+0

私のコードは以下のとおりです。For i = 1 To Len(UserInput) If(Asc(Mid、UserInput、i、1))> = 48およびAsc(Mid(UserInput、i、1))<= 57)そして= 012 And Asc(Mid(UserInput、i、1))<= 90)および_ (Asc(Mid(UserInput、i、1))> (UserInput、i、1) 結果=結果&ミッド(UserInput、i、1) セル(Mid(UserInput、i、1))= Row、7)。式=結果 エルス 「のMsgBox( "削除、無効な文字" &ミッド(変数UserInput、I、1)& "(" &昇順(ミッド(変数UserInput、I、1))& ")") もし 終了'Loop 次へi – Abhi0609

+0

上記のコードをコピー中にエラーが発生しました!それは '(Betwenn 48と57)または(65と90の間)または(97と122の間)または45でなければならない。あなたは、**または**のためにあなたのコードで**と**のいくつかを置き換える必要があります。さらに、あなたのコードの末尾に 'Cells(Row、7).Formula = result'を割り当てる必要があります(' Next i'の行の後)。 – Ralph

0

この2つの機能は、あなたが必要なものがすべて実行する必要があります。文字列には "forbitten" の文字がない場合は、最初のものは、単に、trueを返し


Public Function textCheck(ByVal UserInput As String) As Boolean 
    Dim i As Long 
    While Len(UserInput) 
    Select Case Asc(Left(UserInput, 1)) 
    Case 45, 48 To 57, 65 To 90, 97 To 122 
     UserInput = Mid(UserInput, 2) 
    Case Else 
     Exit Function 
    End Select 
    Wend 
    textCheck = True 
End Function 

Public Function textChange(ByVal UserInput As String) As String 
    Dim str As String 
    While Len(UserInput) 
    Select Case Asc(Left(UserInput, 1)) 
    Case 45, 48 To 57, 65 To 90, 97 To 122 
     textChange = textChange & Left(UserInput, 1) 
    End Select 
    UserInput = Mid(UserInput, 2) 
    Wend 
End Function 

をそれ以外の場合はfalseです。
2番目の関数は、すべての "forbitten"文字が削除された文字列を返します。

ご質問があれば、ちょうど(まだこのコードはすべての人のために読めるように十分簡単なはずです)頼む;)

+0

@ Dirk Reichel、ありがとうございます。最初の関数でtextcheckがfalseの場合、プロセスのリダイレクト方法について教えてください。ユーザが無効な入力をしたときに正しく入力するようにしてください – Abhi0609

+0

あなたの持っているものによって異なるテキストボックスとボタンがあることを前提にして、ボタンが押されたら 'if textCheck(textbox.value)then'すべて無効で、無効な入力の場合は 'Else'です。使用可能な答えを与えるには、チェックが必要かどうかを知る必要があります(ワークシート要素やユーザーフォームなどに直接)...そして、何らかの条件付き書式設定が必要な場合は、 'WorksheetChange'イベントが必要です;) –

+0

Dirkの便利な機能を使ってdo whileループを使うことができます(〜 "〜"ごとに別々の行を使用できます):textbox〜do not while do〜textbox(.value)〜msgbox "間違った入力 - 再度タイプ"〜.setfocus〜loop〜終わり。 – user3598756

0

私は私のDO-whileループで小さなエラーを修正する必要がありました。以下のコードで動作しました。

Do 
    UserInput1 = Application.InputBox("EnterShelf Number") 
    For j = 1 To Len(UserInput1) 
    Select Case Asc(Mid(UserInput1, j, 1)) 
    Case 48 To 57 
     Cells(Row, 8).Select 
     ActiveCell.Formula = UserInput1 
     cnt1 = 0 
    Case Else 
     cnt1 = 1 
     MsgBox ("Invalid Entry") 
    End Select 
    Next 
Loop While cnt1 <> 0 
0

は、文字をループしないようにします。

テスト文字列

Sub TextVal() 
Debug.Print blStrCheck("abcdADDD-129") 
Debug.Print blStrCheck("abcdADDD-129") 
Debug.Print blStrCheck("123") 
Debug.Print blStrCheck("abcdACBC") 
Debug.Print blStrCheck("-") 
End Sub 

機能

Function blStrCheck(strIn As String) As Boolean 
Dim objRegex As Object 
Set objRegex = CreateObject("vbscript.regexp") 
objRegex.ignorecase = True 
objRegex.Pattern = "[/d-]" 
blStrCheck = objRegex.test(strIn) 
End Function 
関連する問題