フォームに条件付き書式設定を実行時ダイナミックに設定するお手本

図3-2-1 条件付き書式設定を実行時ダイナミックに設定するサンプルデータベース
このサンプルデータベースでは、受注明細の受注日、数量、金額に条件付き書式を設定して、条件に該当するデータを赤の下線付きで表示します。条件式には、BETWEEN, NOT BETWEEN, =, NOT =, >, <, >=,<=など8種類の比較演算子を選択することができます。
サンプルデータベース(CH3-2.mdb)では、以下に示すノウハウを習得することができます。
◆ データシートの任意のフィールドに条件付書式を設定する方法
◆ 複数のコントロールを一括して可視/非可視状態に変更する方法
◆ コントロールを左右に移動する方法
データベース CH3-2.mdbは、Accessに添付されているサンプルデータベース Northwind.mdb を基に作成します。
● 受注明細フォームを作成するには
1 Accessを起動して作業フォルダに新規データベース CH3-2.mdb を作成します。
2 ファイルメニューから外部データの取り込み、インポートをクリックします。インポートのダイアログが表示されたら、Accessのサンプルデータベース Northwind.mdb を選択してインポートボタンをクリックします。
オブジェクトのインポートダイアログが表示されたら、テーブルタブをクリックして、受注、受注明細、商品、得意先テーブルをクリックします。最後にOKボタンをクリックしてインポートを完了させます。
図3-2-2 Northwind.mdbから受注、受注明細、商品、得意先テーブルを取り込む
3 データベースウィンドウからクエリ
をクリックしたら、新規作成ボタンをクリックします。テーブルから、受注コード、商品名、受注日、数量をダブルクリックしてQEBのフィールドに移動します。金額のフィールドには、計算式 “CCur([受注明細.単価]*[数量])”を埋め込みます。受注明細のクエリを作成したら、”qry受注明細”の名称で保存してクエリを閉じます。

図3-2-3 受注明細のクエリを作成
4 データベースウィンドウからフォーム
をクリックしたら、新規作成ボタンをクリックします。フォームの新規作成ダイアログが表示されたら、オートフォーム:表形式をクリックします。コンボボックスからクエリ”qry受注明細”を選択したらOKボタンをクリックして受注明細のフォームを作成します。

図3-2-4 受注明細のデータシート形式のフォーム作成
5 フォームが表示されたら、”frm受注明細”の名称で保存して、Accessを終了させます。
● 受注明細フォームに、受注日、数量、金額の条件付書式を実行時ダイナミックに設定するには
1 Accessを起動して CH3-2.mdb を開きます。
2 フォーム“frm受注明細”をデザインモードで開いたら、フォームヘッダーの受注日、数量、金額のラベルをトグルボタンと置換します。ツールボックスのコントロールウィザード
がクリック(有効)されているか確認したら、オプショングループウィザードで受注日、数量、金額のトグルボタンを作成します。トグルボタンの値は、1-受注日、2-数量、3-金額のように設定します。オプショングループのデフォルト値は設定しません。

図3-2-5 オプショングループウィザードで、受注日、数量、金額のトグルボタンを作成
3 オプショングループのフレームのプロパティを表示させたら、コントロール名をgrpConditionに書き換えます。また、フレームが表示されないように境界線スタイルを透明に設定します。
表3-2-1 オプショングループのプロパティの設定
|
コントロールの種類 |
プロパティ |
値 |
|
オプショングループ |
名前 |
grpCondition |
|
境界線スタイル |
透明 |
|
|
トグルボタン1 |
オプション値(受注日) |
1 |
|
トグルボタン2 |
オプション値(数量) |
2 |
|
トグルボタン3 |
オプション値(金額) |
3 |

図3-2-6 オプショングループに受注日、数量、金額を配置した例
4 フォームヘッダーの最上位にタブコントロールを作成したら、コントロール名をtabConditionに書き換えます。タブコントロールには、通常2個のページが作成されますので1個削除して1ページにします。タブコントロールのスタイルを“なし”に設定して四角形のようなコントロールにします。このタブコントロールのページに、ラベル1(lblField)、コンボボックス(cboConditions)、テキストボックス1(txtValue1)、ラベル2(lblAnd)、テキストボックス2(txtValue2)、トグルボタン(tglFormat)を配置します。
表3-2-2 タブコントロールに配置するコントロールのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
|
タブコントロール (1ページのタブとする) |
名前 |
tabCondition |
|
スタイル |
なし |
|
|
ラベル1 |
名前 |
lblFIeld |
|
コンボボックス |
名前 |
cboCondition |
|
値集合タイプ |
値リスト |
|
|
値集合ソース |
0;BETWEEN;1;NOT BETWEEN;2;=;3;NOT =;4;>;5;<;6;>=;7;<= |
|
|
テキストボックス1 |
名前 |
txtValue1 |
|
可視 |
いいえ |
|
|
テキストボックス2 |
名前 |
txtValue2 |
|
可視 |
いいえ |
|
|
ラベル2 |
名前 |
lblAnd |
|
トグルボタン |
名前 |
tglFormat |

