Accessお手本データベースのホームへ戻る

タブコントロールを使用して得意先を都道府県別にグループ化するお手本

 

4-3-1 得意先を都道府県別にグループ化するサンプルデータベース

 

このサンプルデータベースでは、得意先を都道府県別にグループ化してタブコントロールのページに表示します。全国のタブをクリックしたときは、全得意先が表示されます。図4-3-1のように特定の県名をクリックしたときは、その県の得意先のみ表示されます。得意先のレコードセレクタをクリックすると、得意先の詳細フォームが表示されます。

 

4-3-2 得意先リストのレコードセレタをクリックすると得意先の詳細フォームを表示

 

サンプルデータベース (CH4-3.mdb)では、以下に示すノウハウを習得することができます。

 

◆ タブコントロールのページを自動作成する方法

◆ タブコントロールの全てのページに同じコントロールを表示する方法

◆ タブをクリックしたときにタブの標題に表示されている県名でレコードを絞り込む方法

◆ 得意先の一覧リストからレコードセレクタをクリックしたとき、詳細フォームを表示する方法

 

データベース CH4-3.mdbは、Accessに添付されているサンプルデータベース Northwind.mdbを基に作成します。

 

● 得意先を都道府県別にグループ化して表示するには

 

1      Access を起動して作業フォルダに新規データベース CH4-3.mdb を作成します。


2      ファイルメニューから外部データの取り込みインポートをクリックします。インポートのダイアログが表示されたら、Access のサンプルデータベース Northwind.mdbを選択してインポートボタンをクリックします。

オブジェクトのインポートダイアログが表示されたら、テーブルタブをクリックして、都道府県得意先テーブルをクリックします。最後に、OKボタンをクリックしてインポートを完了させます。



4-3-3 Northwind.mdbから都道府県、得意先テーブルを取り込む


3      都道府県テーブルにIDを追加して、県名が北から順番に表示されるようにコード化します。今回のサンプルでは、都道府県のカナは使用しませんが、50音に並べ替えるときは、半角で入力した方が濁音も分離することができます。


4-3-4 都道府県テーブルにIDを追加して、北から順番に表示されるようにコード化する


4      データベースウィンドウからフォームをクリックして、新規作成のボタンをクリックします。フォームの新規作成ダイアログが表示されたら、デザインビューをクリックしてOKボタンをクリックします。基になるテーブル/クエリのコンボボックスは、選択する必要ありません。フォームのデザインが表示されたら、ツールボックスからタブコントロールのアイコンをクリックして、フォーム中央に貼り付けます。デフォルトでは、2ページのタブコントロールが作成されます。都道府県をグループ化するには、都道府県(47件)+全国(1件)の合計48個のページを作成します。ページを追加するには、タブコントロールをクリックして、マウスの右ボタンをクリックします。ショートカットメニューが表示されたら、ページの挿入をクリックします。この操作を48回繰り返すのは大変ですから、タブコントロールにページを追加するCreateTab_FS()関数を用意しましたのでご利用ください。尚、CreateTab_FS()関数の使い方は、後述するTipを参照してください。

タブコントロールのプロパティを表示させたら、コントロール名をtabGroupsに書き換えます。また、複数行タブプロパティを“はい”に設定して1行に8個のタブが表示されるようにサイズを調整します。CreateTab_FS()関数を使用してページを追加した場合、ページ数が3個以上のとき自動的に複数行タブのプロパティは“はい”に設定されます。



4-3-1 タブコントロールのプロパティ

コントロールの種類

プロパティ

タブコントロール
(48個のページ作成)

名前

tabGroups

複数行タブ

はい




4-3-5 タブコントロールに48個のページを作成して複数行のタブを“はい”に設定


5      フォームを“frm都道府県別得意先”の名称で保存します。

6      データベースウィンドウからクエリをクリックしたら、サブフォーム用のクエリ“qry得意先リスト”を作成して保存します。クエリのフィールドには、得意先名、担当者名、電話番号、都道府県、得意先コードを選択します。


4-3-6 サブフォーム用のクエリ作成


