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

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

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

AccessDBで、下記のようなことをやりたいのですが、ご教授いただけないでしょ うか? 例)(実際の内容は違うのですが、例としてお伝えしやすい内容に変更していま す。) 野球のデータベースを作るとします。 野球の試合日のデータ(試合テーブル) 試合ID  0001 試合日  5月1日 天候   晴れ 試合相手 タイガース 試合場所 東京グランド こういった試合データが複数レコードある。 ここにチームのメンバ(メンバテーブル) A選手 B選手 ・・・・ Z選手 各選手の試合履歴を見るために各選手と試合データを結合させたいです。 5月1日の試合(試合ID0001)に、A,B,C選手が出場していたとしたら、 A 0001 B 0001 C 0001 を結びつけるようなテーブルを作ればよいと思うのですが、A,B,Cを入力して上 記レコードを作るのではなく、 A選手~Z選手のチェックボックスがあって、選択した選手の分だけ (今回でいうとA,B,C)が、 A 0001 B 0001 C 0001 というように0001と結合でするレコードを作りたいのです。 プルダウンでA,B,Cを選択する方法はわかるのですが、実際にやりたいのは、100 ぐらいの選択となるので、チェックボックスで選択したいのです。

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

  • ベストアンサー
  • 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 レコードを削除したいです。 ご回答いただいた内容で上記が実現できますでしょうか?