図3-2-7 タブコントロールのページに条件付書式を入力するコントロールを配置
ラベル1(lblField)の標題は、実行時書き換えますので取りあえず受注日を入力しておきます。コンボボックス(cboConditions)には、コンボボックスウィザードを使用して列1に0-7の数値、列2に比較演算子の文字列を入力します。尚、列1の数値は幅を0cmにして非表示にします。テキストボックス1(txtValue1)、テキストボックス2(txtValue2)の可視プロパティは、実行時書き換えますので“いいえ”に設定しておきます。

図3-2-8 コンボボックス(cboConditions)には比較演算子を格納、列1は幅を0cmにして非表示に設定
5 詳細セクションの受注日、数量、金額のテキストボックスのコントロール名をtxtOrderDate, txtQuantity, txtAmount に書き換えます。
6 フォームのモジュールを表示させたら、CH3-2.mdbのフォーム”frm条件付書式を実行時ダイナミックに設定”のモジュールをコピーして貼り付けます。これで、フォームに配置されたコントロールにイベントが登録されます。フォームモジュールの内容については、リスト3-2-1 frm条件付書式を実行時ダイナミックに設定を参照してください。
7 フォームを開いたら、受注日のトグルボタンをクリックして比較演算子のコンボボックスから”=”をクリックします。テキストボックスにマウスを移動して、”1996/01/10”を入力したら、書式設定のトグルボタンをクリックします。受注日が1996/01/10に該当するデータが赤の下線で表示されるか確認します。
8 条件付書式の設定が正常に動作することを確認したらフォームを保存して、Access を終了させます。