7      データベースウィンドウからフォームをクリックしたら、新規作成ボタンをクリックします。フォームの新規作成ダイアログからオートフォーム:表形式、クエリのコンボボックスから“qry得意先リスト”をクリックしてOKボタンをクリックします。フォーム上の都道府県と得意先コードは、フィルタ条件を設定するときのみ使用しますから削除します。サブフォームを作成したら“sfr得意先リスト”の名称で保存します。


4-3-7 得意先リストのサブフォームを作成

8      フォーム“frm都道府県別得意先”をデザインモードで開いたら、データベースウィンドウからサブフォーム“sfr得意先リスト”のアイコンをドラッグして、詳細セクションに貼り付けます。サブフォームを選択したら、タブコントロールの先頭ページ(ページ1)の上に移動します。ここで注意して頂きたいのは、サブフォームをタブコントロールのページに貼り付けないでください。サブフォームを、タブコントロールの先頭ページに配置すると、全てのページの同じ位置に表示されます。(サブフォームを、タブコントロールのページに貼り付けた場合そのページにしか表示されません。)サブフォームをタブコントロールの全てのページに表示する方法については、後述するTipを参照してください。サブフォームのプロパティを表示させたら、コントロール名をsubCustomersに書き換えます。


4-3-8 サブフォームを詳細セクションに貼り付けたらタブコントロールの先頭ページに移動する


9      メインフォームのフォームモジュールを表示させたら、CH4-3.mdbを開いて“frm都道府県別得意先”のフォームモジュールをコピーして貼り付けます。フォームモジュールのソースリストは、リスト4-3-1を参照してください。


10   frm都道府県別得意先”を開いたら、都道府県のタブをクリックして得意先が都道府県別に表示されるか確認します。正常に動作することを確認したら、フォームを保存してAccess を終了させます。


4-3-9 得意先を都道府県別にグループ化した例

 



Form_Load()イベントの処理について

このイベントは、フォームが開かれてレコードソースを開いた時に実行されます。このイベントでは、得意先テーブルに存在する都道府県名を抽出してタブコントロールのタブに、都道府県名を設定しています。先頭のタブには“全国”を設定して全ての得意先が表示されるようにしています。
  strSQL = "SELECT
得意先.都道府県" _

    & " FROM 得意先 LEFT JOIN 都道府県 ON 得意先.都道府県 = 都道府県.KEN" _

    & " GROUP BY 得意先.都道府県" _

    & " ORDER BY First(都道府県.ID);"

このSQLは、得意先テーブルの都道府県を抽出して、都道府県名が北から順番に表示されるように並べ替えています。




With .Item(0)…End Withでは、先頭ページのタブに“全国”を設定しています。

With .Item(0)

        .Caption = "全国"

        .Visible = True

      End With

 

For intI=0…. Nextでは、各ページのタブに北から順番に都道府県名を設定しています。また、可視プロパティを“はい”に設定しています。

 

For intI = 1 To .Count - 1

        If rs.EOF Then

          Exit For

        End If

        With .Item(intI)

          .Caption = rs!都道府県

          .Visible = True

        End With

        rs.MoveNext

    Next intI

 

Do While…Loopでは、残りのタブの可視プロパティを“いいえ”に設定して表示されないようにしています。

 

Do While intI < .Count

        .Item(intI).Visible = False

        intI = intI + 1

    Loop

 

With .Pages(0)….End Withでは、サブフォームのサイズをタブコントロールの先頭ページのサイズと同じ大きさになるようにサイズプロパティを書き換えています。これで、サブフォームが、タブコントロールのページと同サイズに拡大されます。

 

With .Pages(0)

      sfm.Top = .Top

      sfm.Height = .Height

      sfm.Left = .Left

      sfm.Width = .Width

    End With

 

最後に、サブフォームのフィルタ条件を“無し”に初期化してイベント処理を終了します。

 

With mfrm

      .Filter = ""

      .FilterOn = False

    End With

 

 

 

