2011-08-04 12 views
0

ここで私は何をしたいのですが、問題があります。 ユーザーが特定のテキストボックスに入力した内容を制限したい。私は彼に数字だけを残しておきたいが、3つの数字の後ろに ";"をつける。 (例えば、007; 123; 003; 005;)。誰かがテキストボックスに入力するものを制限する

問題は、私のテキストボックスコントロールがたくさんのコードによって生成されることです。だから私はできないか、これらのコントロールにアクションを設定する方法がわからない。

私はコントロールを生成するために使用しているコードは次のとおりです。

Set cControl = form.Controls("io" & masina).Add(
    "Forms.Label.1", "lreper" & l & pagina, True) 

With cControl 
    .Caption = "Reper" 
    .Width = 35 
    .Height = 9 
    .Top = 25 + k 
    .Left = 5 
End With 

任意のアイデア?

ありがとうございます!

+2

に感謝させていただきますが、もう少し具体的な程度...すべてだろうか? –

+2

はい。私は3つのテキストボックスを持つフォームを持っています。誰かが、これらのテキストボックスにいくつかの製品のシリアル番号を入力する必要があります。問題は、シリアル番号(例えば、003の代わりに03)のように、テキストを追加したり、3の代わりに2つの数字だけを使用したりすることです。だから私は彼らがそれらのテキストボックスに入力するものを制限したい...彼らは3つの数字を追加しない場合は、正しいSNのようにどのようにそれらを教えるためにポップアップが表示されます。また、3つの数字の後に ";"を追加したい。それでおしまい。これは具体的ですか?ありがとう! –

答えて

4

キープレスイベントを使用すると、数字と ";"だけを制限できます。チェックの条件に沿って。

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 

    Select Case KeyAscii 
     '// Numbers 0-9 
     Case 48 To 57 
      If Len(TextBox1.Text) = 3 And Right(TextBox1.Text, 3) Like "###" Then 
       KeyAscii = 0 
       GoTo DisplayFormatError 
      End If 
     '// Key ; 
     Case 59 
      If Len(TextBox1.Text) < 3 Or Not Right(TextBox1.Text, 3) Like "###" Then 
       KeyAscii = 0 
       GoTo DisplayFormatError 
      End If 
     Case Else 
      KeyAscii = 0 
      GoTo DisplayFormatError 
    End Select 

    Exit Sub 

DisplayFormatError: 
    MsgBox "Please enter serial number in the format '000;000;000'", vbInformation, "Alert!" 
End Sub 

より良い方法は、同様の方法の代わりに正規表現を使用することです。

あなたは見てい実行時にコントロールのイベントを追加するヘル​​プが必要な場合:

Add controls and events to form at runtime

EDIT(TIAGO BY REQUEST)のキー押下でユーザーフォームとテキストボックスの

動的な作成をイベント。上記のリンクの変更例を使用します。元の著者の信用。

参照を追加 - [参照可能な参照]で[Microsoft Visual Basic for Applications Extensibility]をクリックし、[OK]をクリックします。

Option Explicit 
Sub MakeForm() 
    Dim TempForm As Object ' VBComponent 
    Dim FormName As String 
    Dim NewTextBox As MSForms.TextBox 
    Dim TextLocation As Integer 
    Dim TextBoxName As String 

    '** Additional variable 
    Dim X As Integer 

    'Locks Excel spreadsheet and speeds up form processing 
    Application.VBE.MainWindow.Visible = False 
    Application.ScreenUpdating = False 

    'Create the UserForm 
    Set TempForm = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm) 

    'Set Properties for TempForm 
    With TempForm 
     .Properties("Caption") = "Temporary Form" 
     .Properties("Width") = 200 
     .Properties("Height") = 100 
    End With 

    FormName = TempForm.Name 

    TextBoxName = "MyTextBox" 

    'Add a CommandButton 
    Set NewTextBox = TempForm.Designer.Controls _ 
     .Add("Forms.TextBox.1") 

    With NewTextBox 
     .Name = TextBoxName 
     .Left = 60 
     .Top = 40 
    End With 

    'Add an event-hander sub for the CommandButton 
    With TempForm.CodeModule 

    '** Add/change next 5 lines 
    'This code adds the commands/event handlers to the form 
     X = .CountOfLines 
     .InsertLines X + 1, "Private Sub " & TextBoxName & "_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)" 
     .InsertLines X + 2, "KeyAscii = KeyPress(" & TextBoxName & ".Text, KeyAscii)" 
     .InsertLines X + 3, "End Sub" 
    End With 

    'Show the form 
    VBA.UserForms.Add(FormName).Show 

    'Delete the form 
    ThisWorkbook.VBProject.VBComponents.Remove VBComponent:=TempForm 
