一応、質問の範囲での回答とします。
たとえば、以下のような「委員会名簿テーブル」があるとします。
フィールドの生徒名は生徒名6でも、生徒名100でもフィールドが
設定できるまでかまいません。
クラス 生徒名1 生徒名2 生徒名3 生徒名4 生徒名5
1-1 田中 佐藤 西田 山崎 内藤
1-2 東 南田 中川
1-3 豊臣 田中 中田 今井
1-4 谷 道上
1-5 徳川 佐竹 佐藤 西岡 中川
これを以下のようなテーブルに簡単に変更できますか?
また、下記では質問の最終的な結果を得るには下記の
ように「生徒ID」という各生徒を一意に区別するフィールドが
必要になります。これは最後に作るクエリで必要であるということと、
同じクラスあるいは他のクラスに同じ苗字の人物が存在する可能性が
あるかもしれないからです。
生徒ID クラス 生徒名
1 1-1 佐藤
2 1-1 西田
3 1-1 山崎
4 1-1 内藤
5 1-2 南田
6 1-2 中川
7 1-3 田中
8 1-3 中田
9 1-3 今井
10 1-4 道上
11 1-5 佐竹
12 1-5 佐藤
13 1-5 西岡
14 1-5 中川
もし、データが多くて大変だというのであれば、以下のようにしてみてください。
(1) 以下のようなテーブルを作ります。
生徒ID 数値型 主キーを設定します。
クラス テキスト型
生徒名 テキスト型
テーブルの名前を「委員会名簿テーブル」とします。
元の「委員名簿テーブル」を「委員会名簿テーブル元」
とします。
(2) 次に分かりやすく実行できるようにするために、
フォームを作り、そこにボタンを一つ設定します。
ボタンのクリック時のイベントに以下を設定します。
なお、ボタンの名前は出来上がったボタンの名前の
ままでいいです。
Private Sub コマンド0_Click()
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim i As Integer
Dim j As Long
Set db = CurrentDb
Set rs1 = db.OpenRecordset("委員会名簿テーブル元")
Set rs2 = db.OpenRecordset("委員会名簿テーブル", dbOpenDynaset)
j = 1
rs1.MoveFirst
Do Until rs1.EOF
For i = 2 To rs1.Fields.Count - 1
If rs1.Fields(i) <> "" Then
rs2.AddNew
rs2!生徒ID = j
rs2!クラス = rs1!クラス
rs2!生徒名 = rs1.Fields(i).Value
rs2.Update
j = j + 1
End If
Next i
rs1.MoveNext
Loop
rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs2 = Nothing
db.Close: Set db = Nothing
End Sub
次に、コード表のコマンドバーのツールから
参照設定を選択し、Microsoft DAO xx Object Library の項目に
チェックを入れ、OKとします。なお、xx は3.6のような数字です。
(3) (1)、(2)ができたら、ボタンを押して「委員会名簿テーブル」
を確認してみてください。
(4) 次に、「行事Aテーブル」と「行事Bテーブル」
数値型の「生徒ID」というフィールドを追加し、できた「委員会名簿テーブル」
を参照して「クラス」と「生徒名」に合致した「生徒」を入れていってください。
本来は「生徒ID」があれば「生徒名」はこれらのテーブルでは必要はないのですが。
これらのテーブルの「生徒ID」は主キーを設定しません。
たとえば以下のように。
行事Aテーブル
生徒ID 生徒名 参加
1 佐藤 True
3 山崎 True
6 中川 True
行事Bテーブル
生徒ID 生徒名 参加
1 佐藤 False
6 中川 True
13 佐藤 True
14 中川 True
(5) 最後にクエリを作成します。下記のSQL文を新しいクエリを
SQLビューにして、貼り付けます。
SELECT 委員会名簿テーブル.生徒ID, 委員会名簿テーブル.クラス, 委員会名簿テーブル.生徒名, 行事Aテーブル.参加, 行事Bテーブル.参加
FROM (委員会名簿テーブル LEFT JOIN 行事Aテーブル ON 委員会名簿テーブル.生徒ID = 行事Aテーブル.生徒ID) LEFT JOIN 行事Bテーブル ON 委員会名簿テーブル.生徒ID = 行事Bテーブル.生徒ID;
あるいは、以下のようにしてもいいですが、こちらはフィールド名を変更しています。
変更は手動で書き変える必要があります。
SELECT 委員会名簿テーブル.生徒ID, 委員会名簿テーブル.クラス, 委員会名簿テーブル.生徒名, 行事Aテーブル.参加, 行事Bテーブル.参加
FROM (委員会名簿テーブル LEFT JOIN 行事Aテーブル ON 委員会名簿テーブル.生徒ID = 行事Aテーブル.生徒ID) LEFT JOIN 行事Bテーブル ON 委員会名簿テーブル.生徒ID = 行事Bテーブル.生徒ID;
上記のクエリをデザインビューで確認すると、「委員会名簿テーブル」
から「行事Aテーブル」と「行事Bテーブル」に結合線が向かっている
ことに注目してください。行事テーブルが追加されるような場合は
結合線の設定を同じようにしてください。
以上です。
わからないところがあれば補足してください。
お礼
回答ありがとうございました。 教えて頂いた通り If CLng(Me![テキスト112]) <> CLng(Me![テキスト130]) Then としてみましたが駄目でした。 試しにブレークポイントを設定しテキストデータの内容を確認したところ Me![テキスト112]=1 ’メインFのテキストデータ Me![テキスト130]=1 ’メインFへ引継いだサブFの合計値テキストデータ と表示され、確かにサブフォームの合計値はメインフォームへ引き継がれて いるのですが比較演算では偽の判断をしてしまいます。 試しにテキストデータをMsgboxで表示させると Msgbox CLng(Me![テキスト112]) ⇒ 1を表示 Msgbox CLng(Me![テキスト130]) ⇒ 0を表示 なぜ、[テキスト130]の値がこのようになるのかますます解らなくなってしまいました。 どのようなイベントのときに実行されていますか? ということですが フォームのオープン時のイベントではなく、メインフォーム及びサブフォームに 一通りデータを入力を行った後に「登録」というコマンドボタン押下時のイベント として実行しています。 言われる通り、サブフォームで入力した合計値がメインフォームに少し遅れて 表示(約1秒程ですが)されます。 たびたび申し訳ありませんが、何か他に原因と思われるところについて教えて 頂けないでしょうか。よろしくお願いいたします。