なんでこの記事が必要なのか
Accessのフォームにタブコントロールを設置して、個々のタブ(Access用語におけるページ)をメニュー選択により表示したり、非表示にしたりするのを、VBAでやりたいと思いました。
イメージとしては、フォームの上部にメニュー、下部にタブコントロールがあって、メニューを選ぶとタブコントロールに必要なタブだけが表示される。選んだメニューによって表示されるタブが違う。
ということで、タブコントロール内の個々のページの表示・非表示についてさっそくggってみたのですが、removeメソッドを使え、という古い記事ばかりヒットする。タブを一度削除してしまって、再表示するときは生成するってことですね。
ええー流石にそんなわけないだろうと思って、手探りでトライアンドエラーしていたらやり方がわかったので、記念にここに記するわけであります。
(※補足しておくと、Accessの古いバージョンでは、この方法ができなかったんだと思う。古いAccessなど手元にないのでわかりませんが、先人の誰も試していないとは思えないので。ちなみに私はOffice 365のAccessを使用しています。今どきAccess使ってる人どんだけいるのかな…)
で、どうやったら出来たのか
Me![タブコントロールの名前].Pages(0).Visible = True
Me![タブコントロールの名前].Pages(1).Visible = False
タブコントロールの名前は、タブ群全体の名前ね(各ページの名前ではなく)。
Pages()のカッコの中の数字は、ページインデックスが入ります。
それ何?って人は、フォームをデザインビューで開いて、タブコントロールの中の一つのタブを選択すると、右側のプロパティウィンドウに「ページインデックス 0」とか書いてあるところがあるので、そこの数字をチェックしてください。
というか、タブの並びを、左から数えた順番(ゼロ始まり)だと思います。
Visible = True だと表示する。
Visible = False だと非表示にする。
上記の例ではページインデックスが0のページを表示、1のページを非表示。です。
気になってる点
上述の通り、ページインデックス=ページの並び順っぽい。
後から並び順変えたくなったり、途中にページを追加したりしたとき、既存のページとインデックスの数字の対応が変わっちゃうんですが、その度にコード書き換えるのやだな…って思いますよね…
対処としてはPages()の中身は変数にしておいて、変数の中身はタブページの名称からページインデックスを照会してあてはめる。とかで対処できるのかとは思いますが、試してないのでできるかどうかはわかりません(※追記参照)。
追記
やり方わかりました。
Me![タブコントロールの名前].Pages("ページ1").Visible = True
Me![タブコントロールの名前].Pages("ページ2").Visible = False
先ほどの例でページインデックスを書いてたところに、ページの名前をダブルクォートで囲って記述すればOKのようです。
注意事項として、ページインデックス0のページの名前のデフォルトが「ページ1」、ページインデックス1のページが「ページ2」なんで一瞬お?ってなったんですけど、いい子のみなさんは適切に命名しましょうね。
以上、お粗末様でした。誰かの役に立つといいんですけどね。