• ベストアンサー

アクセスで、対話式?の入力フォーム

こんにちは この度、エクセルで作成していたとある管理表を アクセスでつくることになりました アクセス初心者です。。 上司のリクエストが 入力フォームで項目が一覧に並んでいるのではなく、 質問項目が 1つあるいは数個画面に表示され クリック、または入力をして 決定ボタンを押すと 次の質問項目(新規画面)に進んでいくという形をとりたいそうです 例えば 画面に  「色は何色ですか?」 [赤][青] [決定] とあり、 赤を押して選択し、 決定ボタンを押すと 次の質問 「種類はなんですか」 [食べ物][乗り物] [決定] と画面が切り替わり、 それぞれ 管理テーブルの 色フィールドに「赤」と入力 種類フィールドに「食べ物」等と入力されるような感じです。 (意味が伝わるでしょうか。。?) どこか参考サイトでもあれば 教えていただけますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

No.2です。 まず、前回の補足から。 タブコントロールの『タブストップ』が「はい」だと、タブコントロールにフォーカスが ある状態で左右のカーソルキー(矢印キー)を押すことでページの切替ができて しまうので、『タブストップ』(プロパティシートの「その他」タブにあり)は「いいえ」に しておいてください。 > やっぱりついつい 次へを押してしまいます。。 【1・とにかくエラーメッセージだけを回避する方法:前回のbに相当】  とりあえず、プログラムが最も簡単なのは、エラー処理を追加することにより  表示されるメッセージを変えてしまうことかと思います。  (前回の「b」では、先頭/末尾を判定するプログラムを組むことを想定して、   「クリックしても代入しない」としましたが、それよりはこちら(=「代入がエラー   になったときのメッセージを差し替える」)の方が楽でしたので、こちらに変更) ※VBAではなくマクロを使用している場合は、この方法は採用できません。 Private Sub 次へ_Click() 'エラーが発生した場合は、エラー処理に飛ばします On Error GoTo エラー処理   入力タブ = 入力タブ + 1 終了処理:   Exit Sub エラー処理:   Select Case Err     Case -2147352567       '最後のページで「次へ」を押したときのエラーメッセージを差し替え       '(移動しないだけでOKでメッセージが不要なら、下の一行は削除)       MsgBox "このページが最後です。", , "確認"     Case Else       '上記以外のエラーの場合は、Access組込のエラーメッセージを表示       MsgBox Err & ":" & Error$, , Me.Name & " 次へ"   End Select   Resume 終了処理 End Sub 【押させたくないボタンを使用不可にする:前回のaに相当】  こちらは、コントロールの構成(名前や、値要求の有無など)によってケース  バイケースのため、かなり複雑になります。  (前回、a/bの選択肢だけ提示してコードに踏み込まなかったのはそのため) ※『戻る/次へ』だけならもっと簡単にはなるのですが、テキストボックス群への   入力有無で同様に使用可否を切り替えないのは、さすがに統一感にかける   ということで・・・(汗) 以下のサンプルは、下記の構成を想定しています。 ご自分のMDBに組み込む前に、同じ構成のサンプルを作成してから動作を 確認すると、わかりやすいかと思います。 (ちなみに、以下のサンプルは、私自身も試行錯誤で作成しました):  タブコントロール:   ・入力タブ  ページ:   ・姓名(ページインデックス=0)     テキストボックス: 姓(必須)、名(必須)   ・住所(同=1)     テキストボックス: 都道府県(必須)、区市町村(任意)   ・連絡先(同=2)      テキストボックス: 携帯、メール(どちらか一方必須)  コマンドボタン:   戻る、次へ、キャンセル、完了 まず、『戻る/次へ』の「クリック時」イベントの他、フォームの「開くとき」イベントや 各テキストボックスの「更新後」で共通して使用するサブを用意します。 Private Sub ConfirmValue(AddValue As Integer) On Error GoTo エラー処理   Dim NameCheck As Boolean, AddrCheck As Boolean, ContCheck As Boolean   Dim EnbRtn As Boolean, EnbNxt As Boolean, EnbCmp As Boolean   'ページを切替(『戻る/次へ』以外からの場合は「AddValue=0」とするので変化なし)   入力タブ = 入力タブ + AddValue      '各ページの値要求に対する入力有無の確認   '(わかりやすさ優先で、評価法は「IsNull(~)=False」の羅列で統一)   NameCheck = (IsNull(姓) = False And IsNull(名) = False)     '姓名の有無   AddrCheck = (IsNull(都道府県) = False)                '住所の有無   ContCheck = (IsNull(携帯) = False Or IsNull(メール) = False)   '連絡先の有無      '切替後のページ毎の処理(EnabledをFalseにする場合、別のコントロールに   '移動しておかないとエラーが発生します)   Select Case 入力タブ     Case 0    '姓名ページ       'ページ切替時は、(念のために)フォーカスを移動       If AddValue Then 姓.SetFocus       'コマンドボタンの使用可否を変数に記録       EnbRtn = False       '『戻る』は常に不可(先頭ページなので)       EnbNxt = NameCheck   '『次へ』は姓名の入力有無で切替     Case 1    '住所ページ       If AddValue Then 都道府県.SetFocus       EnbRtn = True        '『戻る』は常に可       EnbNxt = AddrCheck    '『次へ』は住所の入力有無で切替     Case 2    '連絡先ページ       If AddValue Then 携帯.SetFocus       EnbRtn = True        '『戻る』は常に可       EnbNxt = False       '『次へ』は常に不可(末尾ページなので)   End Select      '値要求ありのもの全てが入力済みの場合は、『完了』ボタン使用可   EnbCmp = (NameCheck And AddrCheck And ContCheck)      'コマンドボタン群の使用可否を切替   戻る.Enabled = EnbRtn   次へ.Enabled = EnbNxt   完了.Enabled = EnbCmp 終了処理:   Exit Sub エラー処理:   MsgBox Err & ":" & Error$, , Me.Name & " ConfirmValue": Resume 終了処理 End Sub 上記のようなコードさえ用意してしまえれば、『戻る/次へ』のクリック時イベントは 以下のように簡素化できます: Private Sub 次へ_Click()   Call ConfirmValue(1)    'ページインデックスを1増加 End Sub Private Sub 次へ_Click()   Call ConfirmValue(-1)    'ページインデックスを1減少 End Sub また、フォームの「開くとき」、及び値要求がある各テキストボックスの「更新後」イベント も同様にします: Private Sub Form_Open(Cancel As Integer)   Call ConfirmValue(0)    'ページ切替不要なので引数には「0」を指定 End Sub Private Sub 姓_AfterUpdate()   Call ConfirmValue(0)    'ページ切替不要なので引数には「0」を指定 End Sub ・・・以上です。 この辺りは、地道な試行錯誤をするしかないと思いますので、大変だとは 思いますが、がんばってみてください。 (最初のうちは前者(前回b)の方で逃げておいて、時間が取れたところでゆっくり後者  に取り組む、とした方がいいかもしれません)

