• ベストアンサー

Access VBA で

初めまして、eavenと申します。 Access VBAを使って、フォームにある項目に入力された数字の1つ1つにロジカルチェックを入れ、条件に当てはまればMsgBoxでNGと出力し、全ての項目で条件に当てはまらなければOKと出力したいのです。 項目が全部で15個あり、項目ごとに条件式が違います。例えば、Aという項目には  If A >= 20 Then MsgBox "AはNGです" といった単純なものです。 今回、教えていただきたいのは上記にありますように『全ての項目がOKであった場合』に、OKですという表示を出したいのです。 言葉足らずな質問で申し訳ありません。どうぞご教授ください。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#140971
noname#140971
回答No.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 関数は、演算子と比較値をちゃんと抽出します。

eaven
質問者

お礼

>Husky2007さん 大っっっっっっっ変お礼が遅くなって申し訳ありません!!!!もうなんとお詫びすればよいか(アセアセ)こんなに詳細なプログラムまで組んでいただいたのに・・・。 早速やってみましたが、どうも私の説明が悪かったようで、ちょっと違ったようです。ホントにすいませんでした。色々、試してみたんですが相変わらず進展なしです(涙)ちゃんと伝わるように再質問させて頂きます。

その他の回答 (3)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

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 演算子をヘルプにて。

eaven
質問者

お礼

詳細なご回答ありがとうございます! 確かに、入力規制設定したほうが楽ですよねぇ・・・。上からの指示なので あまり逆らうことが出来ないのですが、こればっかりは直訴して方法を 変えてもらうようにします! ありがとうございました!

  • bardfish
  • ベストアンサー率28% (5029/17766)
回答No.2

例えばNGを数える変数を作り、初期値にゼロをセットします。 1項目ずつチェックし、NGだった場合にNGを数える変数に1を加算していきます。 そして、チェックが終了したらNGを数える変数がゼロだったらOK、ゼロ以外だったらNGとします。 一つのたとえですので、NGの時加算するのではなくTrueをセットし最後にTrueだったらNGとする方法もあります。

eaven
質問者

お礼

ご回答ありがとうございます! 最終的に1があれば、NGとして返すということですね。 なるほど・・・。ちょっとやってみます。 ありがとうございました!

  • shut0325
  • ベストアンサー率40% (490/1207)
回答No.1

NGだった場合に適当な変数に数字を入れる。最後にその変数がNullかどうかで分岐してはどうでしょう?(Nullならok)。ただ、項目ごとにメッセージを出すよりは処理後どこが悪かったかを一括で教えた方が親切に思いますが。

eaven
質問者

補足

早速のご回答ありがとうございます。 おっしゃってることは分かるんですが、何分、昨日今日で初めてVBAを使ったものですから、どういったプログラムを組めば分からないのです・・・。 もしよろしければ、簡単な例を挙げていただけませんでしょうか。