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

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

 

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()イベントの処理について

このイベントでは、クラスモジュール clsBookmarkRegisterControlsメソッドを使用して“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 = strBookmarkKeymstrBookmarkData = strBookmarkDataでは、得意先コードと得意先名のコントロール名を保存しています。ここで保存したコントロール名は、フォーム上に表示されている得意先の得意先コードと得意先名を取得するときに使用します。

 

Set mcolBookmarks = New Collectionでは、clsBookmarkItemsを保存するコレクションオブジェクトを生成します。

 

With mcboBookmark…End Withでは、コマンドボタンの列数、列幅、値集合タイプ、値集合ソースプロパティを再設定しています。

 

リスト4-4-3 clsBookmarkRegisterControlsメソッド

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では、clsBookmarkItemsBookmarkKey, BookmarkData, Bookmarkプロパティを設定しています。BookmarkKeyBookmarkDataには、得意先コードと得意先名が設定されます。Bookmarkには、得意先レコードのブックマークが設定されます。コレクションオブジェクトのAddメソッドを使用して、clsBookmarkItemsのインスタンスを追加したら、Sub RebuildBookmarkComboを呼び出して、コンボボックスの値集合ソースを再作成します。

 

リスト4-4-4 clsBookmarkSub 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 clsBookmarkmcmdRemove_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 clsBookmarkmcboBookmark_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 clsBookmarkRebuildBookmarkCombo()

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()について

clsBookmarkAddCmdプロパティを取得/設定します。Getは取得、Setは設定を意味します。AddCmdプロパティには、ブックマークを追加するコマンドボタンのオブジェクトを設定します。

 

  

Property Get/Set RemoveCmd()について

clsBookmarkRemoveCmdプロパティを取得/設定します。Getは取得、Setは設定を意味します。RemoveCmdプロパティには、ブックマークを削除するコマンドボタンのオブジェクトを設定します。

 

Property Get/Set BookmarkCbo()について

clsBookmarkBookmarkCboプロパティを取得/設定します。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()について

clsBookmarkItemsBookmarkKeyプロパティを取得/設定します。Getは取得、Letは設定を意味します。BookmarkKeyプロパティには、ブックマークされたレコードの主キーを設定します。

 

Property Get/Let BookmarkData()について

clsBookmarkItemsBookmarkDataプロパティを取得/設定します。Getは取得、Letは設定を意味します。BookmarkDataプロパティには、ブックマークされたレコードのデータ(例えば、得意先名)を設定します。

 

Property Get/Let Bookmark()について

clsBookmarkItemsBookmarkプロパティを取得/設定します。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イベントに以下のコードを追加します。

 

Private Sub Form_Open(Cancel As Integer)

  Set clsBM = New clsBookmark

  With clsBM

    .RegisterControls Me.cboBookMark, _

      Me.cmdAddBM, _

      Me.cmdRemoveBM, _

      "キーフィールドのコントロール名", _

      "データフィールドのコントロール名"

  End With

End Sub

 

 

5 これで組み込み完了です。フォームのコンボボックスをクリックしたときのイベント処理、またはコマンドボタンをクリックしたときのイベント処理は、全てクラスモジュールにて処理します。

 

 

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