kuragemama
質問者

お礼

お礼遅くなってしまってすいません ばっちりできました!! 本当に感謝しています。 私の質問にお時間をとっていただき、 とても丁寧なご回答本当にありがとうございました!!!!

その他の回答 (2)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

ちょっと回答が遅すぎたかもしれませんが・・・(汗) ソフトのインストールや、Accessのコントロールウィザードのようなものが 作りたい、ということでよろしいでしょうか。 そうでしたら、画面の切替方法として「タブコントロール」を使用するのが 簡単かと思います。 概要としては以下の通り:  ・タブコントロールを設置し、そこに必要な画面数だけのページを追加  ・各ページに、質問を表示するラベルと、回答欄となるテキストボックス   などを追加(非連結コントロールにしておきます)  ・ページの外に、「決定」(または「戻る」と「次へ」)、「キャンセル」「完了」   のボタンを追加  ・「完了」ボタンでは、追加クエリなどを使用して、各回答をテーブルに   記録するマクロ(または)VBAを設定  ・「決定」(または「戻る」と「次へ」)に、ページを移動するマクロ(または   VBA)を設定  ・【デザイン上重要】フォームの構築が終わったら、タブコントロールの   プロパティシートの「書式」タブで、「スタイル」を「なし」に設定   (これにより、クリックによるタブページの移動ができなくなります) ※タブコントロールは、その中に(複数の)ページを別に持ちます。   (「オプショングループとオプションボタン」と同じような関係)   なので、プロパティシートを確認する際は、現在選んでいるのがタブ   コントロールなのかページなのかに注意する必要があります。   (右上の余白(?)部分のクリックで、タブコントロール自体を選択可能) ページの移動は、タブコントロールへの値代入で行えます。 例えば、フォーム名が「フォーム1」、タブコントロール名が「タブ0」の場合、 「Forms!フォーム1!タブ0 = Forms!フォーム1!タブ0 + 1」で、次のページ (正確には現在のページから、ページインデックスが+1のページ)に移動 できます。 ※ページインデックスは、各ページのプロパティシートの「書式」タブで   確認できます。 ※そのタブコントロールにないページインデックスを入力するとエラーに   なるので、    a)先頭/末尾のページに移動したらコマンドボタンを使用不可にするか、    b)先頭/末尾のページで「戻る/次へ」をクリックしても代入しない、   といった制御も考える必要があります。

kuragemama
質問者

お礼

ありがとうございます。 今、ひとつひとつ別ウィンドウで開くフォームを作っていたのですが 質問が50個ぐらいあったのでうーん。。と考え込んでいたところでした! これだと、望みどおりな形ができます! 本当にありがとうございますm(__)m >  a)先頭/末尾のページに移動したらコマンドボタンを使用不可にするか、 >  b)先頭/末尾のページで「戻る/次へ」をクリックしても代入しない、 こちらを、よろしければ、教えて欲しいです。 やっぱりついつい 次へを押してしまいます。。

  • okky0707
  • ベストアンサー率22% (34/154)
回答No.1

 私が良く使う方法は、 まず、通常のフォームをデザインし、 最初に表示しておきたいフィールド以外の書式プロパティで可視の項目を「いいえ」にしておく。  最初に表示したフィールド(通常はテキストボックスになってるはず) を右クリックでコントロール種類の変更をしてコンボボックスにする。 コンボボックスのプロパティで値集合タイプを「値リスト」にして 値集合ソースに「青;赤」と入力する。  コンボボックスのイベントプロパティで 「更新後」欄をクリックすると欄外に「…」が表示されるのでそれをクリックしコードビルダを起動する。  コードビルダのウインドウが立ち上がったら Me![次に表示したいフィールドの名前].Visible = True と入力してコードビルダを閉じる。  これを繰り返すことにより、ひとつのフォームの中で質問に答えるにしたがって 次々に新たな入力フィールドが現れるので、質問者さんの上司のリクエストに応えられると思います。  もし、どうしても次々に別ウインドウが立ち上がるようにしたいなら、 ちょっと長い説明になるので勘弁してください。  初心者の方には下記サイトを参考にされることを薦めます。

参考URL:
http://www.mahoutsukaino.com/
kuragemama
質問者

お礼

お礼が遅くなってしまってすいません ご回答ありがとうございます こういう方法もあるんですね! 目からうろこです! 今回は視覚的な問題でこの方法は使えませんが これからいろいろと活躍してくれそうです 貴重な情報ほんとにありがとうございました!

関連するQ&A