Access勉強中です。
委員名簿テーブルと、いくつかの行事テーブルを結合したいのですが、上手くいきません。
どうか教えてください。
access2003です。
委員名簿テーブル
クラス 生徒名1 生徒名2 生徒名3
1-1 ああ いい
1-2 かか きき くく
1-3 ささ
1-4 たた ちち つつ
行事Aテーブル 行事Bテーブル
生徒名 参加 生徒名 参加
かか true ああ false
ささ true いい true
ちち false きき true
たた true
ちち true
このようなテーブルを結合して、次のようなテーブルを作りたいのです。
クラス 生徒名 行事A 行事B
1-1 ああ false
1-1 いい true
1-2 かか true
1-2 きき true
1-2 くく
1-3 ささ true
1-4 たた true
1-4 ちち false true
1-5 つつ
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
一応、質問の範囲での回答とします。
たとえば、以下のような「委員会名簿テーブル」があるとします。
フィールドの生徒名は生徒名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テーブル」に結合線が向かっている
ことに注目してください。行事テーブルが追加されるような場合は
結合線の設定を同じようにしてください。
以上です。
わからないところがあれば補足してください。
ありがとうございます!
理解に半日かかりましたが、自分のテーブルを元に、書き換えて、動作しました。
いずれ、VBAで・・と思っていましたので、
一気に勉強がすすみました。
ただ、フォームのボタンをクリックしたときに・・というのが、うまくいきませんでした。
単純にVBAからステップ実行してしまいました。
そこは、これからの課題です!
No.4
- 回答日時:
現状のテーブル設計だと行事が増えるごとに、クラスの入れ替えや増減があるごとに
クエリを修正しなくてはなりません。
また、そのクエリ自体が難しくはなくとも長いSQLになってしまい遅くなります。
さらに、同姓同名の生徒が存在する場合には・・。
http://support.microsoft.com/kb/283878/ja
なので、生徒IDのような一意のフィールドを加え
委員名簿
クラス 生徒名 生徒ID
1-1 山田治夫 1
1-2 佐藤博 2
・・・・・・・・・・・・
行事
行事名 参加 生徒ID
潮干狩り True 2
潮干狩り False 1
運動会 True 1
運動会 True 2
のようなテーブル設計にして
クエリ1では双方の生徒IDで結合線を引きます。
クエリ1を元にしてクロス集計クエリで最終的なモノが得られます。
同姓同名は、考えていませんでした・・・
やはり1意のテーブル構造にすることが基本ですね。
ご指摘のように、並び替える複数のクエリを作って、
クロス集計クエリでできました。
お礼をつける前に、VBAでの並び替えの方法を載せてくださった方がいたので、
今回は、そちらの方に、ポイントをつけました。
基本を叩き込むことができました。
ありがとうございました。
No.3
- 回答日時:
No.2です。
アクセスで、データ同士をリンクさせるなら、1フィールド、1データにしないと、です。
ただ、質問者様のイメージされるフォームは、
生徒1名に対して、各行事答えが1つづつのため
エクセルに向いている内容に思えます。
例えば、行事欄が1つで、そこに入るデータが何通りかあり、関連して変わってくる項目があるような場合はアクセスが便利です。(エクセルのVLOOKUPを使いたいような場合です)
「次のような」とおっしゃる形であれば、
行事欄をあらかじめたくさん作っておかないと、ですね。
この回答への補足
実は、Excelでほしいものをマクロで作ることはできました。
ただ、今回はaccessを使いたいのです。
元データは、Excelをインポートしています。
今後は、行事AとDの参加者とか、行事のタイムテーブルから学期ごとの参加状況、なども作っていきます。
さらに、途中で生徒が増減することもあります。(最大は1クラス3名です)
このようないろいろなアウトプットや状況を考えるたことと、accessの勉強のため、accessで行いたいのです。
よろしくお願いします。
1フィールド1データは基本なんですね
何度もすみません。
もとのデータを並び替えるクエリをつくって、できました。
ありがとうございました。
No.2
- 回答日時:
ワンポイントアドバイス
このようなケースでは、委員名簿テーブルを一人づつにしないと応用が利かなくなりますね。
このケースでは、3つのテーブルをハイパーリンクで結ぶ価値はないと思いますよ。
委員名簿テーブルに
行事A、行事Bの欄を設けて、YES/NO型などにすれば済んでしまいますね。
委員名簿T
ID クラス 氏名 行事A 行事B
1 1-1 ああ
2 1-1 いい
3 1-2 かか
4 1-2 きき
5 1-2 くく
6 1-3 ささ
7 1-4 たた
8 1-4 ちち
9 1-5 つつ
この回答への補足
ありがとうございます。
行事テーブルはこれからも違う行事のものが追加されるので、名簿テーブルと行事テーブルを別にもちたいのです。
やはり、名簿テーブルをクエリでひとりづつに並べ替えてから、という手順になるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) EXCEL関数(数式)を教えてください 2 2022/06/08 18:32
- Access(アクセス) Access クエリ 同一テーブル内 複数フィールドの同時集計のやり方について 1 2022/05/18 19:01
- Visual Basic(VBA) マクロを短くする 1 2023/01/15 00:11
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
- Excel(エクセル) 中身がFALSEなのにTRUEになる 2 2022/11/25 09:22
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- JavaScript 正規表現について質問です。条件に合う場合はtrueを返したい 3 2022/10/06 23:02
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
Accessのフィールド結合について
Access(アクセス)
-
アクセスで複数のレコード情報を1レコードにまとめる方法
Access(アクセス)
-
Accessのクエリで2つのフィールドが同条件の場合に結合したい
その他(Microsoft Office)
-
-
4
複数のレコードを1つのレコードにまとめる方法
Access(アクセス)
-
5
ACCESSでひとつのフィールドに内容をまとめる
Access(アクセス)
-
6
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
7
アクセスで#エラーを表示させない方法は?
Access(アクセス)
-
8
ACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ
Access(アクセス)
-
9
アクセスで追加した項目に全て同じ値を一発で入れたい
Access(アクセス)
-
10
アクセス 同じフィールド(テキスト型)のレコードを連結させたい
Access(アクセス)
-
11
ACCESS 重複データを1つだけ表示したい(初心者です)
Access(アクセス)
-
12
Access2003 クエリで、空の列は作れますか?
Access(アクセス)
-
13
アクセス2003 複数の列に分かれたデータを1列にまとめたい
Access(アクセス)
-
14
ACCESS フォームをそのまま印刷について
その他(データベース)
-
15
アクセスで『0の値以外』を表示する方法
Access(アクセス)
-
16
Accessで、1つの項目に複数の置換えを1度でするには?
Access(アクセス)
-
17
ACCESS 一つのフィールドに複数レコードの値をセットしたい
その他(データベース)
-
18
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
19
ACCESS クエリで重複データを最新の1件だけ表示
Access(アクセス)
-
20
Accessでフィールド名を変数(文字列)で・・・
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
町内会の清掃に出れない時の対...
-
獅子舞の熨斗袋表書きは、何と...
-
町内会の組の班長の順番が回っ...
-
誕生日おめでとうって言われた...
-
「於」 読み方
-
一般的な「1ヶ月前」とは
-
LINEで誕生日を公開してない人...
-
高校生です 学校行事は全部休ん...
-
「6月2日をもって」は6月゜2日...
-
少雨決行の決行する基準はどの...
-
スメハラが原因で職場でのいじ...
-
返信しなかった往復ハガキは書...
-
5月22日今日からセブンイレブン...
-
労働組合に入るべき?
-
今日、郵便受けに匿名で手紙が...
-
創価学会員がやらない行事って?
-
女1人で仕事の飲み会に行くべき?
-
若く見える人の特徴ってなんで...
-
興味のない女子に学校の行事の...
-
出不足金は支払わなければいけ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
獅子舞の熨斗袋表書きは、何と...
-
一般的な「1ヶ月前」とは
-
「6月2日をもって」は6月゜2日...
-
「於」 読み方
-
町内会の組の班長の順番が回っ...
-
後援会費って払わなくてもOK?
-
5月22日今日からセブンイレブン...
-
高校生です 学校行事は全部休ん...
-
返信しなかった往復ハガキは書...
-
労働組合に入るべき?
-
教育委員会告示
-
交通安全協力会 協力金1500円...
-
町内会の清掃に出れない時の対...
-
エクセルのシートリンクで,色...
-
創価学会員がやらない行事って?
-
誕生日おめでとうって言われた...
-
女1人で仕事の飲み会に行くべき?
-
子供の学校行事で、会社を休め...
-
子供会の運営委員の経験のある方
-
Happy 20th Birth Day! 使い方...
おすすめ情報