#561 データシートフォームの列情報を列挙するには? フォーム、VBA

VBAのプログラムを利用して、データシート形式で表示されているサブフォームからデータシートの各列の情報を取得する例です。


まず例として次のようなフォームを用意します。
フォームのデザイン例

次に、[実行]ボタンのクリック時イベントプロシージャに次のようなコードを記述します。

Private Sub cmd実行_Click()

  Dim ctl As Control

  For Each ctl In Me!frm売上明細_sub.Controls
    If ctl.ControlType <> acLabel Then
      'コントロール名(列名)
      Debug.Print ctl.Name,
      '表示/非表示
      Debug.Print ctl.ColumnHidden,
      '表示順序
      Debug.Print ctl.ColumnOrder
    End If
  Next ctl

End Sub


※ここでは「frm売上明細_sub」がサブフォームコントロールの名前となっています。
※サブフォームにはラベルコントロールも配置されているため、「If ctl.ControlType <> acLabel Then」という文でそれを除外しています。
【注意】
ラベルコントロールとテキストボックスコントロール等がセットになっている場合、画面表示上の「列名」はラベルコントロールの方の「標題」プロパティやテキストボックスコントロールの方の「データシートの標題」プロパティの値が使われますので、必ずしも「ctl.Name」が列名とはなりません。ラベルの標題とテキストボックスの名前が異なっている場合、あるいは「データシートの標題」プロパティを設定している場合には、適宜プログラムを変える必要があります。


まず、そのままの状態で[実行]ボタンをクリックして、イミディエイトウィンドウの内容を確認します。
元のフォームの状態

イミディエイトウィンドウの実行結果


次に、「数量」の列を非表示にして実行してみます。
数量列が表示されている

数量列を非表示にした状態

イミディエイトウィンドウの実行結果
今度は「数量」列の「ColumnHidden」プロパティが”True”になっています。ちょっとややこしいですが、ColumnHiddenは”非表示のときにTrue”となります。


次に、データシート上で見出し部分をドラッグ&ドロップして、「商品名」の列を先頭に移動してから[実行]ボタンをクリックしてみます。
商品名列を先頭に移動

イミディエイトウィンドウの実行結果
それによって「商品名」の「ColumnOrder」プロパティの値が”1”に変わっていることが分かります。デザインはまったく変えていませんので、このことから「ColumnOrder」によって、デザイン上のコントロールの配置順序やタブオーダーではなく、実行画面上の表示順序が取得できるということが分かります。
| Index | Prev | Next |



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