- ベストアンサー
ユーザーフォームの入力チェック方法について
- ユーザーフォームのテキストボックスの入力チェック方法について詳しく説明します。
- データを消去する際に表示されるエラーメッセージを回避する方法をご教示します。
- Excel2002の環境でのユーザーフォームのテキストボックスの入力チェックの注意点について解説します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>UserForm1に設けたコマンドボタンを押した時に以下のチェックを行いたい ということであれば、以下ではどうですか? Private Sub CommandButton1_Click() Dim i As Long For i = 5 To 8 If Len(Me("TextBox" & i).Text) = 0 Then '未入力Check MsgBox "TextBox" & i & "に入力してください", _ vbExclamation, "納品書作成ツール" Me("TextBox" & i).SetFocus Exit Sub End If If IsNumeric(Me("TextBox" & i).Text) = False Then '数値入力Check MsgBox "TextBox" & i & "に数値で入力してください", _ vbExclamation, "納品書作成ツール" Me("TextBox" & i).SetFocus Exit Sub End If Next i End Sub
その他の回答 (4)
- keithin
- ベストアンサー率66% (5278/7941)
>個数分ループ処理をすることはできないでしょうか? private sub CommandButton1_Click() dim res as string dim i as integer for i = 5 to 8 if me.controls("TextBox" & i) = "" then res = "入力してください" exit for elseif not isnumeric(me.controls("TextBox" & i)) then res = "数値を入力してください" exit for end if next i if res <> "" then me.controls("Textbox" & i).setfocus msgbox res, vbexclamation, "納品書作成ツール" end if end sub #はて? 同じ結果と言いながら回答したロジックに切り替わってますが、どういう事でしょうか。
お礼
ロジックの間違いはkeithinさんのご指摘の通りです。 ただ、いただいたロジックを Private Sub TextBox5_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) で実行すると同じ結果になってしまったということです。 再三にわたって回答いただきありがとうございました
- chayamati
- ベストアンサー率41% (260/624)
- chayamati
- ベストアンサー率41% (260/624)
失礼があったらゴメン VBAのしきたりをご存じないようですので 1、ひとくくりの命令文は Private Sub で始まり End Sub で終わります。 2、条件式は If関数と混同されていますね IF 条件式 Then 真のときの命令文(複数行または : 区切で複数の命令文可) Else 偽のときの命令文(複数行または : 区切で複数の命令文可) End If これに従うとあなたの命令文は次のようになります。 Rem**************** Rem TextBox5 Check Rem**************** Private Sub TextBox5_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox5.Text) = 0 Then '未入力Check If IsNumeric(Me.TextBox5.Text) = False Then '数値入力Check MsgBox "数値で入力してください", _ vbExclamation, "納品書作成ツール" Me.TextBox5.SetFocus Exit Sub End If Else MsgBox "入力してください", _ vbExclamation, "納品書作成ツール" Me.TextBox5.SetFocus Exit Sub End If Me.TextBox5.Text = Format(Me.TextBox5.Text, "#,##0") End Sub '--------------以下不要-------------------- Exit Sub End If MsgBox "入力してください", _ vbExclamation, "納品書作成ツール" Me.TextBox5.SetFocus Exit Sub End If Me.TextBox5.Text = Format(Me.TextBox5.Text, "#,##0") End Sub --------------------------------------------------------- 尚 複数の条件書式(N択)は Select Case 文が分かり易いです
お礼
ご指摘の通りです。 エラー回避でパニックてまして。すみません。
- keithin
- ベストアンサー率66% (5278/7941)
そもそもロジックが間違ってます。 Private Sub TextBox5_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox5.Text) = 0 Then '未入力Check MsgBox "入力してください", _ vbExclamation, "納品書作成ツール" ’Me.TextBox5.SetFocus ’オマケ cancel = true Exit Sub End If If IsNumeric(Me.TextBox5.Text) = False Then '数値入力Check MsgBox "数値で入力してください", _ vbExclamation, "納品書作成ツール" ’Me.TextBox5.SetFocus cancel = true Exit Sub End If Me.TextBox5.Text = Format(Me.TextBox5.Text, "#,##0") End Sub
補足
早速の回答ありがとうございました。 私の説明が悪かったのか、いただいたロジックでは同じ結果でした。 そもそも、Private Sub TextBox5_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) でチェックをする方法がおかしいのでは感じています。 質問内容を変えさせてもらいます UserForm1にテキストボックスが4個あります(TextBox5,TextBox6,TextBox7,TextBox8) Private Sub TextBox●_BeforeUpdateを使わず テキストボックス4個に入力が完了したと仮定して UserForm1に設けたコマンドボタンを押した時に以下のチェックを行いたい '************************************************************ If Len(UserForm1.TextBox5.Text) = 0 Then '未入力Check Me.TextBox5.SetFocus flag1=1 End If If IsNumeric(UserForm1.TextBox5.Text) = False Then '数値入力Check Me.TextBox5.SetFocus flag2=1 End If If flag1<>0 then MsgBox "入力してください", _ vbExclamation, "納品書作成ツール" Exit Sub ElseIf flag2<>0 then MsgBox "数値で入力してください", _ vbExclamation, "納品書作成ツール" Exit Sub end if '************************************************************ このプロシージャをTextBox5,TextBox6,TextBox7,TextBox8の4個を記述せずに 個数分ループ処理をすることはできないでしょうか?
お礼
ありがとうございました。 無事作業完了しました。