• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Accessでチェックボックス選択でレコード追加)

Accessでチェックボックス選択でレコード追加

このQ&Aのポイント
  • Accessでチェックボックス選択を使ってレコードを追加する方法について教えてください。
  • AccessDBで複数の選手と試合データを結合してレコードを作るために、チェックボックス選択を利用したいです。
  • 野球のデータベースで、A選手からZ選手までの多数の選手を選択するために、Accessでチェックボックス選択を使用する方法を教えてください。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.6

#5です 基本的に、複数のレコードを1つのフォームで表示したい場合、 帳票フォームになると思います。 ただ、帳票フォームにしてしまうと、好き勝手な配置はできなくなります。 複数のレコードを好き勝手に配置したい・・・VBAの登場と思います。 とは言っても、使い方/処理限定で 少ない VBA 記述での実現になりますが、 ・「T試合」新規登録時のみ ・選手を追加したらフォームの手直しが必要 ・この用途以外にチェックボックスがない事 という条件を設けます。 フォームの作成) ・「T試合」を元に、フォームウィザードで単票フォームとして作成します。  プロパティで、「データ入力用」を「はい」とします。 ・「登録」ボタンを配置します。(以下 VBA 記述では「btn1」の名前にしていました) ・必要な分、チェックボックスを自由に配置します。 チェックボックスの「タグ」に、選手ID を設定し、ラベルに選手名を設定します。 処理として、「タグ」が設定してあるものを対象にしているので、 非表示/タグ設定なしのチェックボックスを配置しておけば、後の修正は楽かも。 また、チェックボックスの名前は何でもいいです。(名前はみていません) フォームの画面は以上です。 VBA の記述は以下になります。 Private Sub Form_Current()   Dim ctl As Control   For Each ctl In Me.Controls     With ctl       If (.ControlType = acCheckBox) Then         .Value = False       End If     End With   Next End Sub Private Sub Form_BeforeUpdate(Cancel As Integer)   Cancel = True   MsgBox "登録ボタンで確定", vbCritical End Sub Private Sub btn1_Click()   Dim sSql As String   Dim sS As String   Dim ctl As Control   If (Not Me.Dirty) Then Exit Sub ' 試合日など入力チェックをするのなら、この場所で '   sS = Me.BeforeUpdate   Me.BeforeUpdate = ""   Me.Dirty = False   Me.BeforeUpdate = sS   For Each ctl In Me.Controls     With ctl       If (.ControlType = acCheckBox And Len(.Tag) > 0) Then         If (.Value) Then           sSql = "INSERT INTO T出場(試合ID, 選手ID) VALUES (" _               & Me.試合ID & "," & .Tag & ");"           CurrentDb.Execute sSql         End If       End If     End With   Next   Me.Requery End Sub 新規登録時に、まずチェックボックスのチェックを外しておきます。 「登録」ボタンがクリックされた時に、チェックがあるものを探し出し、 レコードを追加します。 これで VBA の記述量は減りましたが、書きたくない・・・ ってなことなら、テーブルを見直します。 > <3>試合選手連結テーブル > に > 試合ID 0001 選手ID A > 試合ID 0001 選手ID B > 試合ID 0001 選手ID C > の3レコードができる。 この考え方はデータベースとして合っていると思います。 私の認識不足かもしれませんが、 VBAを使わずに好き勝手に配置するには、1レコード内に全ての情報が必要だと思います。 > 4)「T出場」 > an: オートナンバ 主キー > 試合ID: 数値型 「T試合」の試合IDと > 選手ID: 数値型 「T選手」の選手IDと が、 an: オートナンバ 主キー 試合ID: 数値型 「T試合」の試合IDと ck1: Yes/No型  ルックアップはチェックボックス ck2: Yes/No型 ck3: Yes/No型 ck4: Yes/No型 ・・・ ck120: Yes/No型 フィールドは250個位作れたと思います。 ck1 は A さん用、ck2 は B さん用 等、取り決めが必要になります。(データベースとして外れていく?) ※ 一意に特定できるフィールドが欲しかったので、オートナンバを入れてましたが、   上記では不要かも ただ、この後でやろうとしている事(処理)が、複雑になっていくような・・・ お勧めできるものではありません。 もし、この構成にしたとして、このテーブルを元に単票フォームを作ります。 (チェックボックスを自由に配置して、ラベル部分を割り当てる選手名に変更) (割り当てていないものは、不可視にでもしておきます) このフォームを、「T試合」を元にしたフォームのサブフォームとして組み込みます。 「試合ID」を、リンク親/子フィールドに設定することで メイン(親)フォームのレコード移動に連動して表示は切り替わってくれます。 選手を追加した場合は、ラベル部分を選手名に変更/可視化する修正が必要です。 ここまで、VBA 記述はありません。 細かい動きを処理しようとすると VBA がチョッと必要になります。 以下一例で、(サブフォーム内の処理として) 親の「試合ID」が設定されていなければ先行して編集状態にしない 「試合ID」が設定されていない・・・新規でしょ 新規でチェック出来たらおかしいよねって Private Sub Form_BeforeInsert(Cancel As Integer)   If (IsNull(Me.Parent.試合ID)) Then Cancel = True End Sub メイン/サブフォームの構成にすると、 メイン側を編集して、サブフォーム側をいじろうとすると メイン側のレコードは確定されたと思います。 逆に、サブ側を編集してメイン側をいじろうとすると サブ側のレコードは確定されたと思います。 登録ボタンは、無くても良さそうです。 フォームの構成はこんな感じになると思います。 ワーク用テーブルを使う手もありますが サブフォームで参照するのは「ワーク用テーブル」の方 フォーム起動時に、「T出場」から「ワーク用テーブル」に展開 フォームを閉じる時に、「ワーク用テーブル」から「T出場」に戻す ただ、この処理に #5 と同じ位 VBA 記述が必要になってきます。 なお、#5では、選手が120人以上にならない限り修正は不要です。 "ck1" ~ 選手を「よみ」順で割り当てていきますが、 チェックボックス自体の配置は自由にして構いません。 (#4で120個作成する時に、きれいに並べたかっただけなので) いろいろと裏を取ってください。 私の中での認識なので、嘘が混じってるかも。