tabGroups_Change()イベントの処理について
このイベント処理は、タブコントロールのタブをクリックしたときに実行されます。全国のタブをクリックしたときは、フィルタ条件を“無し”に設定して全ての得意先を表示します。都道府県のタブをクリックしたときは、都道府県名をフィルタ条件に設定してその都道府県の得意先のみ表示されるようにします。例えば、“埼玉県”のタブをクリックしたときは、フィルタ条件として 都道府県=”埼玉県が設定されます。

 

 

With Me.tabGroups

    strValue = .Pages(.Value).Caption

    If strValue = "全国" Then

      strCriteria = ""

    Else

      strCriteria = "都道府県=" _

        & conQUOTE & strValue & conQUOTE

    End If

  End With

  With mfrm

    .Filter = strCriteria

    .FilterOn = True

  End With

 

 

リスト4-3-1 frm都道府県別得意先のフォームモジュール

Private mfrm As Form

 

Private Sub Form_Load()

 

  Dim rs As DAO.Recordset

  Dim strSQL As String

  Dim sfm As SubForm

  Dim intI As Integer

     

  Call SetAppTitle_FS("CH1-3 Customers by Ken (C) " _

& Year(Date) & " by Akio Kasai")

     

  Me.Painting = False

 

  strSQL = "SELECT 得意先.都道府県" _

    & " FROM 得意先 LEFT JOIN 都道府県 ON 得意先.都道府県 = 都道府県.KEN" _

    & " GROUP BY 得意先.都道府県" _

    & " ORDER BY First(都道府県.ID);"

   

  Set rs = CurrentDb.OpenRecordset(strSQL)

  Set sfm = Me.subCustomers

  Set mfrm = sfm.Form

  

  intI = 0

  With Me.tabGroups

    With .Pages

      '

      ' タブ(ページ1)の標題に"全国"をセットして

      ' 可視プロパティを"はい"に設定する

      '

      With .Item(0)

        .Caption = "全国"

        .Visible = True

      End With

      '

      ' タブ(ページ2~ページ48)の標題に県名をセットして

      ' 可視プロパティを"はい"に設定

      '

      For intI = 1 To .Count - 1

        If rs.EOF Then

          Exit For

        End If

        With .Item(intI)

          .Caption = rs!都道府県

          .Visible = True

        End With

        rs.MoveNext

      Next intI

      rs.Close

      '

      ' 残りのタブの可視プロパティを"いいえ"に設定して

      ' 非可視状態にする

      '

      Do While intI < .Count

        .Item(intI).Visible = False

        intI = intI + 1

      Loop

    End With

    '

    ' サブフォームのサイズをページ1のサイズと同サイズにする

    '

    With .Pages(0)

      sfm.Top = .Top

      sfm.Height = .Height

      sfm.Left = .Left

      sfm.Width = .Width

    End With

  End With

  '

  ' サブフォームのフィルタ条件を初期化する

  '

  With mfrm

    .Filter = ""

    .FilterOn = False

  End With

  Me.Painting = True

End Sub

 

