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


オプショングループの利用 : アンケート管理ソフト



フォームの型作りは終わりましたか。今日は「オプショングループ」のVBAについてお話しましょう。

 オプショングループ

オプショングループとは、Accessの機能の1つで、コマンドボタンを1つのグループとしてそのグループの値をAccessに返すことができます。例えば、コマンドボタンを4個備えたオプショングループを想定します。この場合、最初のコマンドボタンの値を 1 とし、順に 4 まで設定します。

ユーザーが1番目のコマンドボタンをクリックすると 値 1 が返され、3番目のコマンドボタンをクリックすると値 3 が返される仕組みです。条件や設定値の選択に利用し、利用範囲が多いのが特徴です。複数の値が同時に返されることはありません。

「オプショングループ」の名前を「フレーム」と命名しました。この「フレーム」の更新後処理に下記のプロシージャを記述します。このプロシージャはデータを抽出する命令文です。

  1. 当日データ
  2. 今月のデータ
  3. 前月データ
  4. 全データ

この4種類を選択できるようにしていきます。

 オプショングループの働き

では最初に、フォームヘッターに配置している オプショングループ(名前はフレーム) の働きについてお話しましょう。このようなフォーム(データ表示を主に行う)でオプショングループを使う理由は データの抽出 のためです。

データベースはいろいろなデータが詰まってます。取り敢えずデータを格納しているだけですから、目的のデータを取り出すときにいろいろと 知恵を絞り、抽出加工を行います。この抽出加工の方法は、大別すると下記のような2種類程に分類できます。

  1. フォームのデータソースに組み込んでいるクエリに直接的な加工を行う方法。
  2. VBA等でデータを制御する方法。

A について、

  1. クエリフィールドの抽出条件に、数値等の固定した条件を記述する方法。
  2. クエリフィールドの抽出条件に、フォームのテキストボックス等からの数値等によって変化する変動する条件を記述する方法。

B の代表的な加工は、フィルターと呼ばれるデータ抽出の方法です。これは、変動する条件を記述する方法に分類できます。

 フィルターを使う必要性

では、何故このフィルターを使う必要があるのでしょうか。Aの1ではダメなのでしょうか。

  • 最大の理由は、クエリでの制御はフォーム全般を対象とするからです。そして、制御を解除することが困難で元の状態に戻しにくいことが挙げられます。
    フィルターですと、条件句を用いて制御を分岐させることまで可能です。このようなことで、今回はフィルターの使った方法を解説します。

オプショングループ(名前はフレーム)を利用するには、「更新後処理」イベントに下記のようなプロシージャを記述して下さい。

Private Sub フレーム_AfterUpdate()

    Dim strdate_1 As Date, strdate_21 As Date, strdate_22 As Date
    Dim strdate_31 As Date, strdate_32 As Date

    strdate_1 = Date '当日を表示します。
    '今月の1日を表示します。
    strdate_21 = DateSerial(Year(Date), Month(Date), 1)
    '今月の月末を表示します。
    strdate_22 = DateSerial(Year(Date), Month(Date) + 1, 1) - 1
    '前月の1日を表示します。
    strdate_31 = DateSerial(Year(Date), Month(Date) - 1, 1)
    '前月の月末を表示します。
    strdate_32 = DateSerial(Year(Date), Month(Date), 1) - 1

    Select Case Me.フレーム

        Case 1

            DoCmd.ApplyFilter , "記入日=" & "#" & _
				Format(strdate_1, "yyyy/mm/dd") & "#"
        Case 2

            DoCmd.ApplyFilter , "記入日 between " & "#" & _
				Format(strdate_21, "yyyy/mm/dd") & _
                                "#" & " And " & "#" & _
				Format(strdate_22, "yyyy/mm/dd") & "#"
        Case 3

            DoCmd.ApplyFilter , "記入日 between " & "#" & _
				Format(strdate_31, "yyyy/mm/dd") & _
                                "#" & " And " & "#" & _
				Format(strdate_32, "yyyy/mm/dd") & "#"
        Case 4

            DoCmd.ShowAllRecords

    End Select

    DoCmd.Requery