qqandaa
質問者

お礼

30246kiku様 その後、ご回答を参考に作成中で、Accessの知識が不足していることもありまだ最終版ができていませんが、かなりヒントになりました。 あまりお待たせしても申し訳ないのでこれでクローズさせていただきます。 本当にご丁寧な回答ありがとうございました!

qqandaa
質問者

補足

30246kiku様 ご丁寧な回答ありがとうございます。 最低限の処理で > ・「T試合」を元に、フォームウィザードで単票フォームとして作成します。 >  プロパティで、「データ入力用」を「はい」とします。 > ・「登録」ボタンを配置します。(以下 VBA 記述では「btn1」の名前にしていました) > ・必要な分、チェックボックスを自由に配置します。 の作り方で、試験的にやってみました。 T出場 テーブルに、追加したいレコードが追加されるところまでは確認できました。 もろもろきれいにするには時間がかかるので、取り急ぎ報告させていただきます。 知識が不足しているのでもう少しいろいろ試してみます。 あまりに時間がかかるようでしたらご迷惑おかけしますのでクローズさせていただきます。 お手数おかけしますがよろしくお願いします。

その他の回答 (5)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.5

【つづき】 では、全記述です Dim dic As Object    ' どの選手にどのチェックボックスを割り当てたか Dim dicOld As Object  ' 編集前の選手割り当て状況 (初期では dicOld = dicNew) Dim dicNew As Object  ' いじっていた選手割り当て状況 Private Function ChkClick()   If (IsNull(Me.試合ID)) Then     Me.ActiveControl = Not Me.ActiveControl     Exit Function   End If   Me.天候 = Me.天候   '編集状態にしたいため   With Me.ActiveControl     If (.Value) Then       .Controls(0).BackStyle = 1       dicNew.Item(CLng(.Tag)) = Null     Else       .Controls(0).BackStyle = 0       dicNew.Remove CLng(.Tag)     End If   End With End Function Private Sub Form_Load()   Dim sSql As String   Dim rs As DAO.Recordset   Dim i As Long   Dim sN As String   Set dic = CreateObject("Scripting.Dictionary")   Set dicOld = CreateObject("Scripting.Dictionary")   Set dicNew = CreateObject("Scripting.Dictionary")   sSql = "SELECT * FROM T選手 ORDER BY よみ;"   Set rs = CurrentDb.OpenRecordset(sSql)   i = 0   Do While (Not rs.EOF)     i = i + 1     If (i > iM6Count) Then Exit Do     sN = "ck" & i     dic.Item(rs("選手ID").Value) = sN     With Me(sN)       .Value = False       .Tag = rs("選手ID")       With .Controls(0)         .Caption = rs("選手名")         .BackStyle = 0       End With       .OnClick = "=ChkClick()"       .Visible = True     End With     rs.MoveNext   Loop   rs.Close   Set rs = Nothing End Sub Private Sub Form_Current()   Dim sSql As String   Dim rs As DAO.Recordset   Dim i As Long   Me.Painting = False   For i = 1 To iM6Count     With Me("ck" & i)       If (Not .Visible) Then Exit For       .Value = False       .Controls(0).BackStyle = 0     End With   Next   dicOld.RemoveAll   dicNew.RemoveAll   sSql = "SELECT * FROM T出場 WHERE 試合ID = " & Nz(Me.試合ID, 0) & ";"   Set rs = CurrentDb.OpenRecordset(sSql)   While (Not rs.EOF)     i = rs("選手ID")     dicOld.Item(i) = Null     dicNew.Item(i) = Null     With Me(dic.Item(i))       .Value = True       .Controls(0).BackStyle = 1     End With     rs.MoveNext   Wend   rs.Close   Set rs = Nothing   Me.Painting = True End Sub Private Sub Form_BeforeUpdate(Cancel As Integer)   Cancel = True   MsgBox "修正したら登録ボタンで確定", vbCritical End Sub Private Sub Form_Undo(Cancel As Integer)   Dim v As Variant   Dim i As Long   Me.Painting = False   For i = 1 To iM6Count     With Me("ck" & i)       If (Not .Visible) Then Exit For       .Value = False       .Controls(0).BackStyle = 0     End With   Next   dicNew.RemoveAll   If (dicOld.Count > 0) Then     For Each v In dicOld.keys       dicNew.Item(v) = Null       With Me(dic.Item(v))         .Value = True         .Controls(0).BackStyle = 1       End With     Next   End If   Me.Painting = True End Sub Private Sub btn1_Click()   Dim sSql As String   Dim sS As String   Dim v As Variant   If (Not Me.Dirty) Then Exit Sub ' 試合日など入力チェックをするのなら、この場所で '   sS = Me.BeforeUpdate   Me.BeforeUpdate = ""   Me.Dirty = False   Me.BeforeUpdate = sS   If (dicOld.Count > 0) Then     For Each v In dicOld.keys       If (Not dicNew.Exists(v)) Then         sSql = "DELETE * FROM T出場 WHERE 試合ID = " & Me.試合ID _             & " AND 選手ID = " & v & ";"         CurrentDb.Execute sSql       End If     Next   End If   If (dicNew.Count > 0) Then     For Each v In dicNew.keys       If (Not dicOld.Exists(v)) Then         sSql = "INSERT INTO T出場(試合ID, 選手ID) VALUES (" _             & Me.試合ID & "," & v & ");"         CurrentDb.Execute sSql       End If     Next   End If   Call Form_Current End Sub Private Sub Form_Close()   Set dic = Nothing   Set dicOld = Nothing   Set dicNew = Nothing End Sub

