ActiveXコントロールのTreeViewとListViewを使用して、得意先テーブルを都道府県別に階層化して表示する方法を解説します。
注)ここで紹介するActiveXコントロールを使用するには、Visual
Basic 6.0をインストールする必要があります。
- Access 2000を起動して Nothwind.mdb
を開きます。
- データベースウインドウのフォームタブをクリックしたら新規作成のボタンをクリックして、デザインビューを表示させます。
- ツールボックスからコントロールの選択アイコン
をクリックします。ActiveXコントロールの一覧から、Microsoft
TreeView Control, version 6.0をクリックしてフォームの左側に貼り付けます。同様の手順でMicrosoft
ListView Control, version 6.0をクリックしてフォームの右側に貼り付けます。

 |
| 図1-ActiveXコントロールの一覧リスト |
ActiveXコントロールを貼り付けたら、コントロール名をobjTreeViewとobjListViewの名前に書き換えます。
 |
| 図2-フォームの左側にTreeView、右側にListViewを貼り付けた例 |
- TreeViewコントロールをダブルクリックしてプロパティを表示させます。全般タブをクリックしたら、スタイルを
6 - tvwTreelinesPlusMinusText に設定します。線のスタイルを
1- tvwRootLines に設定します。最後にインデント幅を250に設定したらOKボタンをクリックしてプロパティを閉じます。
 |
| 図3-TreeViewのプロパティを表示させて値を再設定する |
- ListViewコントロールをダブルクリックして、プロパティを表示させます。ListViewのプロパティは、デフォルト値を使用しますので図4のようになっているか確認してOKボタンをクリックします。
 |
| 図4-ListViewのプロパティ |
- フォームのプロパティを表示させて、読み込み時のイベントにリスト1のForm_Loadのイベント処理をコピー&ペーストします。以下同様の手順で、フォームのイベント処理、TreeViewのイベント処理そしてListViewのイベント処理をコピー&ペーストします。最後にモジュールレベルのメモリ変数とサブルーチンをコピー&ペーストします。
注)TreeViewとListViewコントロールのイベント登録は、VBE(Visual Basic Editor)を起動して、イベントのコンボボックスから選択します。
| リスト1-フォームの各種イベント処理とサブルーチン |
Option Compare Database
Option Explicit
Private mcnn As ADODB.Connection
Private mrsCustomer As ADODB.Recordset
Private mrsKen As ADODB.Recordset
Private mobjListItems As ListItems
' *******************
Private Sub Form_Load()
Call OpenDatabaseConnection
Call OpenCustomerRecordset
Call OpenKenRecordset
Call LoadListViewHeaders
Call LoadListViewData
Call LoadTreeView
End Sub
' *************************************
Private Sub Form_Unload(Cancel As Integer)
Set mrsCustomer = Nothing
Set mrsKen = Nothing
End Sub
' ************************************************
Private Sub objTreeView_Collapse(ByVal Node As Object)
Call objTreeView_NodeClick(Node)
End Sub
' ***********************************************
Private Sub objTreeView_Expand(ByVal Node As Object)
Call objTreeView_NodeClick(Node)
End Sub
' *************************
Private Sub objListView_Click()
objListView.SetFocus
End Sub
' **********************************************************
Private Sub objListView_ColumnClick(ByVal ColumnHeader As Object)
Dim intCol As Integer
intCol = ColumnHeader.Index - 1
With objListView
If (.SortKey = intCol) Then
If .SortOrder = lvwAscending Then
.SortOrder = lvwDescending
Else
.SortOrder = lvwAscending
End If
Else
.SortKey = intCol
.SortOrder = lvwAscending
End If
.Sorted = True
.SelectedItem.EnsureVisible
End With
End Sub
' ********************************
Private Sub OpenDatabaseConnection()
Set mcnn = New ADODB.Connection
mcnn.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=" & CurrentProject.Connection
mcnn.Open
End Sub
' ********************************
Private Sub OpenCustomerRecordset()
Dim strSQL As String
strSQL = "SELECT 得意先.得意先コード, 得意先.得意先名, 得意先.担当者名," _
& " 得意先.都道府県, 得意先.電話番号, 得意先.ファクシミリ" _
& " FROM 得意先;"
Set mrsCustomer = New ADODB.Recordset
mrsCustomer.Open strSQL, mcnn, adOpenStatic, adLockOptimistic
End Sub
' ***************************
Private Sub OpenKenRecordset()
Dim strSQL As String
strSQL = "SELECT 得意先.都道府県" _
& " FROM 得意先" _
& " GROUP BY 得意先.都道府県;"
Set mrsKen = New ADODB.Recordset
mrsKen.Open strSQL, mcnn, adOpenKeyset, adLockOptimistic
End Sub
' *****************************
Private Sub LoadListViewHeaders()
Dim objListItem As ListItem
Set mobjListItems = Me.objListView.ListItems
With Me.objListView
.View = lvwReport
With .ColumnHeaders
.Add , , "得意先名", 2880
.Add , , "担当者名", 1440
.Add , , "Tel", 1350
.Add , , "Fax", 1350
End With
End With
End Sub
' **************************
Private Sub LoadListViewData()
Dim objListItem As ListItem
mobjListItems.Clear
With mrsCustomer
If .EOF Or .BOF Then
Exit Sub
End If
.MoveFirst
Do Until .EOF
Set objListItem = mobjListItems.Add(, Left(!得意先名, 4), !得意先名)
With objListItem
.SubItems(1) = Nz(mrsCustomer!担当者名, "無")
.SubItems(2) = Nz(mrsCustomer!電話番号, "無")
.SubItems(3) = Nz(mrsCustomer!ファクシミリ, "無")
End With
.MoveNext
Loop
End With
End Sub
' *************************************************
Private Sub objTreeView_NodeClick(ByVal Node As Object)
Dim strSQL As String
mrsCustomer.Close
If Node = "全国" Then
strSQL = "SELECT * FROM 得意先;"
Else
strSQL = "SELECT * FROM 得意先 WHERE 都道府県 = '" & Node & "';"
End If
mrsCustomer.Open strSQL, mcnn, adOpenKeyset, adLockReadOnly
Call LoadListViewData
End Sub
' ***********************
Private Sub LoadTreeView()
Dim objTreeView As Control
Dim objNode As Node
Set objTreeView = Me.objTreeView
With mrsKen
.MoveFirst
Set objNode = objTreeView.Nodes.Add(, , "全国", "全国")
Do Until .EOF
With objTreeView.Nodes
Set objNode = .Add("全国", tvwChild, , mrsKen!都道府県)
End With
.MoveNext
Loop
End With
End Sub
|
- フォームビューに切り替えたら、TreeViewから全国をクリックします。都道府県名が表示されたら、東京都をクリックしてください。図6のようにListViewに東京都の得意先一覧が表示されます。
 |
