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

図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 タブコントロールのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
|
タブコントロール |
名前 |
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()関数
|
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 |