End Sub 

Public Function KeyPress(ByVal strText As String, ByVal KeyAscii As Integer) As Integer 

    Select Case KeyAscii 
     '// Numbers 0-9 
     Case 48 To 57 
      If Len(strText) = 3 And Right(strText, 3) Like "###" Then 
       GoTo DisplayFormatError 
      End If 
     '// Key ; 
     Case 59 
      If Len(strText) < 3 Or Not Right(strText, 3) Like "###" Then 
       GoTo DisplayFormatError 
      End If 
     Case Else 
      GoTo DisplayFormatError 
    End Select 

    KeyPress = KeyAscii 

    Exit Function 

DisplayFormatError: 
    KeyPress = 0 
    MsgBox "Please enter serial number in the format '000;000;000'", vbInformation, "Alert!" 
End Function 

(イベントハンドラクラスを使用して)別の方法ユーザーフォームで

コード:

Private colEventHandlers As Collection 
Private Sub UserForm_Initialize() 

    '// New collection of events 
    Set colEventHandlers = New Collection 

    '// Add dynamic textbox 
    Set tbxNewTextbox = Me.Controls.Add("Forms.TextBox.1", "MyNewTextbox", True) 

    With tbxNewTextbox 
     .Top = 25 
     .Left = 5 
    End With 

    '// Add the event handler 
    Dim objEventHandler As TextboxEventHandler 
    Set objEventHandler = New TextboxEventHandler 

    Set objEventHandler.TextBox = tbxNewTextbox 

    colEventHandlers.Add objEventHandler 


End Sub 

とクラスモジュールを追加してもそれを名前の変更 "TextBoxEventHandler" は、次のように追加しますコード:

Private WithEvents tbxWithEvent As MSForms.TextBox 
Public Property Set TextBox(ByVal oTextBox As MSForms.TextBox) 
    Set tbxWithEvent = oTextBox 
End Property 

Private Sub tbxWithEvent_Change() 

End Sub 

Private Sub tbxWithEvent_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 

    Select Case KeyAscii 
     '// Numbers 0-9 
     Case 48 To 57 
      If Len(tbxWithEvent.Text) = 3 And Right(tbxWithEvent.Text, 3) Like "###" Then 
       GoTo DisplayFormatError 
      End If 
     '// Key ; 
     Case 59 
      If Len(tbxWithEvent.Text) < 3 Or Not Right(tbxWithEvent.Text, 3) Like "###" Then 
       GoTo DisplayFormatError 
      End If 
     Case Else 
      GoTo DisplayFormatError 
    End Select 

    Exit Sub 

DisplayFormatError: 
    KeyAscii = 0 
    MsgBox "Please enter serial number in the format '000;000;000'", vbInformation, "Alert!" 
End Sub 
+0

+1!私が働いていないと言ったコードは、動的なフォームではなく、###; ###; ###のフォーマッタです。私は####を追加することができました。いずれにせよ、ダイナミックコントロールについての広範な説明に感謝します! –

+0

ありがとうございます、私はあなたがフォーマッタについて話していることを理解しましたが、それは私のために働きます - 私は4つのゼロを追加することはできません。申し訳ありませんがなぜあなたのために働いていないか分かりません。とにかく、これはダイナミックコントロールでOPの問題を解決することを願っています。乾杯。 – Reafidy

+0

ニースショット!説明をありがとう>>少なくとも+1のbtwをお願いました – JMax

1

AFAIKと私がよく理解していれば、の前にユーザ入力の前にこれを処理する方法はありません。

