- ベストアンサー
Access VBA で
初めまして、eavenと申します。 Access VBAを使って、フォームにある項目に入力された数字の1つ1つにロジカルチェックを入れ、条件に当てはまればMsgBoxでNGと出力し、全ての項目で条件に当てはまらなければOKと出力したいのです。 項目が全部で15個あり、項目ごとに条件式が違います。例えば、Aという項目には If A >= 20 Then MsgBox "AはNGです" といった単純なものです。 今回、教えていただきたいのは上記にありますように『全ての項目がOKであった場合』に、OKですという表示を出したいのです。 言葉足らずな質問で申し訳ありません。どうぞご教授ください。 よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
各フォーム毎にチェックコードを書くのは現実的ではないと思います。 こういう場合は、以下のような InputCheck() を作成したがいいです。 これですと、 isError = InputCheck(Me) の1行で入力チェックが完了します。 例えば、 [テキスト1] >=10 [テキスト2] >=20 [テキスト3] >=30 という入力条件だとします。 この条件を[ステータスバーテキスト]に書きます。 演算子と比較値との間にブランクをおくことが動作条件です。 Private Sub Form_BeforeUpdate(Cancel As Integer) Dim isError As Boolean isError = InputCheck(Me) If isError Then MsgBox "入力条件をクリアしていないテキストボックスがあります!" Cancel = True End If End Sub Public Function InputCheck(ByVal frm As Form) As Boolean Dim ctl As Control Dim isError As Boolean Dim 演算子 As String Dim 比較値 As Double For Each ctl In frm If ctl.ControlType = acTextBox Then If Len(ctl.StatusBarText & "") Then 演算子 = Trim(CutStr(ctl.StatusBarText, " ", 1)) 比較値 = Val(CutStr(ctl.StatusBarText, " ", 2)) Select Case 演算子 Case ">" isError = CBool(ctl.Value <= 比較値) Case ">=" isError = CBool(ctl.Value < 比較値) Case "<" isError = CBool(ctl.Value >= 比較値) Case "<=" isError = CBool(ctl.Value > 比較値) Case "=" isError = CBool(ctl.Value <> 比較値) Case Else End Select End If If isError Then Exit For End If End If Next InputCheck = isError End Function Public Function CutStr(ByVal Text As String, _ ByVal Separator As String, _ ByVal N As Integer) As String Dim strDatas() As String strDatas = Split("" & Separator & Text, Separator, , 0) CutStr = strDatas(N * Abs((N <= UBound(strDatas)))) End Function InputCheck 関数を拡充していけば、大概のチェックが出来ると思います。 ステータスバーテキストを利用していますので、 >= 10 の条件に合致するように入力して下さい! と書いてもいいでしょう。 これでも、CutStr 関数は、演算子と比較値をちゃんと抽出します。
その他の回答 (3)
- nicotinism
- ベストアンサー率70% (1019/1452)
If A >= 20 And _ Int(B) = B And _ C like "a*" And _ ・・中略・・ Then Msgbox "OK" Else Msgbox "No" End If などのようにTrue となる条件をAnd演算すればよいかと 思います。すべてTrueでなければFalseとなります。 でも設計する人も入力する人も テーブルやフォームの入力規制で設定したほうが楽じゃありません? 詳しくは、And 演算子をヘルプにて。
お礼
詳細なご回答ありがとうございます! 確かに、入力規制設定したほうが楽ですよねぇ・・・。上からの指示なので あまり逆らうことが出来ないのですが、こればっかりは直訴して方法を 変えてもらうようにします! ありがとうございました!
- bardfish
- ベストアンサー率28% (5029/17766)
例えばNGを数える変数を作り、初期値にゼロをセットします。 1項目ずつチェックし、NGだった場合にNGを数える変数に1を加算していきます。 そして、チェックが終了したらNGを数える変数がゼロだったらOK、ゼロ以外だったらNGとします。 一つのたとえですので、NGの時加算するのではなくTrueをセットし最後にTrueだったらNGとする方法もあります。
お礼
ご回答ありがとうございます! 最終的に1があれば、NGとして返すということですね。 なるほど・・・。ちょっとやってみます。 ありがとうございました!
- shut0325
- ベストアンサー率40% (490/1207)
NGだった場合に適当な変数に数字を入れる。最後にその変数がNullかどうかで分岐してはどうでしょう?(Nullならok)。ただ、項目ごとにメッセージを出すよりは処理後どこが悪かったかを一括で教えた方が親切に思いますが。
補足
早速のご回答ありがとうございます。 おっしゃってることは分かるんですが、何分、昨日今日で初めてVBAを使ったものですから、どういったプログラムを組めば分からないのです・・・。 もしよろしければ、簡単な例を挙げていただけませんでしょうか。
お礼
>Husky2007さん 大っっっっっっっ変お礼が遅くなって申し訳ありません!!!!もうなんとお詫びすればよいか(アセアセ)こんなに詳細なプログラムまで組んでいただいたのに・・・。 早速やってみましたが、どうも私の説明が悪かったようで、ちょっと違ったようです。ホントにすいませんでした。色々、試してみたんですが相変わらず進展なしです(涙)ちゃんと伝わるように再質問させて頂きます。