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

図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
ステートメントを使います。 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 |