図3-2-9 受注日の条件付書式に1996/01/10 を設定した例
|
複数のコントロールを一括して可視/非可視状態にするには フォーム”frm受注明細”では、受注日、数量、金額のトグルボタンをクリックすると、条件付き書式を入力する複数のコントロールが同時に表示されます。コントロールを表示するには、可視プロパティを“はい”に設定します。複数のコントロールを表示するには、個々のコントロールの 可視プロパティを“はい”に設定する必要があります。 フォーム”frm受注明細”では、個々のコントロールの可視プロパティを設定する替わりに、これらのコントロールをタブコントロールのページに配置して一括切り替えを解決しています。タブコントロールの可視プロパティを“はい”、“いいえ”に切り替えることにより、タブに配置された複数のコントロール可視/非可視状態にすることができます。 |
リスト3-2-1 “frm条件付書式を実行時ダイナミックに設定”のモジュール
|
Private Enum ConditionType ctOrderDate = 1 ctQuantity = 2 ctAmount = 3 End Enum Private Sub cboConditions_AfterUpdate() Dim fShowV2 As Boolean Dim txtValue As TextBox
' ' 条件付き書式の比較演算子を調べて値1、値2が必要か ' どうか決めます ' Select Case Me.cboConditions Case acBetween fShowV2 = True Case acNotBetween fShowV2 = True Case Else fShowV2 = False End Select
' ' 書式設定のトグルボタンを自動調整します ' With Me .txtValue1.Visible = True .txtValue2.Visible = fShowV2 If fShowV2 Then Set txtValue = .txtValue2 Else Set txtValue = .txtValue1 End If .tglFormat.Left = txtValue.Left + txtValue.Width + 100 .tglFormat.Visible = True End With End Sub Private Sub cboConditions_GotFocus() Me.cboConditions.Dropdown End Sub Private Sub Form_Open(Cancel As Integer) Call SetAppTitle_FS("CH1-2 Conditional Formatting2 (C) " _ & Year(Date) & " by Akio Kasai") End Sub Private Sub tglFormat_Click()
Dim txt As TextBox Dim strValue1 As String Dim strValue2 As String
' ' 受注日、数量、金額の条件付書式を設定します ' Select Case Me.grpCondition Case ctOrderDate Set txt = Me.txtOrderDate Me.txtQuantity.FormatConditions.Delete Me.txtAmount.FormatConditions.Delete strValue1 = "#" & Format(Me.txtValue1, "yyyy/mm/dd") & "#" strValue2 = "#" & Format(Me.txtValue2, "yyyy/mm/dd") & "#" Case ctQuantity Set txt = Me.txtQuantity Me.txtOrderDate.FormatConditions.Delete Me.txtAmount.FormatConditions.Delete strValue1 = Nz(Me.txtValue1) strValue2 = Nz(Me.txtValue2) Case ctAmount Set txt = Me.txtAmount Me.txtOrderDate.FormatConditions.Delete Me.txtQuantity.FormatConditions.Delete strValue1 = Nz(Me.txtValue1) strValue2 = Nz(Me.txtValue2) End Select
' ' 条件1のとき前景色を赤で下線を引くように設定します ' With txt.FormatConditions .Delete If Me.tglFormat Then With .Add(acFieldValue, cboConditions, strValue1, strValue2) .ForeColor = vbRed .FontUnderline = True .Enabled = True End With End If End With End Sub Private Sub ResetFormat() Me.cboConditions = Null With Me.tglFormat .Visible = False .Enabled = False .Value = False End With With Me.txtValue1 .Visible = False .Value = Null End With With Me.txtValue2 .Visible = False .Value = Null End With With Me .txtOrderDate.FormatConditions.Delete .txtQuantity.FormatConditions.Delete .txtAmount.FormatConditions.Delete End With End Sub Private Sub Form_Load() Me.tabCondition.Visible = False Me.grpCondition = Null Call ResetFormat End Sub Private Sub grpCondition_AfterUpdate() ' ' 受注日、数量、金額のトグルボタンをクリックしたとき ' 条件付書式を入力する各種コントロールを可視状態にします ' Me.tabCondition.Visible = True With Me.lblField Select Case Me.grpCondition Case ctOrderDate .Caption = "受注日" Case ctQuantity .Caption = "数量" Case ctAmount .Caption = "金額" End Select End With Call ResetFormat Me.tglFormat.Enabled = True Me.cboConditions.SetFocus End Sub |
● grpCondition_AfterUpdate()イベントの処理について
このイベントは、オプショングループのトグルボタン(受注日、数量、金額)をクリックしたときに実行されます。このイベントでは、Me.tabCondition.Visible =Trueで、タブコントロールの可視プロパティを“はい”に設定しています。タブコントロールのプロパティを可視状態にすると、タブコントロールに配置された複数のコントロールが表示されます。Select Case…End Selectで、ラベル(lblField)の標題にクリックしたトグルボタンのフィールド名を設定します。最後に、Me.cboConditions.SetFocusで比較演算子を選択するコンボボックスにフォーカスを移動して終了します。
● cboConditions_AfterUpdate()イベントの処理について
このイベントは、比較演算子のコンボボックスから演算子(BETWEEN, NOT BETWEEN, =,….)をクリックしたときに実行されます。Select Case….End Selectで、比較演算子を調べて、acBetween, acNotBetweenならfShowV2フラグをTrueに設定します。その他の演算子なら,fShowV2フラグをFalseに設定します。Me.txtValue1.Visible=True、Me.txtValue2.Visible=fShowV2で条件式の値1、値2を入力するテキストボックスの可視プロパティを“はい”に設定しています。値2のテキストボックスは、fShowV2のフラグにより自動的に可視/非可視状態に設定されます。Me.tglFormat.Left = txtValue.Left + txtValue.Width + 100で、書式設定のトグルボタンが表示される位置を調整します。(.Widthに+100を加算していますが、この単位は100 twipです。1論理cmは567twipに相当します。)txtValueには、比較演算子が値1のみ必要なときはMe.txtValue1、値1と値2が必要なときはtxtValue2が設定されます。 最後に、Me.tgiFormat.Visible=Trueで可視プロイパティを“はい”に設定して終了します。
● tglFormat_Click()イベントの処理について
このイベントは、書式設定のトグルボタンをクリックしたときに実行されます。Select Case…End Selectでは、前回設定した条件付書式を削除して、新たに設定する条件式の値1、値2をメモリ変数(strValue1,strValue2)に格納します。With txt.FormatConditions….End Withでは、条件付書式を設定しています。.ForeColor = vbRed, .FontUnderline = Trueで、前景色を赤の下線付きで表示するように設定しています。
Tip
|
カラーの組み込み定数を参照するには Visual Basic Editor(VBE)を起動したら、表示メニューからオブジェクトブラウザをクリックします。オブジェクトブラウザが表示されたら、検索文字列のコンボボックスにColorConstantsを入力して検索ボタンをクリックします。メンバリストに、カラーの組み込み定数一覧が表示されます。 |