• ベストアンサー

Access VBA で

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

  • eaven
  • お礼率63% (7/11)

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

  • ベストアンサー
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/17765)
回答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を使ったものですから、どういったプログラムを組めば分からないのです・・・。 もしよろしければ、簡単な例を挙げていただけませんでしょうか。

関連するQ&A

  • アクセスVBAについて

    こんにちわ。 アクセス初心者です。 分からないので質問をさせていただきます。 アクセスにて テーブルAの中のフィールドBがあるとします。 その中の値には 1 2 A 1 1 A ァ 1 等がある場合と 単に数字の 1 12 123 等がある場合があります。 それを区別するために フォームのボタンを押せば 記号あり。 記号ななし。 と表示するようにしたいのですが フォームのイベントプロシージャにはどのように記述すればよろしいでしょうか。 IsNumericを使って数値か判断するのかなとは思っています。 If IsNumeric([A]) = Then  MsgBox "記号あり。" Else MsgBox "記号なし" End If では全然できなくて、、、 先輩方の知恵をお借りしたくお願いします。

  • アクセスの印刷VBAを教えて下さい

    アクセス初心者です。 バージョンは2002を使っています。 ネットで探して詳しく分からないままプログラムしています。 フォームで印刷のコマンドボタンを作ってそのボタンをクリックすると表示されてる 1ページのみ印刷したいのですが全てのレコードが印刷されてしまいます。 どうすればいいのか教えて下さい。 下記が今現在のVBAです。 Private Sub 印刷_Click() Dim varCopies As Variant varCopies = InputBox("部数を数字で入力してください", "印刷部数の指定") If Len(varCopies) = 0 Then Exit Sub End If If IsNumeric(varCopies) = False Then MsgBox "部数は数字で入力してください", vbOKOnly + vbCritical, "入力エラー" Exit Sub ElseIf CLng(varCopies) = 0 Then MsgBox "部数は0以上で入力してください", vbOKOnly + vbCritical, "入力エラー" Exit Sub End If If MsgBox("印刷しますか?" & vbCrLf & "部数=" & varCopies _ , vbYesNo + vbInformation, "印刷の確認") = vbYes Then DoCmd.OpenForm "伝票", acPreview, , , acFormReadOnly DoCmd.PrintOut acPrintAll, , , , CLng(varCopies) DoCmd.Close acForm, "伝票" End If End Sub

  • Access VBA のテキストボックスの記載について

    ACCESS VBA の記載方法について質問です。 テキストボックスの名前を Nenrei とします。ここには必ず数字を入力させたく、何も入れずにエンターキーを押した場合はエラー表示をさせたいと考えています。  If me.T1="" then msgbox "年齢が入力されていません。" End If としますが、空打ちしてもエラー表示が出てきません。 プロパティでT1の書式を数値に変えて、  If me.T1=0 then msgbox "年齢が入力されていません。" End If としても結果は同じです。 どうすればよいか、教えてください。

  • アクセスのVBAなんですけど

    アクセスのVBAでフォームからフォームへ値を渡すことはできますか?具体的にいうとあるフォームでコンボボックスから選択し、OKボタンで次のフォームを開くのですが、初めのコンボボックス(ちなみに5つ選択項目があります)で選んだ条件でフォームの表示内容を変更させようと思っています。 今のところ、選択した項目を一時的にテーブルに保存して、新しいフォームが開くときにテーブルから値を取得してやるのか・・・・と考えているのですが、まどろっこしいので・・・・・よろしくお願いします。

  • Accessの初心者です。

    Accessの初心者です。 Accessの初心者です。 VBAでExcel出力をする記述について、おわかりになる方、教えてください。 フォームで検索条件に指定して表示した結果を、Excel出力したいのですが、 フォーム上に出力した項目全てではなく、一部の項目だけExcel出力したいです。 以下のような検索フォームを作成しています。 検索して表示するまでのVBAはできています。 検索条件:非連結 フォーム:連結フォーム(Q_会員情報 というクエリと連結) たとえば、検索条件に『男性』を指定して検索すると、 フォームに『会員番号』『会員名』『性別』『誕生日』の情報が出力されるとします。 これをマクロの機能で、Excel出力をすると、 [Q_会員情報]の項目が全てExcelに出力されますが、 これを、『会員名』『誕生日』だけをExcel出力したいです。 この場合、どのようにVBAを記述したらよいでしょうか? 使用しているのは、Excel2007です。 おわかりになる方いらっしゃいましたら、お力添えください。 よろしくお願いします。

  • アクセスVBA If式

    早速ですが、質問させて頂きます。 ACCESS VBAで、各ボックスに入力された数字に対し、論理式が立てられており、全項目ボックスに入力をし『チェック』ボタンを押すと基準を超えるものに『再チェックが必要な項目があります』というメッセージを出した上に、それを赤で反転させる、というのを作成中です。 簡単な図で表すと []はボックスだと思ってください 高さ[   ]   横[    ]   縦[    ] 体積[   ]      [チェック]←ボタン 高さが20を超えた場合、要再チェック 横が10以下の場合、要再チェック 縦が5未満又は15を超える場合、要再チェック 体積 高さ*横*縦 が3000以下の場合、要再チェック Private Sub コマンド1_Click() ← チェックボタンをクリック '要チェックか調べます 要チェック = Y If 高さ >= 20 Then Y = Y + 1 End If   If 横 <= 10 Then Y = Y + 1 End If   If 縦 < 5 Then Y = Y + 1 End If If 縦 >= 15 Then Y = Y + 1 End If ~中略 If Y >= 1 Then Msg = MsgBox("要再チェック項目があります。 ", vbOKOnly + vbExclamation, "確認してください") End If If Y = 0 Then Msg = MsgBox("再チェックは必要ありません。 ", vbOKOnly + vbInformation, "確認してください") End If 体積に関しては、式マクロを組んでいます。 以上です。赤に反転させる方法は分かりませんでした・・・。 このように1つずつIf式でやるのは、あまり綺麗じゃないと思いますし、たったこれだけの簡単な式でも、うまく機能してくれません(涙) どうかお助けいただけませんでしょうか。よろしくお願いしたします。

  • 初心者です。エクセルVBAの質問なのですが・・・

    エクセルのVBAで 例えば・・・IF関数を使いたい時に Public Sub 練習() 年齢 = InputBox("あなたは何歳ですか。数字だけを入力して下さい。") If 年齢 < 20 Then MsgBox "未成年ですね" ElseIf 年齢 < 30 Then MsgBox "20代ですね。" Else MsgBox "その他の年代ですね" End If End Sub                            のようなものを作って、実行をしたときに、数字を入れてOKボタンではなく、ダイアログボックスのキャンセルや閉じるボタンを押したときに、「その他の年代ですね」が出てきますが、それを出てこないようにすることはできますか?(例えば、キャンセルボタンのような役割をさせるなど・・・)  結構難しいですかね? 教えて下さい。お願いします。

  • access2000 メッセージボックスについて

    access2000のvbaでつまづいています。 フォームを閉じるために設定したvbaです。 以下のように入力し、メッセージボックスで「いいえ」を選んだときは何もさせたくないのですが、「はい」でも「いいえ」でもフォームを閉じてしまいます。「いいえ」のときは何もさせないためにはどこを訂正すればよろしいでしょうか?ご教示ください。 Select Case KeyCode Case vbKeyF9 '閉じる response = MsgBox("フォームを閉じますか?", vbYesNo + vbQuestion + vbDefaultButton1, "メインフォーム") If response <> vbYes Then DoCmd.Close acForm, "メインフォーム", acSavePrompt Else End If .........(以下case構文がいくつか続きます)

  • Access VBA 削除

    またお世話になります。 Access2003を使用しています。 不要になったアカウントを削除できるようなものを作成したいのですがうまくいきません。 リストボックスに表示されたアカウントを選択し、 ボタンを押すとテーブルから削除できるというものを考えています。 テーブル名: tbl_ユーザー フィールド名: ユーザー名 パスワード アカウント フォーム名: frm_Account_Delete  リストボックス: UserList  コマンドボタン: Del いろいろ調べて自分なりに作ってみたのですがエラーが出てしまいました。 ―――以下VBAコード――― Dim db As Database Dim rs As DAO.Recordset Set db = CurrentDb() Set rs = db.OpenRecordset("tbl_ユーザー") If IsNull(UserList) Then MsgBox "削除するアカウントを選択してください" Else If MsgBox(UserList & "を削除しますか?", vbYesNo) = vbYes Then db.TableDefs.delete UserList     MsgBox "UserListを削除しました。" End If End If rs.Close db.Close Set db = Nothing ―――以上――― これだと”このコレクションには項目がありません”というエラーが出ます。 アドバイスをよろしくお願いします。

  • Access VBA での有効なパスチェック

    Access VBA での有効なパスチェック お世話になっております。 Access2002 VBAで、画面入力されたパスが有効なら、 そこにテーブルの内容をExcel出力する。といったことをしているのですが、 画面入力されたパスが、 たとえば「C:\\\\\\tmp\\\\\\\」などと入力された場合、 フォルダチェックに用いているDir関数ではOKなのですが、 Excel出力するDoCmd.TransferSpreadsheetでエラーとなってしまいます。 ここでのエラーが、実行時エラー:2220なので、例外処理で拾っているのですが、 フォルダチェックの段階で、はじくよい方法はあるでしょうか? 例文です> str_tmpPath = txt_Path.Value  'ここで「C:\\\\\\tmp\\\\\\\」と入力されたとする '有効なパスかチェックする If Dir(str_tmpPath, vbDirectory) = "" Then  '上記のパスで通ってしまう。戻り値は"."   MsgBox "入力しなおして"   End End If str_SavePath = str_tmpPath & "ファイル名" 'Excel出力 DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, テーブル名, str_SavePath, True  'ここで実行時エラー:2220が発生 以上、よろしくお願いいたします。