• 締切済み

エクセル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 と作っていかなくてはいけないのでしょうか? プロシージャ名に変数使おうとしたら上手くできませんでした。 どなたか助けてください。

みんなの回答

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

>テキストボックス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)
回答No.2

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 このページ辺りが参考になると思います。

motima
質問者

お礼

回答有難う御座います。 classモジュールについてはまだ勉強してないので、 最初のオートフィルを利用した方法でやってみます。 classモジュールも時間を見つけて勉強していきたいと思います。 有難う御座いました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

イベントプロシージャはプロパティとしてコピーされないので、 いちいち書く必要があると思います。 各テキストボックスでチェックせず、そのテキストボックスを 使って、登録とか計算を行わせる動作(例えばボタンクリック)の 時にチェックを行っては如何でしょう。そうすればFormの中にある Controlsコレクションを使って、ループにより繰り返しの処理が 行えます。

motima
質問者

お礼

早速のお返事有難う御座いました。 やはり1つ1つ書くしかないのですね。 VBAは2週間ほど前から勉強し始めた初心者ですが頑張ります!

関連するQ&A