- ベストアンサー
入力した値をコンボボックスにすぐに反映させる方法
テーブルでコンボボックスから選んでデータを入力したい場合、コンボボックスの内容を他のテーブルやクエリあるいは値リストから抽出する方法はわかりますが、コンボボックスの内容に該当するものが無い場合、一覧から選ばずに、手入力することにしたいと思っています。そこで、手入力した後次のレコードに移動した時にコンボボックスの内容に手入力した内容がすぐに反映するようにしたいのですが、うまい方法は無いでしょうか?私としてはいちいち他のテーブルを開いて入力したりせずにしたいのですが・・・
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
同じテーブルからリストを取得する為には、一度レコードを保存する以外ないようです。そのため今まで設定した「データ入力のチェック」を"いいえ"に戻し、「リスト外入力時」のボックスから"[イベントプロジージャ]"の文字を消したうえで、「更新後処理」に設定したモジュールの中身を下記のように置き換えます。 ' レコードを保存し、コンボボックスのリストを再作成します。 DoCmd.RunCommand acCmdSaveRecord Me![(コンボボックス名)].Requery (*)例によって同じフォーム内に、同じテーブル(クエリー)からリストを作っているコンボボックスがあるなら、その分も上記とまったく同じ構文で行を作成します。 あまり綺麗な方法ではないですが、これが一番現実的な方法のようです。
その他の回答 (4)
- Sarukan
- ベストアンサー率55% (41/74)
回答が何回にも分かれてしまってすみません。 たしかにクエリーを元にしている場合など、おっしゃる通りの手順を踏まないとリストが更新されないみたいですね。 コンボボックスのプロパティを開き、「更新後処理」から開いたモジュール作成画面で、"Private Sub~"の行と"End Sub"の行の間に、 Me![(コンボボックス名)].Requery という行を作成してみてください。 同じフォーム内に、同じテーブル(クエリー)からリストを作っているコンボボックスがあるなら、その分も上記とまったく同じ構文で行を作成してみてください。 これで、おそらくコンボボックス更新後にすぐ反映されます。
補足
すみません。そもそもフォームプロパティの入力チェックの項目を「はい」に変更する操作を行っていませんでした。結果問題なく動作しました。ありがとうございました。ところで、この方法はコンボボックスの値の取得元(例えばテーブルB)がフォームを作成する元になったもの(例えばテーブルA)と別な場合にうまくいきますが、私がやりたい方法としてはコンボボックスの値の取得元が同じテーブルAである場合です。もちろんそのまま取得すると様々な重複した値がそのままコンボボックスの内容になりしますので、重複したデータを自動的に1個にするクエリAを作成して(これは問題なくできました)そのクエリAをコンボボックスの値の取得元にしてみましたが、次のレコードへ移動する前にエラーが表示され、モジュール文の.AddNewのところでとまってしまうようです。そこでフォームプロパティの入力チェックの項目を「いいえ」に変更したところ、次のレコードへ移動しましたが、“更新”に匹敵する操作を行わない限りコンボボックスの値に反映されませんでした。いろいろと文句ばかり言うようで、もうしわけありませんが、上記の内容を解消できる術がありましたらご教示ください。
- Sarukan
- ベストアンサー率55% (41/74)
再検証してみたのですが、先に紹介したモジュールではやはりフォームでの入力直後にリスト追加されるようですけれど、お使いの環境ではうまくいっていないのでしょうか? もう一度確認してみてください。 それと、下記のモジュールに一点修正個所があります。 「.Update」の行と「End With」の行の間に一行、 .Close というrecordset終了行が抜けていました。下記のモジュールをコピーしていた場合、追加しておいてください(なくても動作上不具合はないようですが)。 モジュールに抜けている行があり、すみませんでした。
補足
フォームプロパティの入力チェックの項目を「はい」に変更する操作を行っていませんでした。結果問題なく動作しました。ありがとうございました。ところで、この方法はコンボボックスの値の取得元(例えばテーブルB)がフォームを作成する元になったもの(例えばテーブルA)と別な場合にうまくいきますが、私がやりたい方法としてはコンボボックスの値の取得元が同じテーブルAである場合です。もちろんそのまま取得すると様々な重複した値がそのままコンボボックスの内容になりしますので、重複したデータを自動的に1個にするクエリAを作成して(これは問題なくできました)そのクエリAをコンボボックスの値の取得元にしてみましたが、次のレコードへ移動する前にモジュール文の.AddNewのところでとまってしまうようです。そこでフォームプロパティの入力チェックの項目を「いいえ」に変更したところ、次のレコードへ移動しましたが、“更新”に匹敵する操作を行わない限りコンボボックスの値に反映されませんでした。いろいろと文句ばかり言うようで、もうしわけありませんが、上記の内容を解消できる術がありましたらご教示ください。
- Sarukan
- ベストアンサー率55% (41/74)
Ms Accessではテーブル(クエリー)を元にしたコンボボックスコントロールへリスト外入力を行う事があり、なおかつそれをリストに加えたいという場合、フォームを使用します。 そのため、まずは「コンボボックスから選んでデータを入力したい」テーブルに関連付けたフォームを作成します。いろいろとフォームには作成手順があるのですが、今回のご質問のケースの場合、テーブルに直接入力する事を考えられていたわけですからウィザードを使用して「データシート」で作成してもいいと思います。 次に作成したフォームをデザイン画面(編集画面)で開き、目的のコンボボックスを右クリックして「プロパティ」を開きます。そして開いたダイアログの表示を「イベント」のページに切り替え、ストの中の「リスト外入力時」を選択し、右側に現れた「…」ボタンを押します。するともう一枚ダイアログが表示されると思いますのでその中から「コードビルダ」を選択してください。これで、モジュール作成画面が開くはずです。 そして、画面が切り替わり、モジュール作成画面んが開いたら、"Private Sub~"の行と"End Sub"の行の間に、下記のサンプルを貼り付けてみてください。 ただし、これはあくまでサンプルですので、このままでは動きません。 (テーブル名)の部分はリストのもとになっているテーブル名へ、 (フィールド名)の部分はそのテーブル内のリストが格納されているフィールド名へ、 それぞれ変更してください。 それが終了したらモジュールを保存して作成画面を閉じ、フォームのデザイン画面でまだ開いているはずのコンボボックスのプロパティのページを「データ」に切り替え「入力チェック」の項目を「はい」に切り替えてフォームを保存するだけです。 下記のモジュールの動作確認は済んでいますのでおそらくそれでご希望の機能が動くと思います。 --- Response = acDataErrAdded Dim rst As Recordset Dim mydb As Database Dim crnttbl As String '現在のリスト一覧をテーブル(クエリー)から取得します。 Set mydb = CurrentDb crnttbl = "(テーブル名)" Set rst = mydb.OpenRecordset(crnttbl) 'リストに新規レコードを入力し、取得元テーブルを更新します。 With rst .AddNew ![(フィールド名)] = NewData .Update End With
補足
細かな所まで説明して頂いて非常に助かりました。実際に試してみましたが、データシートビューのフォームではツールメニューの”レコード”→”更新”を実行して新しい値がコンボボックスに反映されるようです。欲をいって申し訳ありませんが、別のフィールド(レコード)へ移動したらすぐに反映されるようにしたいのですが、無理でしょうか。
- Sarukan
- ベストアンサー率55% (41/74)
アプリケーションは何を使用されているのでしょうか?(名前とバージョンを教えてください) アプリケーションによってやり方が変わりますのでそのあたりを教えて頂けないと皆さん回答に困られると思いますよ。
補足
質問内容が不十分でした。ACCESS2000を使用しています。宜しくお願い致します。
お礼
試してみたところうまくいきました!大変ありがとうございました。(お礼が遅れてしまいすみませんでした。)