- ベストアンサー
ACCESS.ルックアップの値以外を受け付けないようにしたい。
ACCESS2007を使用しています。 テーブルのフィールド設定でルックアップを設定しています。 表示コントロール:コンボボックス 値集合タイプ:値リスト ここで、値集合ソースにリストしたもの以外はテーブルに格納されないように したいのですが、可能でしょうか? 「入力チェック」を「YES」にしているのですが、 この場合でもテーブルでの直接入力やフォームを使用しての入力ではエラーがでますが、 Excelからの複数セルまとめてのコピー&貼り付けを行うと貼り付けられてしまいます。 解決する方法がありましたら教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です やはりデータの持ち方が変わってしまいますが、 元テーブルのフィールド「ID」を数値型(整数)にします。 ルックアップで、値集合ソース部分にクエリを記述します。 例えば、 SELECT ID, データ FROM T_フィールドリスト WHERE タイプ="住所"; 連結列: 1 列数: 2 列幅: 0cm;1cm (ID 部を非表示に) 入力チェック: はい これで、タイプ="住所" で抽出されたものがリスト表示されます。 > 確かに貼り付けた時にエラーが出ましたが、なぜか1セル目だけは貼り付けられてしまいます。 > これはどうにもならないのでしょうか? これについて、確認できませんでした。 確認の仕方が悪かったのでしょうか。(以下が確認した手順です) 確認用テーブルのフィールド an、ID、src an: オートナンバー ID: 数値型(整数)- T_フィールドリストのIDと同じ型 上記内容でルックアップ設定 src: テキスト型 貼り付け用データをメモ帳で準備 東京 A 北海道 B 千葉 C 青森 D 神奈川 E 鹿児島 F データの空白部分は Tab で、1行目は、(Tab)東京(Tab)A となっています。 この6行をコピーし、確認用テーブルを開いて、新規部分の「*」をクリック後貼り付け。 東京、千葉、神奈川は、追加されましたが、北海道、青森、鹿児島は、貼り付けエラーテーブルへ。 フィールド0 フィールド1 フィールド2 北海道 B 青森 D 鹿児島 F 確認用テーブルには、以下内容で追加されてました。 an ID src 37 東京 A 39 千葉 C 41 神奈川 E ここで、データの持ち方を元に近くします。 確認用テーブルの ID をテキスト型に変更し、ルックアップの連結列を2に変更します。 (選択した文字列そのものが格納されるように) 貼り付け用データ6行をコピーし、同様に貼り付けます。 すると、エラーもなく6行すべてを追加することができました。 an ID src 43 東京 A 44 北海道 B 45 千葉 C 46 青森 D 47 神奈川 E 48 鹿児島 F やはり、元テーブルの ID の型をテキスト型から変更する必要があるような気がします。 普通の入力操作を行う分には、リスト以外はエラーとなってました。 Excelからの貼りつけでも同じでした。 (貼り付け用データ6行をExcelに貼り付け後、同じ領域をコピー、そしてテーブルへ貼り付け) 貼り付けエラーテーブルのフィールド名は、F1 ~ F3 に変わりましたが。
その他の回答 (2)
- 30246kiku
- ベストアンサー率73% (370/504)
#2です テーブルに直に張り付ける方法ではなくなりますが、どうでしょうか。 確認用テーブルのフィールド an、ID、src an: オートナンバー ID: テキスト型- T_フィールドリストのデータと同じ 下記内容でルックアップ設定 src: テキスト型 IDのルックアップ設定 SELECT データ FROM T_フィールドリスト WHERE タイプ="住所"; 連結列: 1 列数: 1 列幅: 1cm 入力チェック: はい このテーブルを元に、フォームウィザードで帳票形式として作成します。 (全フィールドを表示するように) 出来上がったらデザインで既定のビューをデータシートに変更します。 フォームの更新前処理に以下を記述します Private Sub Form_BeforeUpdate(Cancel As Integer) If (IsNull(DLookup("データ", "T_フィールドリスト", "タイプ='住所' AND データ='" & Nz(Me.ID,"") & "'"))) Then Cancel = True Me.Undo End If End Sub 本来の入力操作であれば不要な処理になりますが、貼り付けられた場合にはこの方法しかないように思います。 更新前で、ID に設定された文字列があるか/ないか、を毎回チェックします。 貼り付けた時(まとめて)には、コンボボックス「ID」のリスト外入力時は動かないようです。 また、If 部分で Me.ID.ListIndex = -1 (選択されていなければ)の判別してみましたが、 貼り付け後は常に 0 になっていて、判別には使えないようです。 (初めのデータが一番上の「東京」だったから?) (2行目からやると -1, 2, 以降 2) 設定後は、保存して、再度起動すればデータシート形式で表示されるので、 従来との違和感はなさそうですが・・・ #2でのエラー切り分けはできていましたし、貼り付けエラーテーブルもできていました。 (6行を貼り付ける操作した時のことになります) また、フォームの更新前処理ではなくて、「ID」の更新前処理に記述しても同じ動きをしました。 Private Sub ID_BeforeUpdate(Cancel As Integer) If (IsNull(DLookup("データ", "T_フィールドリスト", "タイプ='住所' AND データ='" & Nz(Me.ID,"") & "'"))) Then Cancel = True Me.ID.Undo End If End Sub どちらかで一方で判別処理するようにします。 (フォームの更新前処理の方がイメージしやすいです) (IDの方では、ID自体はUndoするのに、ID以外で更新に行くのかと思ったら行かなかった??) 後は、わかりません。失礼しました。
お礼
重ねての回答ありがとうございます。 また、いろいろと検討していただき感謝します。 ただ、当DBは近い将来に別の人(Access初心者)に引き継ぐ予定があり、 ここまで高度になってしまうと管理面で操作面でも少し厳しくなってきますので、 前回教えていただいたところまでで我慢をしようかと思います。 私、個人としては大変に勉強になりました。 ありがとうございました。
- 30246kiku
- ベストアンサー率73% (370/504)
フィールド名を「src」 値リストの内容が "○";"△" と仮定した時、まとめて貼り付ける時、"□" も入ってしまいますね。 データの持ち方を変えても、いいでしょうか。 (ダメならスルーということで) "○";"△" を管理するテーブルを作ります。仮にテーブル名を「T図形」とします。 フィールド名を、「src_id」「内容」とします。 src_id:整数型(主キー) サンプル src_id 内容 1 ○ 2 △ 元のテーブルの「src」を整数型に、名前を「src_id」に変更します。 「src_id」のルックアップで、 値集合タイプ: テーブル/クエリ 値集合ソース: T図形 連結列: 1 列数: 2 列幅: 0cm;1cm (src_id 部を非表示に) 入力チェック: はい この変更を行うと、元のテーブルには文字列ではなく、src_id の値が格納されます。 なので、クエリ等で "○";"△" を表示する時には常に「T図形」と結び付けて、という処理が必要になります。 この構成にすると、貼り付けてもエラーになってくれるようです。 確かめられる時には、試し用のもので、、、
お礼
お礼が遅くなりました。 回答ありがとうございます。 できることならデータの持ち方は変えたくないのですが、 変えてできるのであればと思い、試してみました。 確かに貼り付けた時にエラーが出ましたが、なぜか1セル目だけは貼り付けられてしまいます。 これはどうにもならないのでしょうか? また、T図形に該当するテーブルですが、実はもともと似たようなテーブルがあり、 ただ、1つのテーブルに複数のフィールド用の項目がまとまっています。 (サンプル)T_フィールドリスト ID タイプ データ 1 住所 東京 2 住所 神奈川 3 住所 千葉 4 性別 男 5 性別 女 6 年代 19歳以下 7 年代 20代 8 年代 30代 このテーブルを使うことは無理でしょうか? 例えば住所フィールドにはT_フィールドリストの「タイプ=住所」に該当するものといった感じです。 今回、ドロップダウンリストで制限したいフィールドが10個近くあり、その数だけテーブルを増やすと 管理が煩雑になるため、できればこのテーブルを活用できないかと思います。 再度の質問になってしまいお手数をおかけしますが、もし分かるようでしたら教えてください。
お礼
再度の回答ありがとうございます。 後半の検証内容は、私の方でも新しくDBを作成してやってみたところ、同様の結果が出ました。 他の多くのクエリにも影響があることもあり、データはやはり実データで保持しておきたいので、 連結列=2でやりたいと思っています。 (であれば、Select文での抽出項目を1つにして、連結列も列数も1にした方がいいですか?) もし、保持するデータをそのままで制限する方法がありましたら、またご教授ください。 また、前半のクエリでリストを絞る方法は大変に勉強になりました。 今まで、リストに変更がある場合は、値集合ソースとテーブル(T_フィールドリスト)の データの両方を修正する必要があったため、これが統一できるのは助かります。