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

フォームの複製を生成するお手本データベース

 

2-4-1 得意先フォームを複製するサンプルデータベース

 

このサンプルデータベースは、得意先を都道府県で絞り込んでグループ化してフォームの複製を生成します。図2-4-1では、得意先を神奈川県、千葉県、埼玉県にグループ化して都道府県別の複製を作成しています。

 

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

 

◆ フォームの複製を生成する方法

◆ フォームの複製を閉じる方法

◆ 得意先を都道府県で絞り込む方法

 

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

 

   得意先を都道府県別にグループ化してフォームの複製を生成するには

 

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

 

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

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

 

2-4-2 Northwind.mdbから得意先テーブルを取り込む

 

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

 

2-4-3 フォームウィザードで得意先のフォームを作成

 

4 フォームヘッダーに、都道府県のコンボボックスと3個のコマンドボタンを作成します。都道府県のコンボボックスは、ウィザードを使用して作成します。メニューからツールボックスのアイコンをクリックしてツールボックスを表示させたら、コントロールウィザードが有効(クリックされていること)になっているか確認してから、フォームにコンボボックスを貼り付けます。コンボボックスウィザードのダイアログが表示されたら、テーブルまたはクエリの値を表示するを選択して次へのボタンをクリックします。得意先テーブルを選択したら、次へのボタンをクリックします。選択可能なフィールドに、都道府県を選択したら次へのボタンをクリックします。以降、ウィザードの指示に従ってコンボボックスの作成を完了させます。


2-4-4 得意先テーブルから都道府県名を表示するコンボボックス作成

このコンボボックスには、都道府県名が重複して表示されますのでグループ化します。コンボボックスのプロパティを表示させたら、値集合ソースをクリックしてクエリビルダボタンをクリックします。クエリビルダが表示されたら、フィールドから得意先コードを削除します。次に、メニューから集計のアイコン をクリックして都道府県をグループ化します。クエリを保存してフォームのデザインビューに戻ります。コンボボックスのプロパティを表示させたら、列数を1、列幅を1cmに書き換えます。

 

2-4-5 都道府県をグループ化

 

コマンドボタンは、ツールボックスからコマンドボタンのアイコンを貼り付けて3個作成します。

2-4-1 フォームヘッダーに作成したコントロールのプロパティ

コントロールの種類

プロパティ

コンボボックス

名前

cboKen

値集合ソース

SELECT 得意先.都道府県

FROM 得意先

GROUP BY 得意先.都道府県;

列数

1

列幅

1cm

コマンドボタン1

名前

cmdFilter

クリック時

イベントプロシージャ

コマンドボタン2

名前

cmdReSet

クリック時

イベントプロシージャ

コマンドボタン3

名前

cmdClose

クリック時

イベントプロシージャ

 

 

2-4-6 フォームヘッダーにコンボボックスと3個のコマンドボタンを作成した例

 

5 フォームフッターに、フォームの複製と複製を閉じるために2個のコマンドボタンを作成します。

 

2-4-2 フォームフッターに作成したコントロールのプロパティ

コントロールの種類

プロパティ

コマンドボタン4

名前

cmdCreateInstance

コマンドボタン5

名前

cmdCloseInstances

 

6 メニューからコードのアイコンをクリックしてフォームモジュールを表示させたら、CH2-4.mdbを開いてfrm得意先のフォームモジュールをコピーして貼り付けます。フォームモジュールのソースリストは、リスト2-4-1を参照してください。また、CH2-4.mdbのモジュール basMultipleInstances, basMyLibも必要になりますのでインポートしてください。

 

7 フォームを開いたら、フォームの複製ボタンをクリックして複製が生成されるか確認します。複製を閉じるのボタンをクリックすると全ての複製が閉じられます。

 

8 正常に動作することを確認したら、フォームを“frm得意先”の名称で保存してAccess を終了させます。

 

 

Sub cmdFilter_Clickイベントの処理について

このプロシージャは、コンボボックスで選択した都道府県で得意先を絞込みます。メモリ変数(strCriteria)に、フィルタ条件を格納したらフォームのFilterプロパティに設定して FilterOnプロパティを”True”に設定します。都道府県のフィールドは、テキスト型ですから、都道府県名をダブルクオテーション(“)で囲みます。strCriteriaには、都道府県=”埼玉県のように格納されます。

 

 

Sub cmdReSet_Clickイベントの処理について

このプロシージャでは、フォームに設定したフィルタ条件を初期化します。フィルタ条件を無効にするには、フォームのFilterプロパティにNullを設定して、FilterOnプロパティを”False”に設定します。尚、FilterOnプロパティを”False”に設定したときは、Filterプロパティの内容は参照されませんので特にNullに初期化する必要はありません。

 

  With Me

    .Filter = vbNullString

    .FilterOn = False

  End With

 

 

Sub Form_Current()イベント処理について

このプロシージャでは、フォームの標題に都道府県名と得意先名を表示します。このイベントには、フォームに表示されているレコードが移動したときに制御が渡ります。

 

 

リスト 2-4-1 frm得意先のフォームモジュール

Private Sub cmdCloseInstances_Click()

  Call CloseInstances_FS

End Sub

 

Private Sub cmdCreateInstance_Click()

  Call CreateInstance_FS(Me)

End Sub

 

