16.一覧の表示
 今回のサンプルアプリの最後の機能。一覧表です。あまり使わないかも知れませんが、せっかくだからやっちゃいます。

 一覧表と言っても、ボタンを押したときに全てのデータがずら〜〜〜っと表示されるだけでは芸が無いので、データの抽出機能なんかを付けてみます。とりあえずは、性別と関係の2つでデータを絞れればいいでしょう。

 それと、ここも「抹消処理」の所と同じように、あまり細かいことは書いてません。既に、同じ事を何度もやっているので「あー、あれを使えばいいんだな…」と想像が付くでしょう。まぁ、仕上げみたいなもんです。ここまでやってきたことを思い出して応用して、自分の力で作ってみてくださいな。

 というわけで、以下の説明は新たな技ワンポイント的な部分となっています(汗)
フォーム「一覧表示オプション」の作成
 このフォームでは、次のオブジェクトを配置します。
 配置例はここを見てください

コントロールの種類
コントロールの名称
表題
機能、用途
コマンドボタン
一覧表示
一覧表示
一覧表の表示を行う
コマンドボタン
もどる
もどる
フォームを閉じる
コンボボックス
性別

性別の選択
コンボボックス
関係

関係の選択
チェックボックス
性別選択

抽出に性別を使用
チェックボックス
関係選択

抽出に関係を使用

 コンボボックス、チェックボックス共にラベルが付いてきますが、今回もコンボボックスのラベルを使用するようにします。チェックボックスのラベルは削除してかまいません。

 チェックボックスは、抽出オプション(性別、関係)の指定に使用し、チェックボックスがオンになっているとき、対応する抽出オプションが有効になるようにします。デフォルトでは、両オプションともにオフにしておきます。
 また、チェックボックスがオンになっているときのみ、コンボボックスの指定ができるようにしておくと分かりやすいでしょう。

 コンボボックスの設定については、あえて触れませんでした。既に体験済みなので、出来ますよねー!名称を表示し、キー値を取り出すようなコンボボックスに設定してみてください。ヒントは「値集合タイプ」、「値集合ソース」、「列数」、「連結列」、「列幅」です。
フォーム「一覧表」の作成
 このフォームのみ、今まで作ったフォームとは少しことなります。
 今までのフォームは全て、レコードセレクタ、移動ボタン、スクロールバー、区切り線を使わない(表示させない)ようにしましたが、一覧表フォームでは、これらすべてを使用します
 また、このフォームのみクエリーと連結させて表示します。連結させるとレコードの削除・追加・変更等が行えるようになるので、一応これらも出来ないようにしておきます。(表示のみというのが前提なので)

 あと、一覧形式でフォームを表示させるための設定も行います。これを忘れると絶対に一覧表になりません。
 以下が、その設定(プロパティ)です。

 レコードソース:汎用クエリー
 既定のビュー :帳票フォーム
 更新の許可  :いいえ
 削除の許可  :いいえ
 追加の許可  :いいえ

 フォームの設定でもう一つありました! 一覧表なんかを作るときは「見出し」があった方が断然見やすいでしょう。見出しはフォームヘッダーを利用して作ります。
 フォームヘッダーを使うには、[表示]→[フォームヘッダー/フッター]を選択すればOKです。フォームフッターは使うか使わないか・・・・使います。
 ここには、一覧フォームを閉じるためのボタンを配置しておきましょう。

 フォームの基本的な設定が終わったら、あとは一覧へ表示させたいフィールドを表示するためのテキストボックス等の配置ですが、これはお好みでどうぞ!
 このとき、コントロールソース(プロパティ)は対応するフィールド名を設定します。(漢字氏名のテキストボックスなら、漢字氏名を選択)

 サンプルアプリでは、こんな感じで作ってみました。
フォーム「一覧表示オプション」の初期設定処理
 主に、チェックボックスについての初期設定を説明します。
 チェックボックスはデフォルトではオフにするようにします。しかし、そのままでは、チェックボックスはオフの状態になりません。何もしないでフォームビューに切り換えるとのようになると思います。
 これを正しくと表示するようにしてあげましょう。
 フォームのイベント「開く時」に、次の記述(太字部分)をすればで表示されます。

Private Sub Form_Open(Cancel As Integer)

  '記述場所:フォーム「一覧表示オプション」
  '記述箇所:イベント「開く時」

  DoCmd.Maximize

  性別選択.Value = False
  関係選択.Value = False
  性別.Enabled = False
  関係.Enabled = False
  性別 = 0
  関係 = 0

End Sub

※性別と関係に0を設定しているのは、単なる初期値です。
 
 チェックボックスの状態はValueというメソッドで取得・設定を行えます。
 さらに、オン・オフの各状態はTrueFalseで、それぞれ次の通りに対応しています。
  / True
  / False
フォーム「一覧表示オプション」のコンボボックス設定処理
 性別・関係の各コンボボックスは、対応するチェックボックスがオンのときのみ選択できるようにするとカッコいい(笑)。
 デフォルトではチェックボックスはオフなので、コンボボックスは使えない様にしなくてはなりません。これは、プロパティの使用可能いいえにすることで簡単に行えます。

 次に、チェックボックスがオンになったときにコンボボックスが使えるように手を加えます。
 これにもイベントを使用します。イベントは、チェックボックスのイベントクリック時」です。クリックされたとき(チェックのオン、オフが変わったとき)にチェックボックスの状態を参照し、コンボボックスの使用可・不可の設定をします。
 以下は、チェックボックス性別選択の例です。