qqandaa
質問者

補足

30246kikuさん 労力と時間をかけたご回答、誠にありがとうございます。 標準の機能(VBAを使わないと言う意味。)でできるものかと安易な質問でした が、VBAをかなり使いこなす必要があるのですね。 恥ずかしながらVBAは初心者ですので、このご回答をベースにトライしてみたいと思います。 > <2>選手テーブルの追加があれば、「試合記録入力フォーム」に自動で、チェッ > クボックスの追加があればよりよいのですが、そこは難しければ手動で追加して > いけばよいと思っています。(<2>の更新は少ないため) > > さらに、別フォームでもよいので、過去の試合IDを選択すると、出場選手のチェックボックスにレ点が呼びもどされ、 > チェックをはずして、再登録すると、<3>からレコードが消えたり、 > チェックがないものに追加でレ点を入れると、<3>にレコードが追加される > と、なおうれしいです。 を欲張ったので複雑になったのかもしれませんが、 ・選手のチェックボックスは固定 ・本フォームは登録するときのみ に限定すれば、VBAを使わなくても実現できますでしょうか? ちなみにAccessは2002です。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

#3です 私自身の作業は遅れそうですが、 待たせるのも何なんで大丈夫そうなものを先行して。 VBA 部分、記述が多くなったので回答を2つに分けます。 概要だけでもと思ったのですが、全部あった方が理解しやすいかな という事で、VBA記述全部載せます。 検証等しっかりやってください。(おかしな使い方している部分があるかも) 大事なものを聞き忘れていましたが、Access のバージョンは何でしょう。 以下記述するのは、2007で確認したものになります。 もし、2000であれば、フォームの「取り消し時」イベントがないため 完全な動きにはなりません。(「取り消し時」イベントも使うので) テーブル構成) 1)「Tチーム」 チームID: オートナンバ 主キー チーム名: テキスト型 2)「T試合」 試合ID: オートナンバ 主キー 試合日: 日付/時刻型 天候: テキスト型 相手チーム: 数値型 「Tチーム」のチームIDと 試合場所: テキスト型 3)「T選手」 選手ID: オートナンバ 主キー 選手名: テキスト型 よみ: テキスト型 このテーブルは、自チームの選手のみ、と解釈。 4)「T出場」 an: オートナンバ 主キー 試合ID: 数値型 「T試合」の試合IDと 選手ID: 数値型 「T選手」の選手IDと フォームの構成) 「T試合」を元にした単票フォームに、多数の非連結チェックボックスを配置します。 (#3までは選手は帳票で非連結のチェックボックス・・・って言ってましたが変更) 確認時に作成していたフォームの画像を添付します。 「T試合」を元に、フォームウィザードで作成。 (横に並べたかったので表形式で作成後単票に) 試合IDの表示は必要ないものとして表示から除外 レコードセレクタは「いいえ」に。レコード移動ボタンはそのまま「はい」 画像では見えませんが、右側に「登録」ボタンを「btn1」名で作成。 チェックボックスを作成していきますが、 必要人数以上のチェックボックスを不可視で作っておいて、 表示する時に必要な分だけ、可視(Visible=True)に変更します。 チェックボックス名の命名規則として、「"ck" & 連番」とします。 ( "ck1" ~ "ck120" ) 手作業で多数のチェックボックスを作成して名前を変更・・・ これ面倒なので、VBAで作成します。 1列20個で、計120個(6列分)のチェックボックスと、それにひっつくラベル このラベル部分に選手名を表示するようにします。 まず、チェックボックスを配置します。 チェックボックスを追加する対象のフォーム「F6M_BASE」を、 一旦「F6M_BASE_」にコピーして、作り終わったら「F6M」に名称を変更 という内容になってます。 Private Const sFname As String = "F6M_BASE" Private Const sFnew As String = "F6M" Private Const IPX As Long = 567 Private Const iRowCount As Long = 20 Public Const iM6Count As Long = 120 Public Sub M6MakeProc()   Dim i As Long   Dim sN As String, sNc As String   Dim iRow As Long, iCol As Long   On Error Resume Next   sN = sFname & "_"   DoCmd.DeleteObject acForm, sN   DoCmd.CopyObject , sN, acForm, sFname   DoCmd.OpenForm sN, acDesign   With Forms(sN)     iRow = IPX * 1 ' 書き出し位置 詳細の上から1cm のところから     iCol = IPX * 0.27 ' 左側どれくらい     For i = 0 To iM6Count - 1       With CreateControl(sN, acCheckBox, acDetail)         sNc = "ck" & i + 1         .Name = sNc         .Top = iRow + (i Mod iRowCount) * IPX * 0.5         .Left = (i \ iRowCount) * IPX * 3.2 + iCol         .Width = IPX * 0.4         .Height = IPX * 0.4         .DefaultValue = "0"         .TabStop = False         .Visible = False       End With       With CreateControl(sN, acLabel, acDetail, sNc)         .Top = iRow + (i Mod iRowCount) * IPX * 0.5         .Left = (i \ iRowCount) * IPX * 3.2 + (IPX * 0.42) + iCol         .Width = IPX * 2.6         .Height = IPX * 0.42         .BorderStyle = 1         .BorderWidth = 1         .BorderColor = RGB(0, 0, 0)         .BackStyle = 0         .BackColor = RGB(255, 240, 240)       End With     Next   End With   DoCmd.Close acForm, sN, acSaveYes   DoCmd.DeleteObject acForm, sFnew   DoCmd.Rename sFnew, acForm, sN End Sub いろいろと操作してみていると、チェック+色 にした方が良さそうだったので それなりの記述になっていきます。 後述 VBA 記述概要をここで。 ・チェックボックスクリック時 「T試合」の新規レコードであったら、見た目チェックを無効とするようにします チェックボックスは非連結なので、変更してもレコード移動等のタイミングは分かりません。 なので、編集状態にしておくことで、レコード移動のタイミングを検知することが出来るようになります。 そこで、「天候」を同じ値で設定して編集状態に・・・ 「天候」が都合悪ければ、別の連結したものを使ってください。 チェックボックスの変更状態を更新します。 ・フォームが起動された時 「T選手」から選手情報をチェックボックスに割り当てていきます。 割り当てたチェックボックスのラベルに選手名を、+可視に チェックボックスの Tag に、選手ID を登録しておきます。 これにより、クリックされた時、簡単に選手を特定できるようになります。 ・レコード移動時 レコード移動によって「試合ID」が変化するので、その時の「試合ID」で 「T出場」にある選手を抽出し、チェックボックスを変更していきます。 ・更新前 登録ボタン「btn1」クリックでのみ更新/登録できるようにするので、 意図しないタイミングでの更新はできない様に、常に Cancel = True とします ・取り消し時(2000では動かない) チェックボックスを初期状態に戻し、 レコード移動時に取得した選手情報でチェックボックスを再設定 ・登録ボタン 「T試合」への登録チェックが必要であればこのタイミングで 一度、更新前処理を無効としてレコードを登録します。 「T出場」に対して、チェックボックスの状態を反映します。 dicOld は、レコード移動時に取得したその試合での選手情報で、 チェックボックスでの変更状況は dicNew にて。 レコード移動直後は、dicOld dicNew は同じ内容となっています。 チェックボックスの操作により、dicOld dicNew の差分で DELETE したり、INSERT したりします。 登録操作後、dicOld dicNew の内容を同じにするため、レコード移動時の処理を。 試合での選手情報は、レコード移動時にのみ取得しているので、 その間、他の人が同様な操作をするようなことがあればおかしくなると思います。 このフォームでは、新規追加でも、修正でも、それなりに動くと思います。 VBA記述内にコメントは、ほとんどありません。 記述を読めばわかるコメントは不要と考えています。 (逆に読む邪魔になったり、コメントで分かったつもりになったりします) 何故そうしたか・・・コメントでは理由を書くものと思っているので、 今回の記述には、そういう部分はあまりないような・・・ 以降の記述の中で、For 文のところに iM6Count と見慣れないものがでてきますが、 前述のチェックボックスを作成する時に指定していた 総個数(120)に置換えてください。 【つづく】

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