関連するQ&A

  • チェックボックスでレコードの全選択

    ACCESS2000をWin98で使用しています。 今回、とてもややこしいのですが・・・ マスタテーブルAのワークスペーステーブルBを作成しました。レコードの抽出はマスタAからクエリでワークスペースBに出しています。 フォームのサブフォームには、ワークスペースBをリストで表示しています。 そのリストにチェックボックスがあるのですが、そのチェックボックスをボタン1つで全選択・解除を行いたいと思っています。 現在は「チェック」フィールドがありません。というエラーがでています。 何がやり方を教えていただけないでしょうか?

  • ACCESSフォームのリストボックスでレコードが選択できない

    ACCESS2000です。 フォームの左側に親テーブルのフィールド1の値を選択させるリストボックスがあり、そこで選択したレコードにリンクする子テーブルのレコードをフォームの右側にサブフォームで表示させたいのですが、リストボックスでレコードを選択できません(クリックしても反転しません)。でもレコード移動ボタンを押すと、リストボックス内の該当レコードがちゃんと反転し、右側のサブフォームにも正しく反映します。 リストボックスのプロパティはくまなく見ましたがそれらしい設定項目はみつかりませんでした。どこを直せばよいのでしょうか。

  • SQLの書き方(チェックボックス)

    このスレでいいのかちょとわからなかったのですが、 SQLの書き方のなのでこちらで質問をさせて頂きます。 (VB.NET) □ A □ B □ C チェックボックス(A,B,C)があります。 例えば(A、B,C)どれか一つ選択された場合 SELECT文でテーブルA、B、Cからデータを抽出するイメージは わくのですが、チェックボックスで(A、C)など複数 選択された場合には、SELECT文でテーブルAを抽出し 終わった後、SELECT文でテーブルCを抽出するのは 問題があるのではないかと思います。 ただイメージがわきません…。ヒントでもいいので もしよろしければアドバイスよろしくお願い致します。

  • accessのコンボボックスのことで質問です。

    accessを勉強しているのですが、ちょっとしたことで分からなくなってしまいました・・。 質問の内容なのですが、まずフォーム上にコンボボックスAとコンボボックスBを配置するとします。 レコードソースには仮に[情報テーブル]というテーブルが選択されているとします。 コンボボックスAには[情報テーブル]のフィールド名が、 例えば[顧客NO]、[商品]、[値段]というフィールド名が入っているとし、フィールドにはそれぞれ10件ずつデータが入力されています。 そしてコンボボックスAで[顧客NO]を選択するとコンボボックスBに[顧客NO]の10件のデータが挿入され、選択できるようにしたいのです。 他のフィールド名を選んだときにも同じようにコンボボックスBにフィールドのデータが入るようにしたいと思っています。 コンボボックスAにテーブル名を入れることはできたのですが、 コンボボックスAで選択されたフィールドのデータを、コンボボックスBで選択できるようにするというやり方がわからないのです・・。 accessは2002を使っています。 よろしくお願いします。

  • Access2000のコンボボックスで複数列の絞込み

    1つのテーブルに「A」「B」「C」という列にデータが入力されていて、それを1つのコンボボックスで絞込みをやりたいと思っていますができません。 コンボボックスで選択したデータを「A」「B」「C」のすべてから検索し含まれる物全てを抽出したいです。   A  B  C 1 山  川  谷 2 山  水  川 3 川  谷  山 1つのコンボボックスで「谷」を選ぶと、1と3のレコードを抽出したいです。 良い方法は、ないでしょうか?

  • Access「レコードが削除されました」のエラー

    お世話になります。 あるデータベースを作成し、クエリで条件抽出しています。 そのクエリを実行しても、「レコードが削除されています」という エラーが出てしまうようになりました。 どうしてなのか、どうしたらいいのか教えていただけませんでしょうか。 テーブル3つをリレーションしています。 テーブルAは、テーブルBとCにつながっています。 クエリA:テーブルAのチェックボックスAでYesの人だけを選択し、 それに連動するテーブルAのデータを選択したいと思っています。 カテゴリーごとに抽出できるようパラメータをいれ、 抽出条件に「yes」を入れてあるのですが、 実行するとエラーになります。 同じ条件で作成しているクエリBは、同様にテーブルBの チェックボックスBのYesの人だけを選択するようにしているのですが、 実行しても問題がありません。 同じ設定をしている2つのクエリなので、 あとは元のテーブルデータがおかしいのかと思っているのですが 情報はちゃんと入力されています。 情報の閲覧が出来ないので非常に困っています。 復活するときもあるのですが、不安定です。 どうかチェックする部分を教えてください。 なぜこういうことが起きるのかも教えていただければと思います。 私は素人なので、VB等は組めません。 クエリ上で行ないたいのですが、 どうしたら宜しいでしょうか。 Access2000、複数人で入力しています。 宜しくお願い致します。

  • サブフォームにチェックボックス・・・・

    accessにて・・・ サブフォームに表示させるレコードと連結したチェックボックスは付けられますか? たとえば・・・ (B→チェックボックスです) (サブフォームイメージ) |項目A |項目B |項目C |項目D B |Aデータ|Bデータ|Cデータ|Dデータ B |Aデータ|Bデータ|Cデータ|Dデータ みたいな感じで、レコードセレクタ代りにチェックボックスを付ける感じで・・・ やってみたんですが、すべてにチェックが入ってしまいます・・・やはり無理なのでしょうか?教えてください

  • Access2010 コンボボックスで選択クエリ

    こんにちは。実は、勤め先でどうしてもアクセスを使って仕事をしなくてはならなくなり、次のような処理をすることになりました。 私はアクセスを使って非常に簡単なこと(クエリを作成したり、入力フォームを作ったりすることなど)はできるのですが、具体的にどうすればよいのか、どこから手を付ければよいのかわからずにいます。 どうかお助けくださいませ。 (1) テーブルを作成し、まずそのテーブルから、任意のレコードを複数選び出します。選択は2つのコンボボックスで行い、Aのデータを選ぶものとBのデータを選ぶものを使います。 (2) さらにこれを複数選べるようにもしておきます。たとえば、「(A)12の(B)38」を2枚など。 (3) 選んだレコードをクエリに書き出します。 (4) (3)で書き出すと同時に、レコードに連番を書き加えます。 (5) 連番をつけたクエリをもとに、そのデータをワードに差し込み印刷します。 (6) (5)の差し込み印刷は、印刷に時間がかかるので、PDFに書き出し、ファイル化します。 (7) ファイル化したPDFファイルから印刷をします。 (8) (4)の連番データは、次にこの作業をするときに呼び出し、次の連番をつける時に使います。 ざっとこのような感じになるのですが、何から手を付けていったらよいのかわかりません。 よろしくご指導お願いいたします。

  • (アクセス)コンボボックスの選択結果をレコードに

    MSオフィスのAccessについて質問です。 二つのテーブルがあるとします -------- <T業種> 業態    業種  コード(オートナンバー) A業態   a業   1 A業態   b業   2 A業態   c業   3 B業態   d業   4 B業態   e業   5 -------- <T企業> 社名 コード A社  1 B社  1 C社  2 -------- (目的) フォーム上に<T企業>を参照するコンボボックスを二つ作り、 業態を選ぶと業種が選べるようにする。 そして、選んだ組み合わせのコードを<T企業>に入れ、 レコード移動したらコンボボックス内の業態業種も変わるようにしていく。 (質問内容) 現在、コンボボックスで業態を選ぶと業種が選べるようにはなっています。 しかしながら、コンボボックスで選んだコードが<T企業>に反映されません。 選択肢を変えても<T企業>のコードナンバーが変わらず、 手動でナンバーを変えてもA社、B社、C社のコンボボックスの内容が変化しません。 (環境) Access2000 ソフトが古く環境面からお答えしにくいかもしれません。急遽データベースを作ることになり、とりあえず社内で眠っていたソフトを活用し、今後活用できそうならアップグレードするという予定になっております。 私自身も最近Accessの勉強を始めたばかりで深くは理解しておりません。 どうかご教示よろしくお願いします

  • Access2007 「レコードを追加できません」

    Access2007で困っております。 フォーム上からテキスト型のデータを入力しようとしても 「レコードを追加できません、テーブル’T_アルバム’の結合キーがレコードセットにありません。」 と表示されうまく入りません。 【テーブル構成】 ★が主キー (1)T_アルバム ★アルバムID テキスト型 アルバム名 テキスト型 ジャンルID テキスト型 ソースID テキスト型 アーティストID テキスト型 (2)T_曲目 ★曲ID テキスト型 曲名 テキスト型 トラックNo テキスト型 アルバムID テキスト型 (3)MT_アーティスト ★アーティストID テキスト型 アーティスト名 テキスト型 (4)MT_ジャンル ★ジャンルID テキスト型 ジャンル名 テキスト型 (5)MT_ソース ★ソースID テキスト型 ソース名 テキスト型 【リレーション】 ※いずれも参照整合性付き (1)T_アルバム アルバムID --- (2)T_曲目 アルバムID (1)T_アルバム アーティストID --- (3)MT_アーティスト アーティストID (1)T_アルバム ジャンルID --- (4)MT_ジャンル ジャンルID (1)T_アルバム ソースID --- (5)MT_ソース ソースID フォーム作成のために「Q_アルバム情報入力」をつくりました。 アルバムID T_アルバム アルバム名 T_アルバム アーティストID MT_アーティスト アーティスト名 MT_アーティスト ジャンルID MT_ジャンル ジャンル名 MT_ジャンル ソースID MT_ソース ソース名 MT_ソース この「Q_アルバム情報入力」を使って、フォームウィザードからフォームを作成し、 アルバムIDやアルバム名を入力しようとすると 「レコードを追加できません、テーブル’T_アルバム’の結合キーがレコードセットにありません。」 と表示されます。 他のフィールドは値が入力できますが、これら2つのフィールドのみ入力できません。 なお、各テーブルのフィールドには予めデータが入っている状態です。 宜しくお願い致します。

専門家に質問してみよう