- ベストアンサー
ACCESSのテーブルからデータを抽出する方法
次のようなデータ構造のテーブルから 氏名 | データ1 ---------------- あ | 1111 い | 2222 あ | 3333 う | 4444 次のようなデータ構造のテーブルを 氏名 | データ1 | データ2 ---------------------------- あ | 1111 | 3333 い | 2222 | う | 4444 | 作成したいのですが、うまくいきません。 どなたか教えていただけないでしょうか。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
No.5です。 では、あまりスマートなやり方ではなくて恐縮ですが・・・ 仮に、現在のテーブルの名前を「データテーブル」として、話を進めます。 なお、わからないことがありましたらまたご質問下さい。答えられる範囲でお応えしますので。 準備: A)「氏名一覧」テーブルの作成 1)新規クエリをデザインビューで開いたら、メニューで「表示(V)」→「SQLビュー(Q)」を選択 2)表示されている「SELECT;」等を削除し、以下のSQL文を貼付: SELECT DISTINCT データテーブル.氏名 INTO 氏名一覧 FROM データテーブル; 3)このクエリを実行し、「氏名一覧」テーブルを作成 ※クエリ自体は、テーブル作成直後に削除して構いません。 B)「各人データ」サブフォームの作成 1)レコードソースに「データテーブル」を指定して新規フォームを作成 2)フォームプロパティの「既定のビュー」に「帳票フォーム」を指定 (「通番」割り当て前にデータを確認しないなら不要) 3)「通番(Class)」フィールドと「データ」フィールドをフォームに追加 4)「各人データ」としてフォームを保存 C)「通番割当」メインフォームの作成 1)レコードソースに「氏名一覧」クエリを指定して新規フォームを作成 2)「氏名」フィールドをフォームに追加 3)コントロールウィザードを使用して、「各人データ」サブフォームを組込 (リンクフィールドには「氏名」を指定) ※サブフォームのサイズ等は必要に応じて設定して下さい※ (特に設定しなくても割り当てはできます) 4)コマンドボタンをメインフォームに追加 5)コマンドボタンの名前に「実行」を指定 6)「通番割当」としてフォームを(仮で)保存 マクロの設置: 1)「通番割当」フォームをデザインビューで開く 2)「実行」ボタンのプロパティシートを表示させる 3)「クリック時」を選択してビルダボタン(「...」)をクリック 4)「ビルダの選択」ダイアログ画面で、「コードビルダ」を選択 5)既定で入力されている「Private Sub 実行_Click()」と「End Sub」を削除し、以下の文を貼付: Private Sub 実行_Click() DoCmd.GoToRecord acForm, "通番割当", acFirst 各人処理 MsgBox ("終了しました") DoCmd.GoToRecord acForm, "通番割当", acFirst End Sub Sub 各人処理() Do While [NewRecord] = False DoCmd.GoToControl "各人データ" 通番割当 DoCmd.GoToControl "実行" DoCmd.GoToRecord acForm, "通番割当", acNext Loop End Sub Sub 通番割当() Do While [各人データ].[Form].[NewRecord] = False 各人データ!通番 = 各人データ.Form.CurrentRecord DoCmd.GoToRecord , "", acNext Loop End Sub これで「通番割当」フォームを再保存した後、「実行」ボタンをクリックすれば、全てのデータに「通番」を割り当てられるはずです。 ※念のため、必ずデータのバックアップを行ってから実行して下さい(汗)※
その他の回答 (5)
- DexMachina
- ベストアンサー率73% (1287/1744)
No.3です。 私のいうところの「通番」(→通し番号)、No.4でRich53さん言われるところの「Class」の、割り当て方法についての一案ですが、そのテーブルをレコードソースとするフォームを作成し、「氏名」で絞り込みをかけた上で、レコード番号を「Class(通番)」に代入するマクロを組まれてはいかがでしょうか?
補足
ありがとうございます。すみませんがマクロの組み方を教えていただけないでしょうか。
参考になればと思い書き込みします。 (1)Classというフィールドを追加します。 データを見ればわかると思いますが、通常は1、2つ目のデータには2を 書き込みます。 (2)このデータに対し、クロス集計クエリを適用します。 Row---氏名 Column---Class データ---データ1 Firstを指定します。 (英語版では Firstなんです) --------- テーブル --------- 氏名 データ1 Class あ 1111 1 い 2222 1 あ 3333 2 う 4444 1 ---------------------- クロス集計クエリの結果 ---------------------- 氏名 1 2 あ 1111 3333 い 2222 う 4444 ------------ 問題は、Classの取り扱いです。 大変申し訳ないのですが、まだわかっていません。 でも、このClassをうまく処理できれば、クロス集計クエリで目的としたものは完成します。 どなたか、知恵を貸していただければと思います。
補足
ありがとうございます。個人ごとに集計したいデータの件数は、1件から20件ぐらいあります。総データでは2000件を超えています。ご指摘のとおりClassフィールドに書き込むデータの処理が問題ですね。
- DexMachina
- ベストアンサー率73% (1287/1744)
今からそのテーブルに1フィールドを追加できますか? もしそれができるなら、そこに氏名毎の通番を記録し、「クロス集計クエリ」を行えば、vhb1953さんがほしいという形にまとめられると思います。 1)クエリのデザインビューでクロス集計クエリを選択。 2)「集計」行で、「氏名」と「通番」に「グループ化」を、「データ」に「最小」を指定。 3)「行列の入れ替え」行で、「氏名」に「行見出し」を、「通番」に「列見出し」を、「データ」に「値」を指定。 ・・・ただ、「通番」の割り当てが問題になりますが。
- UTwTU
- ベストアンサー率24% (218/879)
あ 1111 あ 3333 い 2222 う 4444 という形でもいいなら、クエリで「並べ替え」を使うといいのではと思います。 クエリを作成するときに、「並べ替え」という欄がありますので、そこで昇順か降順が選べます。 1さんの仰っているのは、レポートのデザイン画面で、「グループ化」を使うということでしょうか。ツールバーに下のような絵のかいたボタンがあります。 │(= │(= これを押して、並び替えたいフィールドを選んだりしてやれば、1さんのような表をレポートで表示させることが出来ると思います。値の集計なども出来るようで、便利そうです。 アクセスに関しては、魔法使いの開発工房という、なかなかいいHPがありますので、URLはっときますね。 ここの2000の「基本操作を考える」の「レポート」のところなど、まとまっているので、見てみるとよいと思いますよ。
- laputart
- ベストアンサー率34% (288/843)
2つ目のようなテーブルの場合フィールドを無数に設定するのでたいへんです。 重複クエリーとか フォームで氏名を1つ選択するとそれに一致するデータがリストアップされる とかレポートで あ 1111 3333 い 2222 .... とか表示させる方法などはあります。 どうしてもならモジュールで作成するくらいでしょうか
補足
レポートで表示させる方法は、どんな方法でしょうか。教えていただけないでしょうか。
お礼
ありがとうございました。お蔭様ですべてのデータに連番を割り当てることができました。お手数をお掛けしました。