| 図5-得意先を都道府県別に階層化して表示させた例 |
図6のListViewのフィールド名(得意先名、担当者名、Tel,
Fax)をクリックすると、昇順または降順に並べ替えします。
 |
| 図6-東京都をクリックして東京都内の得意先のみ表示させた例 |
- フォームを frmTreeViewCustomer
の名称で保存します。
|
Tip1:
都道府県名を北から順番に表示させたいときは、都道府県テーブルにIDを採番します。次に、プロシージャ OpenKenRecordsetをリスト2のように書き換えます。リスト2では、集計クエリの替わりにサブクエリを使用して得意先が存在する都道府県名のみ表示しています。
 |
| 図7-都道府県テーブルにIDフィールドを追加して北の北海道から連番を付けた例 |
リスト2に示すようにサブクエリを使用すると、得意先が登録されている都道府県のみ選択することができます。
| リスト2-集計クエリをサブクエリに替えて北から順番に表示する |
Private Sub OpenKenRecordset()
Dim strSQL As String
strSQL = "SELECT 都道府県.ID, 都道府県.都道府県" _
& " FROM 都道府県" _
& " WHERE Exists (SELECT * FROM 得意先 WHERE " _
& " 得意先.都道府県=都道府県.都道府県)" _
& " ORDER BY 都道府県.ID;"
Set mrsKen = New ADODB.Recordset
mrsKen.Open strSQL, mcnn, adOpenKeyset, adLockOptimistic
End Sub
|
図8では、TreeViewに都道府県名が北の北海道から順番に表示されています。TreeViewから全国をクリックしたときは、ListViewに全国の得意先が表示されます。
 |
| 図8-都道府県名を北の北海道から順番に表示した例 |
Tip2:
TreeViewとListViewコントロールにイメージを表示させることも可能です。この場合、ImageListコントロールを作成してイメージを登録します。図9は、Access Know-howで公開しているTip集をテーブル、クエリ、フォーム、レポート、モジュールに階層化して表示しています。TreeViewからテーブルをクリックするとListViewには、テーブルに関連するTipのみ表示されます。
さらに、ListViewからアイテムをクリックすると該当するページ(HTML)をフォーム上に表示させることも可能です。詳細は、WebとリンクしたKnowledge
Baseを開発するにはを参照してください。
 |
| 図9-TreeViewとListViewにイメージを貼り付けた例 |
|