#2です 全選手を帳票フォームで表示して、出場したのかをチェックボックスで入力 試合選手連結テーブルには、出場した人のみの情報を格納 ・・・と言う事ですかね。 (帳票フォームは言い過ぎでしょうか) 具体的な記述をしたいのですが、 不明な点が多々あり、補足をお願いします。 フォームは、どのような構成になっているのでしょうか。 特に、 1) > 試合ID  0001 > 試合日  5月1日 > 天候   晴れ > 試合相手 タイガース > 試合場所 東京グランド と 2) > A選手 > B選手 > ・・・・ > Z選手 の関係は、1)メイン 2)サブの構成? それとも、 1)は帳票フォームで、コマンドボタンやダブルクリック等で 2)のフォームを別途起動する 様になっているとか・・・ それとも、 2)の帳票フォームのヘッダ部分に、1)を選択できるコンボボックスがあったり・・・ それとも、 ・・・・・ また、テーブル構成はどうなっているのでしょうか 1)は、左側がそのままフィールド名でしょうか 2)は、選手ID、選手名・・・とかになっているのでしょうか また、試合選手連結テーブルは、試合ID、選手ID のみでしょうか なお、各フィールドの型(数値、テキスト等)はどうなっているのでしょうか (「試合ID」は数値型だけど、書式で4ケタ表示にしているとか) 基本的な 考え方/フォーム構成は、#2で記述したURLでの方法になります。 それを元に、使用テーブル/フォーム構成に合わせた細工をしていくものになります。 なので、基本的な事はURLを参照して理解しておいてください。 なお、提示しようとしているものは VBA 記述になります。 今日は無理と思いますが、2~3日中にブログに載せれたらと思っています。 (アドレスは規約により記述できないので、探せたら探してみてください) (実現の方法によっては、1回の回答の文字数制限に引っ掛かるかも・・・) 補足内容を見たうえで、少なくとも概要だけでも追記したいと思います

