皆さまはAccessの「ナビゲーションフォーム」を使用したことはありますでしょうか?
「ナビゲーションフォーム」とは「ナビゲーションコントロール」が使用されたフォームを指し、「ナビゲーションコントロール」は、Accessの各コントロールのなかでも割と新しく用意されたコントロールです。
今回はその「ナビゲーションフォーム」の簡単な作り方を紹介しつつ、初めてナビゲーションコントロールを触る場合にハマると思われる「指定したナビゲーションタブをVBAで開く方法」と「ナビゲーションフォームからサブフォーム内のオブジェクトをVBAで参照する方法」も紹介しておきます。
ナビゲーションフォームの簡単な作成手順の紹介
当項では、初めてナビゲーションフォームを作成する人に向けて、簡単な作成手順を紹介していきます。
尚、当記事で使用しているAccessのバージョンは「Access 2010」です。
今回紹介するナビゲーションフォームの機能や仕様に関しては最新のAccessとそれほど違いは無いはずなので、新しい環境のAccessを使用されている場合でも参考にして頂けるかと思います。
Accessの上部メニューの「作成」タブから新規ナビゲーションフォームを作成
Accessの画面上部のメニュー内の「作成」タブにナビゲーションフォームを作成する項目があります。
この項目の「ナビゲーション」右側の小さい三角をクリックすると作成するナビゲーションフォームのレイアウトを選択できます。
今回は最も標準的な「水平タブ」を選択します。
「ナビゲーションタブ」を作成する
新しいナビゲーションフォームが作成できました。
まずは「ナビゲーションタブ」を作成していきます。
以下の画面の「新規追加」をクリックすると、タブに表示する名称が入力ができます。
その入力した文字を確定すると新しいタブが追加され、「新規追加」タブの位置が右に移ります。
それを繰り返し、必要な数のナビゲーションタブを作成していきます。
新規フォームを作成しナビゲーションタブと紐付ける
今回はナビゲーションタブを上項の画像でもわかるように三つ作成しました。
「ナビゲーションコントロール」では、タブの一つ一つにそれぞれサブフォームを割り当てて、そのタブを選択すると、そのタブに紐付けられたサブフォームが読み込まれ、ナビゲーションコントロール内のサブフォーム用の枠内で表示されます。
タブコントロール内の各タブで読み込むデータなどは、現在そのタブを選択しているか未選択かに関わらず、タブコントロール全体でまとめて読み込まれます。
要はそのタブを開いていなくても、別のタブではその情報を保持している状態です。
その為、例えば各タブ内で扱うデータが多ければ、そのタブコントロールが配置されているフォーム自体の読み込み速度も遅くなり、レスポンスの低下が起こり得ます。
今回の「ナビゲーションコントロール」の場合、各タブ内の情報は個別のサブフォームに配置され、そのタブを選択して開いた時点でそのサブフォームも初めて読み込まれます。
よって、ナビゲーションコントロールを配置するフォーム自体を読み込むだけでは、現在選択していないナビゲーションタブ内のフォームは読み込まれず、無駄なデータ読み込みやメモリーなどのリソースの消費が発生しません。
その意味では従来のタブコントロールより軽快なアプリケーションを作成することができます。
今回は「ナビゲーションコントロール」を配置した親フォームにコマンドボタンを作成し、そのボタンを押下するとVBAで指定した「ナビゲーションタブ」が選択されるようにします。
「ナビゲーションタブ」の各タブ毎のプロパティを表示し「データ」タブ内の「移動先の名前」で、そのタブに紐付けるサブフォームの名称を指定することができます。
今回はタブ名「ナビタブ1」に「frm_sub_ナビタブ1用」、タブ名「ナビタブ2」に「frm_sub_ナビタブ2用」といった感じで紐付けを実施していきます。
この状態でいったんナビゲーションコントロールを配置したフォームをデザインビューではなく、通常の表示でフォームを開きます。
ナビゲーションタブを選択すると、表示しているサブフォームが切り替わるところまでは動くようになりました。
VBAで「ナビゲーションタブ」を選択状態にする方法
当初インターネットでこのやり方を検索しましたが、日本語サイトだといまいち情報が少なく、海外のページを読んでも、ナビゲーションコントロールを配置したメインフォーム名や、各ナビゲーションタブに紐付けたサブフォーム名、ナビゲーションコントロール自体のコントロール名やタブ個別のコントロール名やタブ配置枠としてのコントロール名といったように、色々存在するフォームやコントロールの名前のどれを使ってVBAの構文に当てはめるのかを分かりやすく解説や紹介している情報が見当たらず苦労しました。
当項では、VBAでどのコントロール名をどの様な構文で指定するのかを分かりやすく紹介します。
ナビゲーションタブ移動用コマンドボタンを配置
今回はナビゲーションフォームのサンプルでは、メインのフォームにコマンドボタンを配置し、そのボタンを押下するとナビゲーションタブが指定したタブに移動するといった処理を実装します。
ナビゲーションフォームで関連する各コントロールの種類と範囲
前項では、ナビゲーションコントロールで関連する様々なフォームやコントロールの名称が存在し、そのどれを使用するべきか分りづらいと記載しましたが、まずはナビゲーションコントロールに関連する各フォームやコントロールの種類や範囲をまとめてみましょう。
水色:ナビゲーションコントロールを配置するメインのフォーム名
ピンク色:各ナビゲーションタブに紐付けたサブフォーム名
オレンジ色:ナビゲーションコントロールのナビゲーションサブフォームコントロール名
緑色:ナビゲーションコントロールの移動コントロール名
赤色:ナビゲーションコントロールの移動ボタン(ナビゲーションタブ)コントロール名
コマンドボタン押下でタブを移動させるサンプルコード
当項ではVBAでナビゲーションタブを指定して選択する処理の解説とサンプルプログラムを紹介します。
■メインフォーム側に実装する場合
まず、ナビゲーションフォーム(メインフォーム)側からタブを選択する処理の構文は以下です。
今回のサンプルフォームに対してタブを選択する処理の実装サンプルは以下です。
DoCmd.BrowseTo acBrowseToForm, "frm_sub_ナビタブ3用", "frm_ナビゲーションフォーム.NavigationSubform"
■ナビゲーションサブフォーム側に実装する場合
メインフォーム側ではなく、各サブフォーム側で各タブを選択する場合の構文やサンプルプログラムも併せて紹介しておきます。
因みにサンプルのフォームでは以下の様にサブフォーム内にコマンドボタンを配置して、そのコマンドボタンのクリックイベントに処理を記述します。
DoCmd.BrowseTo acBrowseToForm, "frm_sub_ナビタブ1用"
メインフォームからナビゲーションコントロール内のサブフォームを参照する方法
当項ではナビゲーションフォーム(メインフォーム)からナビゲーションサブフォームコントロール内のサブフォームに配置しているテキストボックスなどのオブジェクトを参照する方法についても紹介しておきます。
一般的な親フォーム→子フォームの参照時の構文とは若干異なるので、こちらも最初は戸惑うかと思います。
メインフォームからナビゲーションサブフォーム内のオブジェクトを参照するサンプルコード
まず、構文としては以下になります。
サブフォーム内に「txt_参照先」という名前のテキストボックスを配置していると仮定し、そのテキストボックスの値をメインフォームから参照する場合の以下のプログラムになります。
Forms!frm_ナビゲーションフォーム!NavigationSubform.Form!txt_参照先.Value
最後に
今回は個人的に初めてナビゲーションフォームを使ってみて、使い方がわからずに困惑したので記事にしてみました。
今回の記事が誰かの助けになれば幸いです。
今回も読んでいただきましてありがとうございました。