まだ、TextBox_Exitイベントを使用して後でフォーマットすることができます。 this sample of codeを適応させることができます。

+0

あなたはよく理解しています...彼らが "生きている"ものを見たいと思っています...彼らが手紙をタイプするとMsgBoxが現れて、そのテキストボックスに書き込む正しい方法が教えられます。 –

+1

@Andrei Lion:ユーザーが入力するときにTextBox_Changeイベントを使用して文字をチェックできませんでしたか?私はあなたがこのように3桁のチェックをすることができないと理解していますが、これは問題の半分を解決するようです。 – Excellll

+0

@Excellll TextBoxがドラッグアンドドロップで追加されるのではなく、小さなコードで追加されるため、TextBox_Changeは使用できません。 .Width = 35 CCONTROL .Caption = "Reper" でCCONTROL = form.Controls( "IO" &masina).Add( "Forms.Label.1"、 "lreper" &L&pagina、TRUE) を設定します.Height = 9 .Top = 25 + k 。左= 5 最後に –

1

、私はこの質問で困惑しまった...ので、私は挑戦としてそれを考えています。 :-)

ほとんどの回答は同じ解決策に含まれていますが、ほとんどの回答は「私はそれをうまくできません」というコメントもあります。ここにはSO Assign on-click VBA function to a dynamically created button on Excel Userformが含まれています。

これは私が作成したコードです...明らかに動作しません。そうでないと、は解決策になる可能性があります。その問題は、動的に作成するkeypressメソッドが必要なときに呼び出されないということです。これをテストするには、コードを 'myForm'という名前のVBAフォームに貼り付けます。

私はテキストフィールドバリデーターの有用性を証明するために、テスト目的でのみTextBox1_KeyPressを保持しました(ごめんなさい@Readfidy、あなたのコードは期待通りに機能しませんでした。列に並んで)。

誰がこのコードが動作することに興味がある場合は...私は;-)

Option Explicit 

Private Sub UserForm_Activate() 

    Dim sTextBoxName As String 
    Dim cControl As MSForms.TextBox 
    Dim sMetaFunction As String 
    Dim CodeModule 

    sTextBoxName = "lreper" 

    Set cControl = myForm.Controls.Add("Forms.TextBox.1", sTextBoxName, True) 

    With cControl 
     .Top = 25 
     .Left = 5 
    End With 

    sMetaFunction = "Private Sub " & sTextBoxName & "_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)" & vbCrLf & _ 
     vbCrLf & _ 
     vbTab & "Set KeyAscii = EvaluateText(myForm.Controls(" & sTextBoxName & "), KeyAscii)" & vbCrLf & _ 
     vbCrLf & _ 
     "End Sub" 

    Set CodeModule = ActiveWorkbook.VBProject.VBComponents.VBE.ActiveCodePane.CodeModule 
    CodeModule.InsertLines 60, sMetaFunction 

End Sub 

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 

    Set KeyAscii = EvaluateText(myForm.Controls("TextBox1"), KeyAscii) 

End Sub 

Private Function EvaluateText(ByRef oTextBox As MSForms.TextBox, ByVal KeyAscii As MSForms.ReturnInteger) As MSForms.ReturnInteger 

    If ((Len(oTextBox.Text) + 1)/4 = CInt((Len(oTextBox.Text) + 1)/4)) Then 

     If KeyAscii <> 59 Then KeyAscii = 0 

    Else 

     If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0 

    End If 

    If KeyAscii = 0 Then 

     MsgBox "Please enter serial number in the format '000;000;000'", vbInformation, "Alert!" 

    End If 

End Function 
+0

なぜ私のコードに問題があったのか分かりませんが、オフィス2010で再度テストしたところ正常に動作しました.4つのゼロを続けて追加すると、msgboxが表示されます。ダイナミックコントロールの使用例については、オリジナル投稿の編集をご覧ください。ダイナミックコントロールは確かに実行可能であり、過去に何度も使用してきました。状況によっては、ダイナミックコントロールが非常に便利な場合もありますが、私もそれらを避けようとしています。 – Reafidy