複数のレコードをブックマークするお手本データベース

図4-4-1 複数の得意先をブックマークするサンプルデータベース
このサンプルデータベースは、複数の得意先をブックマークしてブックマークした得意先を再表示することができます。フォーム上にブックマークしたい得意先を表示したら、ブックマーク追加ボタンをクリックします。追加されたブックマークは、コンボボックスに登録されます。ブックマークされた得意先を再表示するときは、コンボボックスから一覧を表示させて目的の得意先をクリックします。ブックマークを削除するには、コンボボックスから目的の得意先をクリックしてフォームに表示させてからブックマーク削除ボタンをクリックします。

図4-4-2 コンボボックスに登録されたブックマークの一覧を表示させた例
サンプルデータベース( CH4-4.mdb)では、以下に示すノウハウを習得することができます。
◆ フォームのブックマークの使い方
◆ コレクションオブジェクトの使い方
◆ クラスモジュールの作り方
データベース CH4-4.mdbは、Accessに添付されているサンプルデータベース Northwind.mdbを基に作成します。
● 複数の得意先をブックマークするフォームを作成するには
1 Access を起動して作業フォルダに新規データベース CH4-4.mdbを作成します。
2 ファイルメニューから外部データの取り込み、インポートをクリックします。インポートのダイアログが表示されたら、Aceessのサンプルデータベース Northwind.mdbを選択してインポートボタンをクリックします。
オブジェクトのインポートダイアログが表示されたら、テーブルタブをクリックして、得意先テーブルをクリックします。最後に、OKボタンをクリックしてインポートを完了させます。

図4-4-3 Northwind.mdbから得意先テーブルを取り込む
3 データベースウィンドウからクエリ
をクリックして、新規作成ボタンをクリックします。クエリの新規作成のダイアログが表示されたら、デザインビューをクリックしてOKボタンをクリックします。テーブルの表示ダイアログから得意先をクリックして追加ボタンをクリックします。閉じるのボタンをクリックしてダイアログを閉じます。クエリが表示されたら、得意先テーブルから得意先コード、得意先名、部署、担当者名、電話番号をダブルクリックしてQEBのフィールドに移動します。クエリを”qry得意先”の名称で保存して閉じます。

図4-4-4 得意先テーブルのクエリ作成
4 データベースウィンドウからフォーム
をクリックして新規作成のボタンをクリックします。フォームの新規作成ダイアログが表示されたら、フォームウィザードを選択します。基になるテーブル/クエリのコンボボックスから”qry得意先”を選択したら、OKボタンをクリックします。フォームウィザードの指示に従って、図4-4-5のようなフォームを作成します。

図4-4-5 フォームウィザードで得意先のフォームを作成
5 フォームヘッダーにブックマークを保存するコンボボックスと3個のコマンドボタンを作成します。フォームヘッダーに作成したコントロールのプロパティは、表4-4-1のように設定します。コンボボックスの値集合ソースには実行時、連番と得意先名がペア(2列)で作成されます。
表4-4-1 フォームヘッダーに作成したコントロールのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
|
コンボボックス |
名前 |
cboBookmark |
|
コマンドボタン1 |
名前 |
cmdListBookmarks |
|
標題 |
ブックマーク表示 |
|
|
コマンドボタン2 |
名前 |
cmdAddBM |
|
標題 |
ブックマーク 追加 |
|
|
コマンドボタン3 |
名前 |
cmdRemoveBM |
|
標題 |
ブックマーク 削除 |

図4-4-6 フォームヘッダーにコンボボックスと3個のコマンドボタンを作成
6 メニューからコード
のアイコンをクリックしてフォームモジュールを表示させたら、CH4-4.mdbを開いて”frm得意先”のフォームモジュールをコピーして貼り付けます。フォームモジュールのソースリストは、リスト4-4-1を参照してください。また、CH4-4.mdbの標準モージュール basMyLibとクラスモジュール clsBookmark, clsBookmarkItemsも必要になりますのでインポートしてください。クラスモジュールには、フォームの各種イベント処理が登録されています。
7 フォームを開いたら、レコードを移動しながらブックマーク追加ボタンをクリックします。コンボボックスから、ブックマークした得意先をクリックして再表示されるか確認します。ブックマークされた得意先を解除するには、ブックマーク削除ボタンをクリックします。

