#781 コントロールの可視に応じて下のコントロールを上に詰めるには? レポート、VBA

レポートの上のコントロールの印刷有無を切り替えることは簡単にできます。プロパティシートであれば「可視」プロパティの”はい/いいえ”、VBAであれば「Visible」プロパティの”True/False”を変更するだけです。

ただしその場合、デザイン上そのコントロールよりも下に配置されているコントロールの上下位置は変わることはありません。下図の例では、「数量合計」と「数量×単価合計」の可視/非可視をそれぞれ切り替えていますが、その下にある「*******」の位置はまったく変わっていないことが分かります。


そのようなとき、上にあるコントロールの可視状態に応じて、下にあるコントロールを自動的に上詰めにする方法です。上図の例であれば「数量合計」と「数量×単価合計」のいずれかあるいは両方が非可視になったとき、その分「*******」を上方向に移動し、表示されているコントロールのすぐ下に「*******」が出力されるようにします。

ポイントとしては、可視プロパティを変えるのではなく、「印刷時縮小」プロパティを利用します。このプロパティが”はい”になっているとき、もしテキストボックスに出力されるデータが空のとき、自動的に縮小し、結果的に非表示の状態になるという性質を利用します。

なおこのような処理は、VBAを使って各コントロールの「上位置」プロパティを動的に切り替えることでも実現できます。ただ上詰めすべきコントロールがたくさんある場合、コードの記述も多くなりますしそのプロパティ値を細かく計算する必要があります。ここではそのようなコードや計算なしで実現できる方法を紹介します。


それには、次のような手順で各コントロールをデザインします。
  1. モジュール上に可視/非可視を設定するプロシージャを作成します。レポートのコントロールソースから参照できるよう、Functionプロシージャとします。

    Private Function Flg() As Integer

      'Flg 1:両方 2:数量合計のみ 3:数量×単価合計のみ
      Flg = 1

    End Function

    このコードでは、2つのテキストボックスに関して、両方可視にするかいずれか一方だけを可視にするかを設定します。ここでは単にその値を代入しているだけですが、実際にはさまざまな条件が加わって、その状況に応じて動的に異なる値を返すことになります。

  2. テキストボックスの標題となるラベルについては、「ラベル」コントロールではなく「テキストボックス」コントロールを使うようにします。これは次の「印刷時縮小」プロパティがラベルにはないためです。

  3. プロパティシートで、可視/非可視を切り替える対象コントロールの「印刷時縮小」プロパティを”はい”に設定します。

  4. 各テキストボックスの「コントロールソース」プロパティに次のような式を設定します。
    たとえば「=IIf(Flg()<>3, "数量合計", Null)」では、Flg()が3でなければ”数量合計”という文字がコントロールソースに設定され、それ以外ならNullとなります。

    • 数量合計の標題用テキストボックス
               ........=IIf(Flg()<>3, "数量合計", Null)

    • 数量合計の値出力用テキストボックス
               ........=IIf(Flg()<>3, Sum([数量]), Null)

    • 数量×単価合計の標題用テキストボックス
               ........=IIf(Flg()<>2, "数量×単価合計", Null)

    • 数量×単価合計の値出力用テキストボックス
               ........=IIf(Flg()<>2, Sum([数量]*[単価]), Null)

    ※ここではFlgプロシージャの返り値に合わせて、Flg()が「1」のときは両方、「2」のときは数量合計のみ、「3」のときは金額合計のみ出力するという設定にしています。



実行例:
下図では、2つのテキストボックスの可視に追従して、それより下の「*******」のラベルが上詰めされていることが分かります。

■Flg()の返り値が「1」のとき

■Flg()の返り値が「2」のとき

■Flg()の返り値が「3」のとき
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved