- ベストアンサー
リスト入力外の時の追加について
すみません、教えて下さい。 過去の質問を参考にして式を作ってみたのですが、うまくいきません。教えてください。 コンボのリストにない項目が発生した際に、次のイベントを起こして追加をしたいです。 (1)リストにない場合、メッセージを出して(「リストにないので追加をしてください」)追加用のフォームを開きすぐに利用できるようにしたい。 (2)リストにないものをすでに入力している場合、フォームを開く際にデフォルトとしてその文章が入力される。 (3)同様に、ダブルクリックした場合追加リストを表示してすぐにリストに反映させたい。 NotInListでイベントプロシージャーを登録しようとしてますが、どうしてもうまくいきません。 申し訳ありませんが、ご協力お願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
少し時間がとれたので、サンプルを作成してみました。 もしよろしければ、そちらでも作成して、参考にして下さい: 【テーブル】 1)ListA : ID(オートナンバー型・主キー)、Text(テキスト型) 2)TableA : Number(オートナンバー型・主キー)、Text(数値型・長整数)、Sentence(テキスト型) *「TableA」の「Text」には、「ListA」のIDが記録されます。 *「ListA・ID-TableA・Text」での一対多のリレーションシップを想定。 【クエリ】 1)MQ1_Add : INSERT INTO ListA ( [Text] ) SELECT [Forms]![PF1]![Text] AS [Text]; *新規クエリをデザインビューで開いた後、テーブルは追加せずに、メニューの「表示(V)」→ 「SQLビュー(Q)」をクリック。既定で表示される「Select;」を削除して上記SQL文を貼付。 【フォーム】 1)MF1 : レコードソース=TableA <設置コントロール> ・TableAの3つのフィールドは、フィールドリストからのドラッグ&ドロップで全て追加。 (「Number」「Text」「Sentence」) ・非連結コントロール・「新値」テキストボックスを追加 (非表示がベター:私は変数指定に慣れていないので、その代わりとして使っています) *「Text」テキストボックスは、メニューで「書式(O)」→「コントロールの種類の変更(H)」→ 「コンボボックス(C)」をクリックして、コンボボックスに変更後、以下のプロパティを設定: ・「書式」タブ : 列数=2、列幅=0cm;3cm ・「データ」タブ : 値集合ソース=ListA、連結列=1 (「入力チェック」の値は、自動的に「はい」になる) ・イベント : 「リスト外入力時」イベントのビルダ(「...」)で「コードビルダ」を選択し、以下を貼付 Private Sub Text_NotInList(NewData As String, Response As Integer) MsgBox "リストにないデータです。" & Chr(13) & "追加登録して下さい。" 新値 = NewData DoCmd.OpenForm "PF1", , "", "", acFormAdd, acDialog Response = acDataErrAdded End Sub 2)PF1 : レコードソース=なし(空欄) *フォームのイベントとして、「開く時」イベントのビルダで「コードビルダ」を選択し、以下を貼付: Private Sub Form_Open(Cancel As Integer) Text = Forms!MF1!新値 End Sub <設置コントロール> ・「ID」テキストボックス(非連結)、「Text」テキストボックス(非連結) ・「登録」コマンドボタン : 「クリック時」イベントのビルダで「コードビルダ」を選択し、以下を貼付 Private Sub 登録_Click() DoCmd.SetWarnings False DoCmd.OpenQuery "MQ1_Add" DoCmd.SetWarnings True DoCmd.Close , , acSaveNo End Sub サンプルは以上です。 「MF1」フォームを開いたら、「Text」コンボボックスに適当なデータを入力してみて下さい。 「PF1」フォームが開き、リスト外だったデータが「Text」テキストボックスに表示されます。 「登録」ボタンをクリックするとPF1が閉じ、「MF1」の「テキスト」コンボに値が正しく入力されます。 (つまり、ご質問の「(1)」と「(2)」に対応) *「MF1」で入力したのと違うデータを「PF1」で入力した場合は、「リストにありません」とメッセージが表示され、 コンボボックスのリストが展開されます。(登録したデータはリストに追加されています)
その他の回答 (1)
- O_cyan
- ベストアンサー率59% (745/1260)
>リストにない場合・・追加用のフォームを開きすぐに利用できるようにしたい。 これはコンボに表示するのは追加用のフォームでテーブルに入力したレコードということで良いのですよね。 追加用のフォームで入力しテーブルにレコードを保存し確定した状態にしなくてはダメです。そしてコンボボックスのリストをRequeryすれば反映出来ます。 例えば追加用のフォームにレコードの保存ボタンでも作り Dim ctlCombo As Control Set ctlCombo = Forms!フォーム名!コンボ名 ctlCombo.Requery 上記を追加してテーブルにレコードを保存後、コンボのリストを再クエリさせる。これでいけると思いますが。 >(2)リストにないものをすでに入力している場合・・ >(3)同様に、ダブルクリックした場合追加リスト・・ これはちょっと質問の意味が理解できないので・・。 取りあえずフォーム上のコンボボックスに再クエリをさせる記述を追加すれば対処できるはずです。
お礼
丁寧にありがとうございます! 解決いたしました。 今後ともよろしくお願いいたします。