qqandaa
質問者

補足

30246kikuさん、ご対応ありがとうございます。 テーブルは、 <1>試合テーブル  試合ID  試合日  天候  試合相手  試合場所  等 <2>選手テーブル  選手ID  選手名  選手年齢  等 <3>試合選手連結テーブル  試合テーブル.試合ID  選手テーブル.選手ID <1>と<3> <2>と<3> はそれぞれリレーション付けられています。 その上で、これからフォームを作ろうと思っています。 フォームのイメージは、 <1>を試合のたびに入力していきます。 <1>の情報を入れる際に、出場した選手も登録します。 (つまり<3>のレコードが、出場選手分追加される) フォームのイメージ ************* 試合記録入力フォーム ********************  試合ID  [入力欄]  試合日  [入力欄]  天候   [入力欄]  試合相手 [入力欄]  試合場所 [入力欄] □選手A  □選手L  □選手X □選手B  □選手M  □選手Y □選手C  □選手N  □選手Z □選手D  <登録ボタン> ******************************************************** 上記のフォームで、 ・5月1日の試合情報を入力する。 ・出場した選手(A,B,C)のチェックボックスにレ点を入れる。 ・登録ボタンを押す。 すると <1>試合テーブル に5月1日の1レコードができる。 <3>試合選手連結テーブル に 試合ID 0001 選手ID A 試合ID 0001 選手ID B 試合ID 0001 選手ID C の3レコードができる。 といったイメージです。 <2>選手テーブルの追加があれば、「試合記録入力フォーム」に自動で、チェッ クボックスの追加があればよりよいのですが、そこは難しければ手動で追加して いけばよいと思っています。(<2>の更新は少ないため) さらに、別フォームでもよいので、過去の試合IDを選択すると、出場選手のチェックボックスにレ点が呼びもどされ、 チェックをはずして、再登録すると、<3>からレコードが消えたり、 チェックがないものに追加でレ点を入れると、<3>にレコードが追加される と、なおうれしいです。 なかなか伝わりにくくて申し訳ないですが、ご教授いただければ幸いです。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

