#026 ウィザード風の画面を作るには? フォーム、VBA

Accessではいろいろな場面でウィザードが活躍してくれますが、ここではウィザード風の画面、つまり、1つの画面である設定をし、[次へ]ボタンのクリックによって次々と別の設定画面が表示されていき、最後の画面で[OK]ボタンをクリックするとそのウィザードの処理が実行される、というフォームの作り方のポイントを説明します。

このウィザード画面を作るための方法としては次の2つが考えられます。
  1. 1つのフォームにすべてのページの画面をデザインする方法
  2. 1つのメインフォームと各ページごとのサブフォームから構成する方法
2の方法は、1つの1つのページのデザインが単独でできるのでフォームデザインの作成は容易なのですが、全体を通して何かの変数の共有するような場合にはコーディングがやや面倒な気がします。一方、1の方法はフォームが縦長になりコントロールの位置合わせなどにやや手間がかかりますが、モジュールのコードの面から考えると、1つにまとめて記述できるのでウィザード全体の見通しがよくなりデバッグ等もやりやすいと思います。ここではこの1の方法について説明したいと思います。


作成のポイントウィザード風画面のフォームデザイン
  • 単票フォームを作り、[スクロールバー]・[レコードセレクタ]・[移動ボタン]の各プロパティを"なし"または"いいえ"に設定します。

  • ページごとの区切りとなる位置に「改ページ」コントロールを挿入します。これはページの数に応じて複数ケ挿入します。この際、最後のページの下には改ページコントロールは必要なさそうですが、ここにも1つ挿入しておくと、実行した時にページごとに微妙にコントロールがずれてしまうのを防ぐことができます。また、高さ方向の間隔は画面デザインによって最終的には変わると思いますが、すべて同じ間隔にします。

  • 「フォームフッタ」を表示して、そこに[戻る]や[次へ]、[完了]などのボタンを配置します。この際、最初のページには[戻る]は必要ないので[使用可能]プロパティを"いいえ"にします。同じく[完了]も最初のページでクリックされては困るので[使用可能]プロパティを"いいえ"にします。

  • モジュールウィンドウを開いて、"Declarations"セクションにページ番号をカウントするための変数を宣言します。フォームを開いた直後は先頭ページですので、フォームの[読み込み時]イベントでこれを "1" に設定しておきます。

  • [次へ]ボタンの[クリック時]イベントでは、ページ番号カウント変数を +1 した上で、DoCmd.GoToPage によってフォーム上のページを移動させます。

  • 逆に[戻る]ボタンの[クリック時]イベントでは、ページ番号カウント変数を -1 した上で、DoCmd.GoToPage によってフォーム上のページを移動させます。

  • ページ番号が 2 以上なら[戻る]ボタンを使用可能にします。逆にページ番号が 1 なら[戻る]ボタンを使用不可にします。

  • ページ番号が最終ページなら[完了]ボタンを使用可能にし、[次へ]ボタンを使用不可にします。そしてそれ以外のページでは2つのボタンの使用可否を反対にします。
以上で基本的なページ移動の動作を行うことができます。実際には、ページごとに入力された値をチェックしたり、前のページでの入力や選択値に応じて次のページの内容を変えたりといったことが必要になると思いますので、次のコードを参考にアレンジしてみて下さい。
Private pintPageNum As Integer  'ページ番号のカウント
Private Const pcintPageMax As Integer = 4  '総ページ数

Private Sub Form_Load()
  'ページ番号を初期化
  pintPageNum = 1
End Sub

Private Sub 完了_Click()
  MsgBox "ここで完了の処理を実行します!"
End Sub

Private Sub 次へ_Click()
  'ページ番号をインクリメント
  pintPageNum = pintPageNum + 1
  'ページを移動
  DoCmd.GoToPage pintPageNum
  '各ボタンの使用可否を切り替え
  If pintPageNum > 1 Then
    Me!戻る.Enabled = True
  End If
  If pintPageNum = pcintPageMax Then
    Me!完了.Enabled = True
    Me!完了.SetFocus
    Me!次へ.Enabled = False
  End If
End Sub

Private Sub 戻る_Click()
  'ページ番号をデクリメント
  pintPageNum = pintPageNum - 1
  'ページを移動
  DoCmd.GoToPage pintPageNum
  '各ボタンの使用可否を切り替え
  If pintPageNum < pcintPageMax Then
    Me!次へ.Enabled = True
  End If
  If pintPageNum = 1 Then
    Me!次へ.SetFocus
    Me!戻る.Enabled = False
  End If
End Sub
| Index | Prev | Next |



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