End Sub
 Dimステートメント

変数の宣言は、Dimステートメントを使用します。形式は、下記のように記述します。

Dim 変数名 As 変数のデータ型

Dim strdate_1 , strdate_22 , …, strdate_32 As Date

と、最後だけ定義されているプロシージャを見ることがありますが、このように記述すると Date型と定義されるのは最後の strdate_32 だけであとは全て Variant型 となってしまいます。省略はできないので一つ一つ定義しましょう。

月初、月末日付の求め方

月初の表示は簡単なんですが、月末の表示はちょっと工夫が要ります。つまり、31日の月もあれば28日の月もありますので、発想を変えて求めたい月の翌月の1日から、1日を差し引くという考え方です。 例えば、2月の月末は、3月1日から1日を差し引けば求められます。

下記の使用方法は、Date関数を用いて月初、月末の日付を求めています。

  1. strdate_1 = Date
  2. strdate_21 = DateSerial(Year(Date), Month(Date), 1)
  3. strdate_22 = DateSerial(Year(Date), Month(Date) + 1, 1) - 1
ApplyFilterメソッド

ApplyFilterを使っている時に全データを表示させたい場合は、全レコードの表示つまり、

DoCmd.ShowAllRecords

と記述します。このようにするとフィルターの適用効果がなくなります。

 ネットワーク

次は、ネットワークで繋がっている場合を想定して、この閲覧画面を表示させておけば最新データが次々と自動的に表示される機能を付加するプロシージャをご紹介しましょう。この考え方は、他のシステム作りに応用ができますので、覚えていて下さい。

フォームの「タイマ時」イベントに下記のようなVBAを記述します。「タイマ間隔」プロパティは 5000 として下さい。つまり、5秒に一回の割合ですね。このプロパティの単位は、1/1000秒です。

Private Sub Form_Timer()

    'このフォームを閲覧している時にデータの追加が行われたか否かを判断し、
    'フォームを再描写します。
    Dim strcount As Long
    strcount = DCount("ID", "tbl_question")

    If strcount > Me.個数 Then
        Beep  '警告音を鳴らします。
        DoCmd.Requery
        Me.個数 = strcount

    Else
        Exit Sub

    End If

End Sub

前回のフォームを「開く時」のイベントで、DCount関数を使って「個数」というテキストボックスに「tbl_question」の「ID」の個数を代入していますよね。覚えてますか?

 隠しテキストボックス

今回はそれを利用します。あ、あのテキストボックスは 隠しテキストボックス として下さいね。フォームプロパティの可視を いいえ に変更します。いいですか?

上記プロシージャの解説は下記のとおりです。

  1. strcount を長整数型の変数として定義(Dim strcount As Long)します。
  2. strcount に DCount("ID","tbl_question") の値を代入します。
  3. IF関数で比較(strcount > Me.個数)を行います。
  4. つまりフォームが開いた時の「ID」の個数と5秒間間隔で更新される strcount の値との比較を行います。
  5. strcount の値が大きい、つまり新しいデータが追加されている場合は、Beep以下に進みます。
  6. データ(画面)を再描写し、隠しテキストボックス「個数」に strcount の値を代入し、終了します。

この処理を 5秒間隔で行えば、常に最新データが表示される訳です。原理は簡単でしょう。

ユーザーからの指摘

読者の方から、日付が狂ってしまう、また2001年問題の可能性もありとのご指摘を頂きました。

AkiraのPCでは全然問題がないのですが、他のPCでは日付がくるってしまう現象が発生しております。よって、富士さんより提案を頂いた Format関数の利用 を取り入れました。サイトの記述とサンプルファイルは、本日修正致しましたのでご報告いたします。 2001/04/06

 

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

 


オプショングループの利用 : アンケート管理ソフト


 

-Microsoft Access Club-