Private Sub cmdFilter_Click()

  Dim strCriteria As String

  Const conQuotes = """"

  '

  ' コンボボックスで選択した都道府県名で得意先を絞り込む

  '

  With Me.cboKen

    If Len(Trim(Nz(.Value))) = 0 Then

      .SetFocus

      MsgBox "フィルタ条件を入力してください!"

      Exit Sub

    End If   

    strCriteria = "都道府県=" & conQuotes & .Value & conQuotes   

  End With

  '

  ' フォームのフィルタ条件設定

  '

  With Me

    .Filter = strCriteria

    .FilterOn = True

  End With

 

End Sub

 

Private Sub cmdReSet_Click()

  '

  ' フォームのフィルタ条件を無しにリセットする

  '

  With Me

    .Filter = vbNullString

    .FilterOn = False

    .cboKen = vbNullString

  End With

End Sub

 

Private Sub cmdClose_Click()

  DoCmd.Close

End Sub

 

Private Sub Form_Close()

  Call RemoveInstance_FS(Me)

End Sub

 

Private Sub Form_Current()

  '

  ' フォームの標題に都道府県名と得意先名を表示

  '

  With Me

    If .NewRecord Then

      .Caption = " "

    Else

      .Caption = Me.都道府県 & "" & Me.得意先名

    End If

    .cboKen = Me.都道府県

  End With

End Sub

 

Private Sub Form_Open(Cancel As Integer)

  Call SetAppTitle_FS("Multiple Instances (C) " _

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

End Sub

 

 

Sub CreateInstance_FSの処理について

このプロシージャでは、引数で指定されたフォームの複製(クローン)を生成します。フォームの複製を生成するには、フォームのクラスモジュールのインスタンスを生成します。フォームのクラスモジュールには、フォーム名の先頭にForm_が付加されます。例えば、フォーム(frm得意先)のクラスモジュールは(Form_frm得意先)になります。Set frm = New From_frm得意先 を実行するとfrm得意先の複製が生成されます。

  Dim frm As Form

  Set frm = New Form_frm得意先


複製されたフォームは、オリジナルの名称と同様ですから DoCmd.Closeコマンドの引数にフォーム名を指定して閉じることはできません。このため、フォームのコレクションにインスタンスを保存して、このコレクションを参照して閉じます。コレクションに保存された複製が、ユニークになるようにコレクションのキーにフォームハンドラーを使用します。
  mcolForms.Add Item:=frm, Key:=frm.hWnd & ""

 

複製されたフォームが、重ならないように  DoCmd.MoveSizeコマンドで右下にずらして表示しています。引数のRight, Downで指定する数値は、画面上の長さを表す単位でtwipと呼ばれます。

複製されたフォームにオリジナルフォームのプロパティをコピーするには

 

    frm.Caption = frmOrg.Caption

    frm.Filter = frmOrg.Filter

    frm.FilterOn = frmOrg.FilterOn

 

のように記述します。

 

複製されたフォームは、可視プロパティが“いいえ”に設定されていますので、“はい”に設定しないと表示されません。


   frm.Visible = True

 

リスト2-4-2 

Private mintI As Integer

Private mcolForms As New Collection

 

Public Sub CreateInstance_FS(frmOrg As Form)

'

' フォームのインスタンスを生成してオリジナルの情報を複写します

'

  Dim frm As Form

   

  Set frm = New Form_frm得意先

  mintI = mintI + 1

  mcolForms.Add Item:=frm, Key:=frm.hWnd & ""

  DoCmd.MoveSize Right:=(mintI + 1) * 150, Down:=(mintI + 1) * 350

  With frm

    .Caption = frmOrg.Caption

    .Filter = frmOrg.Filter

    .FilterOn = frmOrg.FilterOn

    .Visible = True

  End With

End Sub

 

 

Sub CloseInstances_FSの処理について

このプロシージャでは、フォームのコレクション(mcolForms)に保存されている複製を閉じます。複製は、オリジナルと同じ名称のため  DoCmd.Close コマンドの引数でフォーム名を指定して閉じることはできません。このため、コレクションからフォームのインスタンスを取得して、frm.SetFocusでフォーカスを複製に移動してから DoCmd.Closeで複製を閉じます。

 

 

リスト 2-4-3

Public Sub CloseInstances_FS()

  Dim frm As Form

 

  On Error Resume Next

  For Each frm In mcolForms

    frm.SetFocus

    DoCmd.Close

  Next frm

  mintI = 0

End Sub

 

 

Tip

コレクションオブジェクトの使い方

Collection オブジェクトにメンバを追加するときには Add メソッドを使い、メンバを削除するときには Remove メソッドを使います。また、Collection オブジェクトから特定のメンバを取得するときには Item メソッドを使い、Collection オブジェクトに含まれるすべてのメンバを取得するときには For Each ... Next ステートメントを使います。

Sub Sample()

  Dim intI As Integer

  Dim colForms As Collection

  Dim item As Variant

 

  Set colForms = New Collection

  With colForms

    For intI = 1 To 5

      .Add item:="Form" & CStr(intI), Key:=CStr(intI)

    Next intI

    Debug.Print .Count   è 5

    For Each item In colForms

      Debug.Print item  ‘ Form1-Form5

    Next item

    .Remove 1

    Debug.Print .Count   è 4

    For Each item In colForms

      Debug.Print item  ‘ Form2-Form5

    Next item

  End With

  Set colForms = Nothing

End Sub

 

 

ダウンロード (CH2-4.lzh)