Private Sub tabGroups_Change()

  Dim strCriteria As String

  Dim strValue As String

  Const conQUOTE = """"

 

  '

  ' タブの標題を元に絞り込む条件を設定する

  ' (全国のときは、絞込みを設定しない)

  '

  With Me.tabGroups

    strValue = .Pages(.Value).Caption

    If strValue = "全国" Then

      strCriteria = ""

    Else

      strCriteria = "都道府県=" _

        & conQUOTE & strValue & conQUOTE

    End If

  End With

  With mfrm

    .Filter = strCriteria

    .FilterOn = True

  End With

End Sub

 

 

 

Tip

タブコントロールにページを追加する関数CreateTab_FS()の使い方

 

フォームに配置されたタブコントロールにページを追加する関数を使用するには、以下の手順で行います。

 

1 フォームにタブコントールを配置します。

 

2 タブコントロールのプロパティを表示させて、コントロール名をtabMyTabに書き換えます。

 

3 フォームをfrmMyFormの名称で保存します。

 

4 フォームがデザインモードで開かれている状態で、VBE(Visual Basic Editor)を起動します。

 

5 イミディエトウィンドウから

Call CreateTab_FS(Forms("frmMyForm").tabMyTab,20)

のように入力して実行します。CreateTab_FS()関数の引数には、タブコントロール名と合計ページ数を指定します。この例では、タブコントロール tabMyTabに合計20個のページが追加されます。この関数は、合計ページ数が3個以上のとき、自動的に複数行タブとします。引数の合計ページ数が、タブコントロールのページ数より少ないとき余分なページは削除されます。

 

basCreateTabモジュールのCreateTab_FS()関数

Public Sub CreateTab_FS(ctl As TabControl, _

  ByVal intPages As Integer)

   

  Dim intI As Integer

 

  With ctl.Pages

    ' ページ数が1以下のときは終了

    If intPages < 1 Then

      Exit Sub

    Else

      ' 引数のページ数がタブのページ数を少ないときは

      ' 余分なページを削除する

      If intPages < .Count Then

        For intI = .Count - 1 To intPages Step -1

          .Remove intI

        Next intI

      Else

        ' 引数で指定したページ数になるまでページを追加する

        For intI = 1 To intPages - .Count

          .Add

        Next intI

      End If

      ' ページ数が3以上のとき複数行タブのプロパティをTrueに設定

      ctl.MultiRow = IIf(.Count > 3, True, False)

    End If

  End With

End Sub

 

 

 

 

Tip

タブコントロールの全てのページに同じコントロールを表示するには

 

フォーム(frm都道府県別得意先)のように、タブコントロールの全てのページにサブフォーム(frm得意先リスト)を同じ場所に表示させたい場合、タブコントロールの個々のページにサブフォームを貼り付ける必要はありません。以下に、サブフォームをタブコントロールの全てのページに表示させる手順を説明します。

 

 

1 メインフォーム(frm都道府県別得意先)をデザインモードで開きます。

 

2 データベースウィンドウからサブフォーム(sfr得意先リスト)のアイコンをドラッグしてメインフォームの詳細セクションに貼り付けます。

 

3 サブフォームを選択したら、タブコントロールの先頭ページ(ページ1)に移動します。タブコントロールのページ1をクリックした状態で、サブフォームを貼り付けると、ページ1にしか表示されませんので注意してください。

 

 


  サブフォームのレコードセレクタをクリックしたとき、得意先の詳細フォームを表示させるには

 

1 Accessを起動して CH4-3.mdbを開きます。

 

2 データベースウィンドウからフォームをクリックしたら、新規作成のボタンをクリックします。フォームの新規作成ダイアログが表示されたら、オートフォーム:単票形式をクリックします。基になるテーブル/クエリのコンボボックスから得意先テーブルをクリックしてOKボタンをクリックします。

 

4-3-10 オートフォームウィザードを使用してフォーム作成

 

3 フォームが表示されたら“frm得意先詳細”の名称で保存して閉じます。

 

4-3-11 フォームウィザードで作成した得意先詳細フォーム

 

4 サブフォーム“sfr得意先リスト”のフォームモジュールを表示させたら、CH4-3.mdbを開いて“sfr得意先リスト”のフォームモジュールをコピーして貼り付けます。フォームモジュールのソースリストは、リスト4-3-2を参照してください。

5 サブフォームを保存したら、メインフォーム“frm都道府県別得意先”を開いてサブフォームのレコードセレクタをクリックします。このとき、得意先の詳細フォームが表示されるか確認します。正常に動作することを確認したらフォームを保存して、Accessを終了させます。

 

 

Form_Click()イベントの処理について

このイベントは、サブフォーム(sfr得意先リスト)のレコードセレクタをクリックしたときに実行されます。このイベントでは、DoCmd.OpenFormで得意先詳細のフォームを開くときに引数にフィルタ条件を設定してレコードを絞り込んでいます。変数strCriteriaには、レコードセレクタをクリックしたときの得意先コードが設定されます。

 

リスト4-3-2 “sfr得意先リスト”のフォームモジュール

Private Sub Form_Click()

  Dim strCriteria As String

  strCriteria = "得意先コード=" & [得意先コード]

  DoCmd.OpenForm "frm得意先詳細", acNormal, , strCriteria, acFormEdit, acDialog

End Sub

 

ダウンロード (CH4-3.lzh)
Accessお手本データベースのホームへ戻る