図4-4-7 複数の得意先をブックマークした例
8 ブックマークの処理が正常に動作することが確認できたらフォームを”frm得意先”の名称で保存して、Access を終了させます。
Sub Form_Open()イベントの処理について
このイベントでは、クラスモジュール clsBookmarkのRegisterControlsメソッドを使用して“frm得意先”のコントロールを登録します。RegisterControlsメソッドの引数には、表1-5-2に示すように5個の引数を指定します。
表4-4-2 RegisterControlsメソッドの引数
|
引数1 (cboBookMark) |
ブックマークを登録するコンボボックスのコントロール 例: Me.cboBookMark |
|
引数2 (cmdAdd) |
ブックマークを追加するコマンドボタンのコントロール 例: Me.cmdAddBM |
|
引数3 (cmdRemove) |
ブックマークを削除するコマンドボタンのコントロール 例: Me.cmdRemoveBM |
|
引数4 (strBookmarkKey) |
フォームに連結されているテーブル/クエリの主キーのコントロール名 例:得意先テーブルの得意先コード |
|
引数5 (strBookmarkData) |
フォームに連結されているテーブル/クエリのデータのコントロール名 例:得意先テーブルの得意先名 |
RegisterCotrolsメソッドで、フォーム上のコンボボックス、コマンドボタンのコントロールを登録することにより、これらのコントロールの各種イベント処理をクラスモジュールclsBookmark内で処理することができます。
Set clsBM = New clsBookmark
With clsBM
.RegisterControls Me.cboBookMark, _
Me.cmdAddBM, _
Me.cmdRemoveBM, _
"得意先コード", _
"得意先名"
End With
例えば、コンボボックス(cboBookMark)の更新後処理/AfterUpdateイベントをクラスモジュールで処理するには、WithEventsでコンボボックスを定義してSet mcboBookmark = cboBookMarkでフォームのコンボボックスをセットします。AfterUpdateイベントを登録するには、AfterUpdateプロパティに”[Event Procedure]”をセットします。フォーム上のコンボボックスをクリックすると、クラスモジュールのSub cboBookmark_AfterUpdate()に制御が渡り、“Hello cboBookmark_AfterUpdate()”のメッセージが表示されます。
Private WithEvents mcboBookmark As ComboBox
Set mcboBookmark = cboBookMark
mcboBookmark.AfterUpdate = "[Event Procedure]"
Private Sub mcboBookmark_AfterUpdate()
MsgBox “Hello cboBookmark_AfterUpdate()”
End Sub
Sub cmdListBookmarks_Click()イベント処理について
このイベントでは、コンボボックス(cboBookMark)の得意先名をメモリ変数(strMsg)に格納して表示します。コンボボックスの列1には連番(1-999)、列2には得意先名が格納されています。コンボボックスの列を参照するには、Columnプロパティを使用します。Columnプロパティの引数1には0から始まる列番号、引数2には0から始まる行番号を指定します。
例えば、コンボボックスの1行目の列1を表示するには、Debug.Print Me.cboBookMark.Column(0,0)のように記述します。1行目の列2を表示するには、Debug.Print Me.cboBookMark.Column(1,0)のように記述します。
リスト4-4-1 frm得意先のフォームモジュール
|
Private clsBM As clsBookmark Private Sub cmdListBookmarks_Click() Dim intI As Integer Dim strMsg As String With Me.cboBookMark For intI = 0 To .ListCount - 1 strMsg = strMsg & .Column(1, intI) & vbCrLf Next intI End With MsgBox strMsg, , "ブックマークリスト" End Sub Private Sub Form_Load() Call SetAppTitle_FS("Multiple Bookmarks (C) " _ & Year(Date) & " by Akio Kasai") End Sub Private Sub Form_Open(Cancel As Integer) Set clsBM = New clsBookmark With clsBM .RegisterControls Me.cboBookMark, _ Me.cmdAddBM, _ Me.cmdRemoveBM, _ "得意先コード", _ "得意先名" End With End Sub Private Sub Form_Unload(Cancel As Integer) Set clsBM = Nothing End Sub |
Sub RegisterControls()メソッドの処理について
このメソッドは、引数で指定された各種コントロールをクラスモジュールに登録して、各コントロールのイベント処理をクラスモジュールで処理できるようにします。Set BookmarkCbo = cboBookMarkで、コンボボックスをWithEventsに登録します。Set BookmarkCboで、Property Set BookmarkCbo()が実行されます。Property Set BookmarkCbo()では、WithEventsで宣言した変数(mcboBookmark)にフォームのコンボボックスオブジェクトのポインタを設定します。また、コンボボックスのAfterUpdateプロパティに"[Event Procedure]"を設定してイベントを登録します。コンボボックスのAfterUpdateイベントが発生したときは、クラスモジュールのSub mcboBookmark_AfterUpdate()に制御が渡ります。同様の手順で、cmdAdd, cmdRemoveのコマンドボタンをWithEventsに登録します。コマンドボタンに対しては、OnClickイベントを登録します。
mstrBookmarkKey = strBookmarkKey、mstrBookmarkData = strBookmarkDataでは、得意先コードと得意先名のコントロール名を保存しています。ここで保存したコントロール名は、フォーム上に表示されている得意先の得意先コードと得意先名を取得するときに使用します。
Set mcolBookmarks = New Collectionでは、clsBookmarkItemsを保存するコレクションオブジェクトを生成します。
With mcboBookmark…End Withでは、コマンドボタンの列数、列幅、値集合タイプ、値集合ソースプロパティを再設定しています。
リスト4-4-3 clsBookmarkのRegisterControlsメソッド
|
Private mcolBookmarks As Collection Private mfrm As Form Private mstrBookmarkKey As String Private mstrBookmarkData As String Private WithEvents mcboBookmark As ComboBox Private WithEvents mcmdAdd As CommandButton Private WithEvents mcmdRemove As CommandButton Public Sub RegisterControls( _ cboBookMark As ComboBox, _ cmdAdd As CommandButton, _ cmdRemove As CommandButton, _ strBookmarkKey As String, _ strBookmarkData As String)
Set mfrm = cboBookMark.Parent Set BookmarkCbo = cboBookMark Set AddCmd = cmdAdd Set RemoveCmd = cmdRemove mstrBookmarkKey = strBookmarkKey mstrBookmarkData = strBookmarkData Set mcolBookmarks = New Collection
With mcboBookmark .ColumnCount = 2 .ColumnWidths = "0;2" .RowSourceType = "Value list" .RowSource = "-1; '<< Add a New Bookmark >>'" End With End Sub |
Sub mcmdAdd_Click()イベントの処理について
このイベントは、フォームのブックマーク追加のコマンドボタンをクリックしたときに実行されます。For intI = 1 To mcolBookmarks.Count…Nextでは、フォーム上に表示されている得意先のブックマークが既に登録されているかどうか調べます。既に、ブックマークが登録されているときは、エラーメッセージを表示してクリック時のイベントを無効にします。
Set clsBI = New clsBookmarkItemsでインスタンスを生成してから、With clsBI…End Withでは、clsBookmarkItemsのBookmarkKey, BookmarkData, Bookmarkプロパティを設定しています。BookmarkKey、BookmarkDataには、得意先コードと得意先名が設定されます。Bookmarkには、得意先レコードのブックマークが設定されます。コレクションオブジェクトのAddメソッドを使用して、clsBookmarkItemsのインスタンスを追加したら、Sub RebuildBookmarkComboを呼び出して、コンボボックスの値集合ソースを再作成します。
リスト4-4-4 clsBookmarkのSub mcmdAdd_Click()イベント
|
Private Sub mcmdAdd_Click() Dim intI As Integer Dim strBookmarkKey As String Dim strBookmarkData As String Dim clsBI As clsBookmarkItems
strBookmarkKey = mfrm(mstrBookmarkKey) strBookmarkData = mfrm(mstrBookmarkData) ' ' Bookmarkが既に登録されているチェックする ' For intI = 1 To mcolBookmarks.Count Set clsBI = mcolBookmarks.Item(intI) If clsBI.BookmarkKey = strBookmarkKey Then MsgBox "この得意先は既にブックマークされています!", vbExclamation Exit Sub End If Next ' ' クラスオブジェクトにブックマーク情報を保存して ' コレクションに追加する ' Set clsBI = New clsBookmarkItems With clsBI .BookmarkKey = strBookmarkKey .BookmarkData = strBookmarkData .Bookmark = mfrm.Bookmark End With mcolBookmarks.Add Item:=clsBI RebuildBookmarkCombo End Sub |
Sub mcmdRemove_Click()イベントの処理について
このイベントは、フォームのブックマーク削除のコマンドボタンをクリックしたときに実行されます。最初に、コンボボックスで得意先を選択しているかどうか調べます。削除される得意先が選択されているとき、ブックマークのコレクションオブジェクト(mcolBookmarks)からRemoveメソッドを使用して得意先のブックマークを削除します。最後に、Sub RebuildBookmarkComboを呼び出してコンボボックスの値集合ソースを再作成します。
リスト4-4-5 clsBookmarkのmcmdRemove_Click()イベント
|
Private Sub mcmdRemove_Click() If Not IsNull(mcboBookmark.Value) Then mcolBookmarks.Remove CInt(mcboBookmark.Value) RebuildBookmarkCombo End If End Sub |
Sub mcboBookmark_AfterUpdate()イベントの処理について
このイベントは、フォームのコンボボックスから得意先のブックマークをクリックしたときに実行されます。コレクションオブジェクト(mcolBookmarks)のItemメソッドを使用して、clsBookmarkItemsのインスタンスを取得します。保存されているブックマークをclsBI.Bookmarkメソッドで取得して,フォームのブックマーク(mfrm.Bookmark)に設定することにより、ブックマークした得意先がフォームに表示されます。
リスト4-4-6 clsBookmarkのmcboBookmark_AfterUpdate()イベント
|
Private Sub mcboBookmark_AfterUpdate() Dim clsBI As clsBookmarkItems Set clsBI = mcolBookmarks.Item(CInt(mcboBookmark)) mfrm.Bookmark = clsBI.Bookmark End Sub |
Sub RebuildBookmarkCombo()の処理について
このサブプロシージャでは、コレクションオブジェクト(mcolBookmarks)に登録されているメンバを取り出して、コンボボックスの値集合ソースを再作成します。For intI = 1 To mcolBookmarks.Count…Nextでは、コレクションオブジェクトのItemメソッドを使用してclsBookmarkItemsのインスタンスを取り出して、メモリ変数(strRowSource)にコンボボックスの値集合ソース(RowSource)を作成します。コンボボックスの列1には連番(1-999)、列2には得意先名を格納します。また、列1と列2の前に区切り文字セミコロン(;)を挿入して分離します。strRowSource = Mid(strRowSource, 2)では、先頭の不要なセミコロン(;)を除去しています。With mcboBookmark…End Withでは、フォーム上のコンボボックスのプロパティを再設定しています。
リスト4-4-7 clsBookmarkのRebuildBookmarkCombo()
|
Private Sub RebuildBookmarkCombo() Dim intI As Integer Dim strRowSource As String Dim clsBI As clsBookmarkItems
Const conQuotes = """"
For intI = 1 To mcolBookmarks.Count Set clsBI = mcolBookmarks.Item(intI) strRowSource = strRowSource & ";" & intI & _ ";" & conQuotes & clsBI.BookmarkData & conQuotes Next intI strRowSource = Mid(strRowSource, 2) ' strip first ;
With mcboBookmark .RowSource = strRowSource .Value = Null .Requery End With End Sub |
Property Get/Set AddCmd()について
clsBookmarkのAddCmdプロパティを取得/設定します。Getは取得、Setは設定を意味します。AddCmdプロパティには、ブックマークを追加するコマンドボタンのオブジェクトを設定します。
Property Get/Set RemoveCmd()について
clsBookmarkのRemoveCmdプロパティを取得/設定します。Getは取得、Setは設定を意味します。RemoveCmdプロパティには、ブックマークを削除するコマンドボタンのオブジェクトを設定します。
Property Get/Set BookmarkCbo()について
clsBookmarkのBookmarkCboプロパティを取得/設定します。Getは取得、Setは設定を意味します。BookmarkCboプロパティには、ブックマークを保存するコンボボックスのオブジェクトを設定します。
リスト4-4-8 clsBookmarkのプロパティ
|
Public Property Get AddCmd() As CommandButton Set AddCmd = mcmdAdd End Property Public Property Set AddCmd(cmd As CommandButton) Set mcmdAdd = cmd mcmdAdd.OnClick = "[Event Procedure]" End Property Public Property Get RemoveCmd() As CommandButton Set RemoveCmd = mcmdRemove End Property Public Property Set RemoveCmd(cmd As CommandButton) Set mcmdRemove = cmd mcmdRemove.OnClick = "[Event Procedure]" End Property Public Property Get BookmarkCbo() As ComboBox Set BookmarkCbo = mcboBookmark End Property Public Property Set BookmarkCbo(cbo As ComboBox) Set mcboBookmark = cbo mcboBookmark.AfterUpdate = "[Event Procedure]" End Property |
Property Get/Let BookmarkKey()について
clsBookmarkItemsのBookmarkKeyプロパティを取得/設定します。Getは取得、Letは設定を意味します。BookmarkKeyプロパティには、ブックマークされたレコードの主キーを設定します。
Property Get/Let BookmarkData()について
clsBookmarkItemsのBookmarkDataプロパティを取得/設定します。Getは取得、Letは設定を意味します。BookmarkDataプロパティには、ブックマークされたレコードのデータ(例えば、得意先名)を設定します。
Property Get/Let Bookmark()について
clsBookmarkItemsのBookmarkプロパティを取得/設定します。Getは取得、Letは設定を意味します。Bookmarkプロパティには、レコードのブックマークを設定します。
リスト4-4-9 clsBookmarkItemsのプロパティ
|
Private mstrBookmarkKey As String Private mstrBookmarkData As String Private mstrBookmark As String Property Get BookmarkKey() As String BookmarkKey = mstrBookmarkKey End Property Property Let BookmarkKey(strKey As String) mstrBookmarkKey = strKey End Property Property Get BookmarkData() As String BookmarkData = mstrBookmarkData End Property Property Let BookmarkData(strData As String) mstrBookmarkData = strData End Property Property Get Bookmark() As String Bookmark = mstrBookmark End Property Property Let Bookmark(strBookmark As String) mstrBookmark = strBookmark End Property |
Tip
|
クラスモジュールのプロパティを作成するには クラスモジュールのプロパティは、Property Get/Letまたは Property Get/Setのペアで作成します。Property Getは、プロパティを取得します。Property Letは、プロパティに値を設定します。Property Setは、プロパティにオブジェクトプロパティ(オブジェクトのポインタ)を設定します。プロパティを格納するメモリ変数は、クラスモジュールの先頭で定義します。 |
Tip
|
クラスモジュールの特徴 サンプルデータベースCh1-5.mdbは、複数のレコードをブックマークしてレコードを再表示する処理を全てクラスモジュールにて行っています。このため、既に作成済みのデータベースに本機能を簡単に組み込むことができます。 既に作成済みのデータベース(MyDB.md)に本機能を組み込む手順: 1 Access を起動して、既に作成済みのデータベース(MyDB.mdb)を開きます。 2 CH4-4.mdbからクラスモジュール clsBookmark, clsBookmarkItemsをインポートします。 3 本機能を組み込むフォームをデザインモードで開きます。フォームヘッダーにコンボボックスと2個のコマンドボタン(ブックマーク追加/削除ボタン)を作成します。(CH4-4.mdbの”frm得意先”をデザインモードで開いて、フォームヘッダーに作成されているコントロールをコピーして貼り付けると便利です) 4 フォームのクラスモジュールに、Private clsBM as clsBookmarkを定義して、Form_Openイベントに以下のコードを追加します。
5 これで組み込み完了です。フォームのコンボボックスをクリックしたときのイベント処理、またはコマンドボタンをクリックしたときのイベント処理は、全てクラスモジュールにて処理します。 |