• ベストアンサー

ACCESSのテーブルからデータを抽出する方法

次のようなデータ構造のテーブルから  氏名 | データ1 ----------------  あ  | 1111  い  | 2222  あ  | 3333  う  | 4444 次のようなデータ構造のテーブルを  氏名 | データ1 | データ2 ----------------------------  あ  | 1111 | 3333  い  | 2222 |  う  | 4444 | 作成したいのですが、うまくいきません。 どなたか教えていただけないでしょうか。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.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 これで「通番割当」フォームを再保存した後、「実行」ボタンをクリックすれば、全てのデータに「通番」を割り当てられるはずです。 ※念のため、必ずデータのバックアップを行ってから実行して下さい(汗)※

vhb1953
質問者

お礼

ありがとうございました。お蔭様ですべてのデータに連番を割り当てることができました。お手数をお掛けしました。

その他の回答 (5)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.5

No.3です。 私のいうところの「通番」(→通し番号)、No.4でRich53さん言われるところの「Class」の、割り当て方法についての一案ですが、そのテーブルをレコードソースとするフォームを作成し、「氏名」で絞り込みをかけた上で、レコード番号を「Class(通番)」に代入するマクロを組まれてはいかがでしょうか?

vhb1953
質問者

補足

ありがとうございます。すみませんがマクロの組み方を教えていただけないでしょうか。

noname#95859
noname#95859
回答No.4

参考になればと思い書き込みします。 (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をうまく処理できれば、クロス集計クエリで目的としたものは完成します。 どなたか、知恵を貸していただければと思います。

vhb1953
質問者

補足

ありがとうございます。個人ごとに集計したいデータの件数は、1件から20件ぐらいあります。総データでは2000件を超えています。ご指摘のとおりClassフィールドに書き込むデータの処理が問題ですね。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

今からそのテーブルに1フィールドを追加できますか? もしそれができるなら、そこに氏名毎の通番を記録し、「クロス集計クエリ」を行えば、vhb1953さんがほしいという形にまとめられると思います。 1)クエリのデザインビューでクロス集計クエリを選択。 2)「集計」行で、「氏名」と「通番」に「グループ化」を、「データ」に「最小」を指定。 3)「行列の入れ替え」行で、「氏名」に「行見出し」を、「通番」に「列見出し」を、「データ」に「値」を指定。 ・・・ただ、「通番」の割り当てが問題になりますが。

  • UTwTU
  • ベストアンサー率24% (218/879)
回答No.2

あ 1111 あ 3333 い 2222 う 4444 という形でもいいなら、クエリで「並べ替え」を使うといいのではと思います。 クエリを作成するときに、「並べ替え」という欄がありますので、そこで昇順か降順が選べます。 1さんの仰っているのは、レポートのデザイン画面で、「グループ化」を使うということでしょうか。ツールバーに下のような絵のかいたボタンがあります。 │(= │(= これを押して、並び替えたいフィールドを選んだりしてやれば、1さんのような表をレポートで表示させることが出来ると思います。値の集計なども出来るようで、便利そうです。 アクセスに関しては、魔法使いの開発工房という、なかなかいいHPがありますので、URLはっときますね。 ここの2000の「基本操作を考える」の「レポート」のところなど、まとまっているので、見てみるとよいと思いますよ。

参考URL:
http://www.mahoutsukaino.com/index.htm
  • laputart
  • ベストアンサー率34% (288/843)
回答No.1

2つ目のようなテーブルの場合フィールドを無数に設定するのでたいへんです。 重複クエリーとか フォームで氏名を1つ選択するとそれに一致するデータがリストアップされる とかレポートで  あ 1111 3333 い 2222 .... とか表示させる方法などはあります。 どうしてもならモジュールで作成するくらいでしょうか         

vhb1953
質問者

補足

レポートで表示させる方法は、どんな方法でしょうか。教えていただけないでしょうか。

関連するQ&A