Private Sub 性別選択_Click()

  '記述場所:フォーム「一覧表示オプション」
  '記述箇所:「性別選択」チェックボックスのイベント「クリック時」

  If 性別選択.Value = True Then
    性別.Enabled = True
    性別.SetFocus
  Else
    性別.Enabled = False
  End If

End Sub

 SetFocusは、指定したオブジェクトへフォーカスを移動するという意味です。コンボボックスやテキストボックスなどでこれを行うと、カーソルはどこへ居ようと無理やり指定したコントロールへ超特急(?)で飛んできます。便利でしょ?
 プロパティの設定では使用可能プロパティを使いましたが、VBAでこれを設定するときはEnabledを使います。TrueはいFlaseいいえと対応しています。

 もう一つのチェックボックス関係選択は、この例を参考にしながら自分なりに作ってみてください。簡単だから、すぐできますよっ!
フォーム「一覧表示オプション」のボタン「一覧表示」
 オプション指定フォームでは、一覧表示ボタンが押されたときに、指定されたオプションに基づいてクエリーを創成し一覧表を表示する処理を行います。ただし、指定されたオプションで必ず抽出できるというわけではないので、抽出できない場合にはエラーメッセージを表示します。

 クエリー創成は、抽出条件の部分(WHERE)が可変なので、画面上のオプションをクエリー創成処理(一覧表クエリー創成)へ引き渡して使うという流れにします。
 また、抽出条件の作成には文字列をゴソゴソとやるのですが・・・これについては詳しい説明は省略します(汗)。以下の処理例を参考にしてください。

Private Sub 一覧表示_Click()

  '記述場所:フォーム「一覧表示オプション」
  '記述箇所:「一覧表示」チェックボックスのイベント「クリック時」

  Dim 抽出条件 As String

  抽出条件 = ""

  If 性別選択.Value = True Then
    抽出条件 = 抽出条件 & "性別 = " & 性別 & " and "
  End If

  If 関係選択.Value = True Then
    抽出条件 = 抽出条件 & "関係 = " & 関係 & " and "
  End If

  If Len(抽出条件) > 0 Then
    抽出条件 = Left(抽出条件, Len(抽出条件) - 5)
  End If

  If DCount("レコードキー", "住所録テーブル", 抽出条件) = 0 Then
    MsgBox ("指定された条件のデータはありません。")
  Else

    If Len(抽出条件) > 0 Then
      抽出条件 = "WHERE " & 抽出条件
    End If

    Call 一覧表示クエリー創成(抽出条件)
    DoCmd.OpenForm "一覧表"

  End If

End Sub

 以上が、一覧表示ボタンのクリックイベントです。要点のみ簡単に説明します。

 MsgBox(...)

 カッコ内の文字列等を、ダイアログボックスで表示します。


 Len(...)

 文字列の長さを求めます


 DCount(a,b,c)

 指定した条件のレコードが何件あるか求める関数です。フィールド名等、テーブル名(もしくはクエリー)、抽出条件の順に記述します。抽出条件は、SQLWHERE以降の部分と同じ。
 この例では、創成した抽出条件で実際にレコードが抜けるかを調べるのに使用。
 ただし、「a」の所には意味もなくレコードキーを指定した(笑)。っていうか、この部分は、ここでは関係ないので・・・・。


 Left(a,b)

 文字列を、左から指定された分だけ取得する関数。aに文字列、bに取得したい文字数を書く。
 この例では、不要な" AND "("〜"の中が5文字あるでしょ?)を取り除くのに使った。ハッキリ言って、かなり強引な方法なので見習わない方がよいです(汗)
プロシジャ「一覧表示クエリー創成」の作成
 以下は、一覧表示クエリー創成処理です。モジュールへ作成します。既に同じような処理を作っているので、説明が無くても大丈夫でしょう。

Sub 一覧表示クエリー創成(抽出条件 As String)

  '記述場所:モジュール「AddressBookModule」

  On Error GoTo エラー処理

  Call テーブルオープン

  Dim tq As QueryDef

  Set tq = db.CreateQueryDef("汎用クエリー", _
       "SELECT レコードキー,漢字氏名,カナ氏名," & _
           "性別,関係,生年月日," & _
           "郵便番号,住所,加入電話番号," & _
           "FAX番号,携帯等電話番号,メールアドレス," & _
           "備考,ステータス " & _
           "FROM 住所録テーブル " & _
           抽出条件 & ";")

  Call テーブルクローズ

  Exit Sub

エラー処理:

  '2004/02/20:既存クエリーの削除手順を変更
  'db.QueryDefs.Delete "汎用クエリー"
  If Err.Number = 3012 Then 'クエリーが存在している場合
    db.QueryDefs.Delete "汎用クエリー"
  Else
    'それ以外のエラーは、内容を表示し強制終了
    Debug.Print Err.Number
    Debug.Print Err.Description
    MsgBox "クエリー創成処理でエラーが発生しました" & vbCrLf & _
       "エラー番号 : " & Err.Number & vbCrLf & _
       "エラー詳細 : " & Err.Description
    End '強制終了
  End If

  Resume

End Sub
一覧表は表示されましたか?
 またまた、確認の時間です!(笑)
 フォーム「一覧表示オプション」を開き、一覧表示ボタンをクリック!見事に、一覧表が出ましたか?条件を絞ってみたり、いろいろテストしてみるとよいですよ。ちなみに、サンプルアプリでは一覧をこのように表示しました。
Copyright(C) 1999-2006 結城圭介。 All rights reserved