- ベストアンサー
エクセルデータベースで抽出
エクセルでデータベースを作っています。 例えば、 全国の小学校の生徒を対象にアンケートをします。 アンケートを受ける受けないは自由です。 アンケートは毎月あります。 アンケートは一人一枚のマークシートで6問にABCで答えます。 返ってきたアンケートのみデータベースのシート1に入力します。(マークシート読み取り機から一括入力してます) 年月 学校名 学年 組 名前 (1)(2)(3)(4)(5)(6) 091 A学校 5 1 ああ A C A B C B 091 A学校 5 3 いい B B C B A A 091 A学校 5 4 うう C A A A A A 091 C学校 2 1 ええ A C A B C C 091 C学校 3 1 おお A A A B C B 091 E学校 4 4 あい C A A B B A 092 A学校 5 4 いう C A A A A A : : : たとえば、こんな感じで・・・ ここでシート2に、年月と学校名を抽出したいです。 年月 学校名 091 A学校 091 C学校 091 E学校 092 A学校 : : アンケートは毎月なので、このデータベースは毎月大きくなります。(想定では年に1万行位) シート2には毎月データ追加分が加算されるようにしたいです。 (シート2を毎回ゼロから作るとデータベースがでかくなったとき、結構時間がかかってしまう為) なんとかVBAで組もうと思ったのですが、私の腕が足りず出来ません。 どなたかVBAに詳しい方、教えて下さい。 宜しくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
VBAを使わなくても次のようにすることで追加分がシート2に反映できますので何らの問題もないと思います。 シート1では2行目からデータがあり、お示しの表がK列まで使用されているとします。 L2セルには次の式を入力します。 =A2&B2 M2セルには次の式を入力します。 =IF(L2="","",IF(COUNTIF(L$2:L2,L2)=1,MAX(M$1:M1)+1,"")) L2セルとM2セルを範囲として選択してコピーします。 名前ボックスにはL2と表示されていることでしょうがL2:L20000と入力しEnterします。その後に貼り付けを行います。これで20000行まで式をオートフィルドラッグしたと同じ事になります。 次にシート2に移ります。 A2セルには次の式を入力します。 =IF(COUNTIF(Sheet1!$M:$M,ROW(A1))=0,"",INDEX(Sheet1!$A:$B,MATCH(ROW(A1),Sheet1!$M:$M,0),COLUMN(A1))) この式をB2セルまでオートフィルドラッグします。 コピーします。 名前ボックスにA2:A20000と入力し貼り付けをします。 これで、シート1に新たなデータが追加されても、自動的に年月と学校名が追加されて表示されることになります。
その他の回答 (5)
- cistronezk
- ベストアンサー率38% (120/309)
PCの環境によりますが、一般的には数万件のデータを関数のみで処理するのは無謀でしょう。 すでに回答が示されているピボットテーブルによる集計結果をシート2へ出力し、そのデータと後から説明が追加された「別データ」とやらをシート3に統合しはどうでしょう。シート2からシート3への変換は、単なる参照か簡単な関数で対応可能かと思います。
お礼
回答ありがとうございます。 返信遅れて申し訳ありません。 やはりはじめのデータベースの作り方がまずかったようです。 勉強になりました。 今までは小さなものしか作ったことが無かったものですから・・・。 一から勉強し直します。 またいろいろと教えて下さい。 宜しくお願い致します。 返信遅れて本当に申し訳ありませんでした。
- tag1701
- ベストアンサー率54% (67/123)
すみません。No4です。 適当に8,000件のデータで試したら、やっぱり使用に耐えられませんでした。 すみません。無視してください。
お礼
返信遅れて申し訳ありません。 回答ありがとうございます。 いろいろ試してみましたが、やはりはじめのデータベースの作り方が悪かったようで、うまくいきませんでした。 今は教わったクエリを勉強中です。 いろいろありがとうございます。 また一生懸命勉強します。 返信遅れて本当に申し訳ありませんでした。
- tag1701
- ベストアンサー率54% (67/123)
遅くなる原因(前段階って?)がよくわかりませんが、 抽出方法で別の考え方を紹介します。 エクセルシートを文字通りデータベースとして認識させ、 抽出させます。 1)入力してあるシートは既に保存されていると思いますので、 どこに保存したか認識しておいてください。 2)シート2の抽出したい最初のセルにカーソルをおいて 「データ」-「外部データの取り込み」-「新しいデータベースクエリ」 を選択。(ここでアドインのインストールが始まるケースもある ようですのでその際はOKでインストールしてください) 3)データソースの選択ウィンドウがでますので、Excel File*を選んでOK 4)ここで該当のエクセルファイルが左側のデータベース名の下の方に 現れるよう探す。 5)でたらそれを選んでOK この時クエリに出来るテーブルがありません等のメッセージが出た 場合、参照サイトを参照し、出現させてください。 6)左側のシート名の+を押して列名を表示させ、年月・学校名を 右側に移動させ、「次」をクリックします。 7)条件は無いので、「次」をクリックします。 8)並べ替え順序を上から年月・学校名を選択し、「次」をクリックします。 9)Microsoft Queryでデータの表示またはクエリの編集を行うを選択し「完了」をクリックします。 10)クエリの画面が出て今まで与えた条件の結果が出ています。 この画面の上側ボタン「SQL」を押します。 11)SQLステートメント画面に select~ORDER BY `'シート名$'`.年月, `'シート名$'`.学校名と あります。 12)この ORDER BYから下をコピーして下さい。 13)ORDER BYの前に貼り付けてください。 14)貼り付けたORDER BY を GROUP BYに書き換えてOKを押してください。 15)結果が一月・一校にまとまったと思います。そしたらこのクエリ 画面を×を押して消してください。 16)データを返す場所の確認ウィンドウが出ますので、よければOKを 押してください。 これで抽出完了です。今後は抽出シートの抽出場所最初セルにおいて 「データ」-「データの更新」を押せば、データが何件増えても全て 自動で範囲に入り再計算されます。 この機能はアクセスの一部の機能なので、多分集計スピードは速いと 思います。 興味があれば試してみてください。
- akina_line
- ベストアンサー率34% (1124/3287)
こんにちは。 お考えになっていることと多少違いますが、ピボットテーブルで集計表を作成したらどうでしょう。 一例として、下記のような集計表を作ります。 学年 1 2 3 4 5 年月 学校名 091 A学校 10 20 30 20 20 ←年月、学校、学年毎の人数 091 C学校 091 E学校 092 A学校 : : ピボットテーブルの作り方は下記サイトをご参照ください。 http://www.officepro.jp/exceltips/pivot/index1.html サンプルとほぼ同じ手順でいけると思います。 次に意図した表を作るために項目を設定します。 http://www.officepro.jp/exceltips/pivot/index2.html これはサンプルとは項目が全然違うので、以下のようになります。 ★フィールドリストには年月 学校名 学年 組 名前 (1)(2)(3)(4)(5)(6)が表示されているはずです。 ★「年月」のフィールドをドラッグして、A列の下の「ここに行のフィールドを。。。」と書いてある枠内にドロップします。 ★同様に「学校名」も「年月」の下にドロップします。 ★次に「学年」を3行目の「ここに列のフィールドを。。。」と書いてある枠内にドロップします。 ★最後に「名前」を「ここにデータアイテム。。。」と書いてある枠内にドロップします。 http://www.officepro.jp/exceltips/pivot/index3.html 以上で集計表が出来上がります。 では。
補足
早い回答ありがとうございます。 実はこのデータベースには先があって、このシート2には別のデータを付加しなくてはなりません。 どうしても抽出の方法を取りたかったのです。 質問の説明が不十分でした。 どうもすみません。 ピボットテーブルのサイト見ました。 すごくわかりやすく載っていて、大変勉強になります。 また、いろいろと教えて下さい。 宜しくお願い致します。
- tag1701
- ベストアンサー率54% (67/123)
ピボットテーブルを使っては出来ませんでしょうか? 毎回データ範囲の変更は必要ですが、難しいVBA等を使わなくても 良いのではないかと思いますが。。。
補足
早い回答ありがとうございます。 実はこのデータベースには先があって、このシート2には別のデータを付加しなくてはなりません。 どうしても抽出の方法を取りたかったのです。 質問の説明が不十分でした。 どうもすみません。
補足
回答ありがとうございます。 御礼遅れて申し訳ありません。 バッチリできました! なるほど横に番号を振って行くんですね。 ただ・・・ちょっと問題が・・・。 すみません、実際にはデータベースがかなり大きくて、この処理を加えたところ、すごく遅くなってしまいました。(前段の処理で5分以上) すみません、結果はばっちりだったんですが、時間がかかり過ぎちゃって。 はじめのベータベースの作り方が悪いと思うのですが、何かいい方法はないでしょうか?