Microsoft Access Club >初心者講座 >アンケート管理ソフト >このページ >次頁 - 前項  サイト内検索


Accessの入力フォームのVBAについて_3 : アンケート管理ソフト



今回は、VBAの内でも頻繁に現れる条件分岐構文についてをお話しましょう。代表的な IfSelect を取り上げます。これができなきゃ、VBAの取得は無理です。心して、かかりましょう(笑い)。

 条件分岐構文-If と Select

Private Sub 保存コマンド_Click()

    Dim strmsg As String
    Dim strmsg_2 As String
    Dim strmsg_3 As String
    Dim intno As Variant
    
    strmsg = "お答えいただいた内容を保存します。よろしいですか?"
    strmsg_2 = "お答えいただいていないので、キャンセルとして処理します。"
    strmsg_3 = "お答えが未入力の質問覧がありますので、再度トライ願います。"

    intno = Me.ID

    If Not IsNull(Me.ID) Then
    
        If Not IsNull(Me.性別) And Not IsNull(Me.年齢) And _
            Not IsNull(Me.question_1) And Not IsNull(Me.question_2) And _
            Not IsNull(Me.question_3) And Not IsNull(Me.question_4) And _
            Not IsNull(Me.question_5) Then

            Select Case MsgBox(strmsg, 17, "Akira")

                Case 1
                    '警告メッセージをオフにします。
                    DoCmd.SetWarnings False
                    DoCmd.ApplyFilter , "ID=" & intno
                    DoCmd.OpenQuery "qry_temp_追加", acViewNormal, acReadOnly
                    DoCmd.OpenQuery "qry_temp_削除", acViewNormal, acReadOnly
                    DoCmd.Close acForm, "frm_質問", acSaveNo
                    '警告メッセージをオンに戻します。
                    DoCmd.SetWarnings True

                Case Else
                    End

                End Select

        Else

            MsgBox strmsg_3, 16, "Akira"
            End
 
        End If

    Else

        MsgBox strmsg_2, 16, "Akira"
        DoCmd.Close acForm, "frm_質問", acSaveNo
        DoCmd.OpenForm "frm_main"

    End If

End Sub
解説

条件分岐とは、「AならばB、CならばD」という具合に種々の条件が絡み合って、その条件にしたがって処理をすすめることができる構文を云います。

 IF構文について

Ifの基本構文は、下記のようなものです。

Function SamplePro()

    If ◎◎◎ Then
        □□□
    Else
        △△△
    End If

End Function

この構文は、「もし、◎◎◎であれば□□□の処理を行う。◎◎◎でないなら△△△の処理を行う」の意味です。サンプルは、このIFの構文を続けて利用しています。下記構文です。

        If Not IsNull(Me.性別) And Not IsNull(Me.年齢) And _
            Not IsNull(Me.question_1) And Not IsNull(Me.question_2) And _
            Not IsNull(Me.question_3) And Not IsNull(Me.question_4) And _
            Not IsNull(Me.question_5) Then

複雑そうに見えますが、何のことはありません。同じことを And で繋ぎ繰り返し処理しているだけです。

 Not IsNull() 関数 と IsNull() 関数

Not IsNull(Me.性別)で使用している Not IsNull() 関数は、IsNull() 関数の変形です。これは、テキストボックス名「性別」が Null (空白) であるか否かをチェックし、真なら Falseを 偽なら True を返します。# IsNull() 関数の場合は逆で、真なら Trueを 偽なら False を返します。

これらを用いるのは、回答者(お客)が全ての質問に答えずに、終了しようとする場合を想定しています。5個の質問の内、1個でも未回答( Null )であれば、If 以下の処理に進みます。

更にここにも If 処理が待ち受けています。

前回でもお話しましたように、Me.ID が Null である場合はデータが全て未入力の状態ですので、If Not IsNull(Me.ID) Then 以下で、その場合の処理を記述します。つまり、入力を止めるのかそれとも続けるのかを回答者(お客)に問い合わせしてみようと考えています。

 IIF 関数

Ifの親戚に IIF 関数 があります。これは主にマクロで使用されるんですが、マクロをVBAに変換した場合など、VBAに残っちゃう場合があります。ちょっくら、このIIF関数は処理が遅めです。

また、If ◎◎◎ Then 〜 Else の構文にElseではなく、ElseIf を下記のように用いる場合もあります。

Function SamplePro()

    If ◎◎◎ Then
        □□□
    ElseIf ○○○ Then
        △△△
    Else
        ×××
    End If

End Function

この構文は、「もし、◎◎◎であれば□□□の処理を行う。また、もし○○○であれば△△△の処理を行う。どちらでもないなら×××の処理を行う。」の意味です。

 Select Case構文について

Select Caseの基本構文は、下記のようなものです。

Function SamplePro()

    Select Case ◎◎◎
    
        Case □□□
            △△△
        Case ■■■
            ▲▲▲
        Else
            ※※※
            
    End Select

End Function

上記構文は、「◎◎◎を評価し、□□□の場合は△△△処理を、■■■の場合は▲▲▲処理を行い、これら以外の場合は※※※処理を行う」の意味です。サンプルは、下記のような組み方をしています。

            Select Case MsgBox(strmsg, 17, "Akira") ' --- A

            Case 1

                '警告メッセージをオフにします。
                DoCmd.SetWarnings False ' --- B
            
                DoCmd.ApplyFilter , "ID=" & strno ' --- C
                DoCmd.OpenQuery "qry_temp_追加", acViewNormal, acReadOnly ' --- C
                DoCmd.OpenQuery "qry_temp_削除", acViewNormal, acReadOnly ' --- C
                DoCmd.Close acForm, "frm_質問", acSaveNo
            
                '警告メッセージをオンに戻します。
                DoCmd.SetWarnings True

            Case Else

                End 'VBAを終了します。

            End Select
解説
Select Case の構文

この構文は、Case Elseを置いて締めくくった方がベターです。
Case Elseは「その他の場合」ということですから、上記のサンプルで云うと Case 2でもいい訳です。なぜなら、戻り値は、1 か 2 に決まっている訳ですからね。
しかし、何があるか判らないのがプロシージャの世界ですから、「逃げる場所」を用意しておく習慣を身に付けて下さい。

  1. 戻り値「はい」の場合は 1 、「いいえ」の場合は 2 を返します。
  2. は定型文です。このまま暗記されてもいいでしょうね。
    サンプルの例でいいますと、クエリ処理に対して警告メッセージが表示されますので、これを 避ける意味からこのメッセージを非表示にする構文です。
    DoCmd.SetWarnings True (表示)とセットで使用します。
  3. は、フィルターを実行します。strnoは現在表示されているレコードの「ID」と定義しています(strno = Me.ID)。これは、LAN対応で複数のパソコン上でこの入力フォームが開かれている場合を想定しています。つまり、今自分が開いているレコードだけ抽出するということです。
  4. これらはクエリを実行するプロシージャです。マクロで云う「クエリを開く」にあたります。この追加クエリと削除クエリについては、後日別ページでお話する予定です。
  • End の使い方ですが、ここでは Exit Sub との使い方について簡単にお話します。
    共に"終わる"意味ですが、Exit Sub は該当プロシージャのプロセスが終わる ことであり、End はプロシージャの今後の進行を完全に取り止める ことです。

 

ページの先頭へ 前ページへ戻る

 


Accessの入力フォームのVBAについて_3 : アンケート管理ソフト


 

-Microsoft Access Club-