フォームの構成が今一つ分からないのですが、 帳票フォーム上の非連結チェックボックスでレコードを特定したい・・・という事であれば 非連結のチェックボックスでレコードを選択する http://hatenachips.blog34.fc2.com/blog-entry-28.html が参考になると思います。 上記を読んで分からなければ、もう少し具体的な内容で補足してもらえませんか。 また、 リストボックスを2つ並べて、選んだ/選んでない・・・ をギッコンバッタンする方法もあるかと思います。 リストボックスの活用-連動-:SampleFile035 http://www.accessclub.jp/samplefile/samplefile_35.htm 左のリスト内のそれをクリックしたら、右側のリストに移る。 逆に、右リスト内のそれをクリックすると左側のリストに移る・・・・とか 操作的に、私はリストボックスを使った方がイメージ・操作しやすいですが・・・

qqandaa
質問者

補足

30246kiku様、ご回答ありがとうございます。 Accessに精通していないので、いただいたご回答で実施可能かどうか判断できていません。 あといただいたご回答の リストボックスを2つ並べて、選んだ/選んでない・・・ をギッコンバッタンする方法もあるかと思います。 は、こういう入力フォームでの実現もありえますが、100以上ある選手から選ぶので、できれば選手をあいうえお順で並べて、該当の選手を探しやすいようにするためにチェックボックスにしたいわけです。教えていただいたリストボックスもあいうえお順で並べればよいと言われるかもしれませんが、100以上の選手を一画面で表示をして(例えば横にあ行、か行、さ行、、、、と並べてみれるように)必要な選手を選択したいです。 説明が不足しているかもしれないので、補足を追加します。 試合ID と 選手ID を連結させるためだけのテーブル(試合選手連結テーブル)を作っています。 試合ID 0001 に出場した選手は、 A,B,C 試合ID 0002 に出場した選手は、 A,B,C,X,Y 試合ID 0003 に出場した選手は、 A,Z だとします。 A~Zのチェックボックスを準備して、 0001のIDに A,B,Cをチェックして、確定させると 0001 A 0001 B 0001 C というレコードができる。 0002のIDに、A,B,C,X,Yをチェックして、確定させると 0002 A 0002 B 0002 C 0002 X 0002 Y というレコードができる。 0003のIDに、A,Zをチェックして、確定させると 0003 A 0003 Z というレコードができる。 上記処理が終わると、試合選手連結テーブルは、 0001 A 0001 B 0001 C 0002 A 0002 B 0002 C 0002 X 0002 Y 0003 A 0003 Z というレコードを作りたいのです。 逆に試合ID0002にYが出場したと思っていたら間違いで、出場してなかったことがわかり、 0002 に対して、Yをチェック外して確定させると 0002 Y レコードを削除したいです。 ご回答いただいた内容で上記が実現できますでしょうか?

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

