次の方法で共有

Access 複数条件のIFの使い方について

Anonymous
2012-02-08T09:23:59+00:00

いつもお世話になっております。

IFの使い方にまだ慣れておらず、行き詰ってしまったので

ご質問させて下さい。

フォームにチェックボックスが4つ配置してあります(全て連結)

チェックボックス名

①「1期」

②「2期」

③「3期」

④「会社名1」

もし「1期」「2期」「3期」のどれか、または複数にチェックが入っていた場合で

「会社名1」にチェックが入っていない場合には

「会社名1」にチェックを入れるようにメッセージを表示。

「1期」「2期」「3期」のどれにもチェックが入っていない場合には

プロシージャの終了

と想定して

Private Sub Form_BeforeUpdate(Cancel As Integer)

  Me.会社名1.SetFocus

    If Me.[1期 Or [2期] Or [3期].Value = True And Me.会社名1.Value = False Then

        MsgBox "会社情報と一致していません。会社名1を選択して下さい"

        DoCmd.GoToControl "会社名1"

        Cancel = True

    Else

        Exit Sub

    End If

End Sub

色々と悩み上記のプロシージャにしてみたのですが

「1期」にチェックが入っていて「会社名1」がFalseの場合

"会社情報と一致していません。会社名1を選択して下さい"とメッセージが表示され

「会社名1」にチェックを入れても、メッセージが表示されてしまいます。

どのように修正したらよろしいでしょうか?

ご教示頂けたらと思います。

よろしくお願い致します。

Microsoft 365 と Office | アクセス | 家庭向け | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2012-02-08T15:40:58+00:00

こんばんは、MukkuMukuです。

チラシの裏にでもメモしながらゆっくり考えたらいいですよ。

四則演算と同じように比較演算子にも優先順位があるから カッコを使わないとです。

例えば、

([1期] Or [2期] Or [3期]) And [会社名1] とした場合、

1~3期の一つ以上がTrue、かつ、会社名1がTrueの時だけ、結果はTrue。

カッコで比較演算を整理しきれない条件の時は、IF文をネストすることになろうかと。

この回答は役に立ちましたか?

100+ 人がこの回答が役に立ったと思いました。
0 件のコメント コメントはありません

3 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2012-02-14T05:55:27+00:00

    ミルキーMSター 様

    お世話になります。

    ご回答どうもありがとうございます。

    >文のIF文で記述してもいいかもしれませんが、後から見たり他の方がご覧なった時にも

    >分かるように、IFの入れ子(IFの中にIF)とかの記述の方が分かりやすく理解できるかも

    >しれません。

    確かに、あれこれ考えるより、1つづつやった方が

    わかりやすいですね。

        Me.会社名1.SetFocus

        If Me.会社名1.Value = False Then

        If Me.[1期] Or [2期] Or [3期].Value = True Then

            DoCmd.GoToControl "会社名1"

            Cancel = True

            MsgBox "会社情報と一致していません。会社名1を選択して下さい"

        End If

           Else

            Exit Sub

        End If

    で、動作できました。色々と勉強になります。

    どうもありがとうございました。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Anonymous
    2012-02-13T13:01:31+00:00

    MukkuMuku 様

    こんばんわ、いつもお世話になっております。

    ご回答どうもありがとうございます。

    >チラシの裏にでもメモしながらゆっくり考えたらいいですよ。

    そうなんですよね。頭の中が、ごちゃごちゃになってきてしまい。。。

    色々と試した結果、下記のモジュールになりました。

        Me.会社名1.SetFocus

        If (Me.[1期].Value Or Me.[2期].Value Or Me.[3期].Value) = True And Me.会社名1.Value = False Then

            MsgBox "会社情報と一致していません。会社名1を選択して下さい"

            DoCmd.GoToControl "会社名1"

            Cancel = True

        Else

            Exit Sub

        End If

    で、動作しました!

    If (Me.[1期].Value Or Me.[2期].Value Or Me.[3期].Value) = True And Me.会社名1.Value = False Then

    の部分は、もっと簡略化できそうですが、コンパイルエラーが多発して、このようになりました。

    >四則演算と同じように比較演算子にも優先順位があるから カッコを使わないとです。

    なるほどですね!数学が弱くて。。。どうもありがとうございます!

    「優先順位」これから意識します。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  3. Anonymous
    2012-02-09T05:48:11+00:00

    1文のIF文で記述してもいいかもしれませんが、後から見たり他の方がご覧なった時にも

    分かるように、IFの入れ子(IFの中にIF)とかの記述の方が分かりやすく理解できるかも

    しれません。

     今回の例ですと、まずは「会社名1」のチェックの状態からIFチェックした方が

    分かりやすいかもしれませんね。

     If Me.会社名1.Value = False Then

      If Me.[1期 Or [2期] Or [3期].Value = True Then

       メッセージ表示

      End If

     'Else

     '会社名1チェックが付いている時は何もチェックしなくてもよい?

     End If

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません