- 締切済み
エクセルVBAについて質問です。
エクセルVBAについて質問です。 ユーザーフォームのテキストボックスに数字以外を入力するとエラーメッセージが出るように関数を作ったのですが、 Private Function AA(objtextbox As MSForms.TextBox) As Boolean Dim A As String AA = False A = Trim(objtextbox.Text) If objtextbox.Text <> "" Then If IsNumeric(A) = False Then MsgBox "数値 Error", vbCritical With objtextbox .SetFocus .SelStart = 0 .SelLength = Len(.Value) End With AA = True End If End If End Function Private Sub textbox1_exit(ByVal cancel As MSForms.ReturnBoolean) cancel = AA(TextBox1) End Sub テキストボックス200近くある場合、1つ1つに Private Sub textbox1_exit(ByVal cancel As MSForms.ReturnBoolean) cancel = AA(TextBox1) End Sub と作っていかなくてはいけないのでしょうか? プロシージャ名に変数使おうとしたら上手くできませんでした。 どなたか助けてください。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- watabe007
- ベストアンサー率62% (476/760)
>テキストボックス200近くある場合、・・・ クラスモジュールを使いました。 クラスモジュールではexitイベントが使えないのでKeyPressイベントで 数字0~9しか打ち込めない様にしています。 'ユーザーフォームモジュールに Option Explicit Dim TB(1 To 200) As New Class1 Private Sub UserForm_Initialize() Dim i As Long For i = 1 To 200 Set TB(i).txtEvent = Me.Controls("TextBox" & i) Next End Sub 'クラスモジュール(Class1)を追加して以下貼付 Option Explicit Public WithEvents txtEvent As MSForms.TextBox Private Sub txtEvent_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii <= 47 Or KeyAscii >= 58 Then KeyAscii = 0 End Sub
- end-u
- ベストアンサー率79% (496/625)
200コものTextBoxの是非は置いとくとして、 シートにコードをコピーペーストします。 A1 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) A2 Cancel = AA(Me.ActiveControl) A3 End Sub これでA1:A3まで選択して、右下コーナーのフィルハンドルを下へドラッグすれば 200のプロシージャが書けます。 もしくはClassモジュールを使ってTextBoxのイベントをまとめてもいいかもしれませんね。 ごく簡易的には 'UserForm1Module Option Explicit Private csTxt(1 To 10) As Class1 Private con As String Private Sub UserForm_Initialize() Dim i As Long For i = 1 To 10 Set csTxt(i) = New Class1 Set csTxt(i).fmTxt = Me.Controls("TextBox" & i) Next Me.TextBox1.SetFocus con = Me.ActiveControl.Name End Sub Private Sub UserForm_Terminate() Erase csTxt End Sub Sub chkTest() Dim tmp As String tmp = Me.ActiveControl.Name If con <> tmp Then If Not AA(Me.Controls(con)) Then con = tmp End If End If End Sub 'Class1Module Option Explicit Public WithEvents fmTxt As MSForms.TextBox Private Sub fmTxt_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, _ ByVal Shift As Integer) Select Case KeyCode Case 9, 13, 38, 40 Call UserForm1.chkTest End Select End Sub Private Sub fmTxt_MouseUp(ByVal Button As Integer, _ ByVal Shift As Integer, _ ByVal X As Single, _ ByVal Y As Single) Call UserForm1.chkTest End Sub こんな感じでいいかも。 ちゃんとやるなら http://www.h3.dion.ne.jp/~sakatsu/Bpca_Focus.htm このページ辺りが参考になると思います。
- nda23
- ベストアンサー率54% (777/1415)
イベントプロシージャはプロパティとしてコピーされないので、 いちいち書く必要があると思います。 各テキストボックスでチェックせず、そのテキストボックスを 使って、登録とか計算を行わせる動作(例えばボタンクリック)の 時にチェックを行っては如何でしょう。そうすればFormの中にある Controlsコレクションを使って、ループにより繰り返しの処理が 行えます。
お礼
早速のお返事有難う御座いました。 やはり1つ1つ書くしかないのですね。 VBAは2週間ほど前から勉強し始めた初心者ですが頑張ります!
お礼
回答有難う御座います。 classモジュールについてはまだ勉強してないので、 最初のオートフィルを利用した方法でやってみます。 classモジュールも時間を見つけて勉強していきたいと思います。 有難う御座いました。