状況がよく分かりませんが ここにチームのメンバ(メンバテーブル) 選手名 表示 A選手 レ B選手 ・・・・ Z選手 レ みたいにYes/No型のフィールド『表示』を加えて クエリ上で抽出条件に True とすれば良いのでは?

qqandaa
質問者

補足

nicotinism様、ご回答ありがとうございます。 試合ID と 選手ID を連結させるためだけのテーブル(試合選手連結テーブル)を作っています。 試合ID 0001 に出場した選手は、 A,B,C 試合ID 0002 に出場した選手は、 A,B,C,X,Y 試合ID 0003 に出場した選手は、 A,Z だとします。 A~Zのチェックボックスを準備して、 0001のIDに A,B,Cをチェックして、確定させると 0001 A 0001 B 0001 C というレコードができる。 0002のIDに、A,B,C,X,Yをチェックして、確定させると 0002 A 0002 B 0002 C 0002 X 0002 Y というレコードができる。 0003のIDに、A,Zをチェックして、確定させると 0003 A 0003 Z というレコードができる。 上記処理が終わると、試合選手連結テーブルは、 0001 A 0001 B 0001 C 0002 A 0002 B 0002 C 0002 X 0002 Y 0003 A 0003 Z というレコードを作りたいのです。 逆に試合ID0002にYが出場したと思っていたら間違いで、出場してなかったことがわかり、 0002 に対して、Yをチェック外して確定させると 0002 Y レコードを削除したいです。 ご回答いただいた内容で上記が実現できますでしょうか?