• 締切済み

EXCELから効率よくデータ抽出したい

EXCELのデータが20万行あります。 この中から、データを抽出したいのです。1個なら検索で良いかと思うのですが、20個とか30個とかの場合は、どうすれば効率が良いのでしょうか? 今やっているのは、こんな感じです。 EXCELの20万行のデータを(1)とします。 抽出したいデータを(2)とします。 (1)には重複不可のキーとなるIDがあります。(2)には調べたいIDが入っています。 (1)のとなりに(2)を貼り付け、IDを頼りに(1)から(2)のデータをvlookupします。 そこで#n/aとならなかったデータが対象・・・としています。 ただ、(2)のデータが全て(1)に含まれているわけではなく、含まれていないものは他のテーブルから抽出します。((1)のテーブルは20個ほどあります) そのため、今度は(2)のIDをキーにvlookupをして、(1)から抽出されなかったデータを絞っています。 また、(2)に入っているIDに無駄な空白があったり・・・とデータの整形もあります。 現在、データが重い上にかなり手間がかかっています。ACCESSのクエリーを使えば早いのでしょうが、EXCELのデータで各カラムにいろいろなデータが入っているために(フィールドが整理されていない)カンタンに移行できそうもありません。 やっぱり、ここは何とかAccessへ移行させるべきでしょうか? 20万行のファイルを20個1つのAccessにすればやはり重くなりますでしょうか? すみません。よろしくお願いします。

  • key51
  • お礼率60% (21/35)

みんなの回答

  • chayamati
  • ベストアンサー率41% (254/607)
回答No.6

ACCESSへの移行ですね 添付は社員のデータファイルのACCESSモデルです。 フィールドを定義し、リレーションシップを設定しただけで テーブルを開くと社員毎の家族構成がリストされるし、このままデータ入力も可能になります。 T-家族の住所、電話番号はT-社員を参照できるので不要です。 自分は趣味で始めたので最大数千件レコードしか扱っていませんので 20万行×20=400万行ですね何とも言えませんが EXCELより多くのレコードを処理できることは確かです。 移行手順は 1.(2)のIDがユニーク(重複なし)が前提です。 ..IDに空白が入っているセルにはユニークなものを記述しておきます。 ..IDが列見出しならコード等に変更しておきます。 ..Accessで(2)をインポートします。主キーはお任せにします。 ..改名したIDに重複なしの設定にします。 ..重複があると設定できませんのでこれを解消して再挑戦 2.(1)のテーブルのうち代表的な行を1行インポートします。 ..IDはコード親とでも改名します ..コードとコード親でリレーションシップを定義します。 ..残りの行をインポートします...コードの見つからない行はインポートできません できなかった行はリストされます。 ,,IDを除いて(2)と同じ(1)のフィールドを内容照合の上除去します

  • aoyama984
  • ベストアンサー率45% (253/561)
回答No.5

http://www.moug.net/tech/exvba/0050116.html http://officetanaka.net/excel/vba/speed/s11.htm http://tuka.s12.xrea.com/index.xcg?p=ADO#p13 (2)に入っているIDに無駄な空白があったり・・・とデータの整形 これは具体的にはどういうものなのでしょうか 手作業の準備レベルの話だと思いますが 照合作業に何らかの考慮が必要なのでしょうか 完全一致のIDの検索 ということでいいのでしょうか

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.4

下記のようなマクロで抽出できます。 マクロがわからなければスルーしてください。 --- Sub mTyusyutsu() Dim strSql As String Dim cnXL As Object Dim rsXL As Object Set cnXL = CreateObject("ADODB.Connection") Set rsXL = CreateObject("ADODB.Recordset") With cnXL .Provider = "MSDASQL" .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _ "DBQ=" & ThisWorkbook.FullName & "; ReadOnly=True;" .Open End With strSql = "select a.ID " _ & " FROM [Sheet1$A1:A100] a " _ & " INNER JOIN [Sheet1$B1:B20] b " _ & " ON a.ID = b.ID" Debug.Print strSql rsXL.Open strSql, cnXL, adOpenForwardOnly Worksheets("sheet2").Cells(1, 1).CopyFromRecordset rsXL rsXL.Close: Set rsXL = Nothing cnXL.Close: Set cnXL = Nothing MsgBox "出力終了!" End Sub

  • idaroi
  • ベストアンサー率60% (6/10)
回答No.3

詳しい要求仕様がわからないのでなんとも言えませんが、代替案としては、 ・excel関数でif関数の併用 ・マクロを書く ・データベースの併用 などの方法が考えられると思います。 データベースですが、MySQLなど、フリーでもかなり性能の良いものがありますし、マイクロソフトのSQLServerも、フリー版があったかと。 全部のカラムをデータベースに移行することが唯一の解ではなく、例えばidと行番号の対応だけをデータベースに入れて、得られた行番号から、データの本体はExcelの方から転記するとか、Excelのカラム値を全部文字列としてフリー情報としてデータベースに、まるまる突っ込むとか、方法は色々あると思います。

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.2

Accessで20万行だと、それほど多いデータ量では無いです。 抽出もほとんど一瞬で済むので、それだけの量だとAccessに 移行した方が良いでしょうね。 ただ、Excelでもデータベース機能はあります。Vlookupは処理 が決して速くないのですが、データベース機能は処理速度が 比較的速いので、まずはExcelのままデータベースが使えない か、チェックしてみた方が良いです。調べれば分かりますが、 テーブルが1つだけなら、Accessに劣らない機能があります。 http://www.becoolusers.com/excel/excel-database.html Excelのデータベースは、セル内のデータの整合性(文字と数字 が混在していたり、空白があったり)に余り影響されずに動作 しますので、その面でもAccessよりは楽ですよ。

  • aokii
  • ベストアンサー率23% (5210/22062)
回答No.1

何とかAccessへ移行させるべきでしょう。 20万行のファイルを20個1つのAccessにしても重くはなりません。 エクセルでは重くなります。

key51
質問者

お礼

やっぱりエクセルだと無理がある段階に来ていますよね~ 古いエクセルのバージョンの時に行数が多くなったんで アクセスにしようと思ったんですが、 その後、エクセルのバージョンアップでどうにかなるようになったんで そのままにしちゃってたんですよね。 検討したいと思います。 ありがとうございました。

関連するQ&A

  • 【Access】部分一致で不一致データを抽出したい

    クエリで2つのテーブルから、不一致データを抽出したいのですが、 完全一致だけでなく部分一致のデータも一致データとして取り除きたいです。 [テーブルA]フィールド1 000-0001 000-0001A 000-0002 000-0003 000-0004 [テーブルB]フィールド2 000-0001 000-0002 というようなデータで、結果は [結果] 000-0003 000-0004 というふうにしたいです。 (000-0001だけでなく000-0001Aというデータも取り除きたいのです。) Access初心者で、クエリウィザードを使用した重複データ抽出、不一致データ抽出、 およびクエリデザインを使用した重複データ抽出が何とかできる程度です。 初心者でも分かるようにご回答いただければ大変助かります。 よろしくお願いいたします。

  • 「主キー以外重複データ(フィールド多数)」の抽出

    タイトルのような抽出方法が必要になり、その出し方で困っています フィールドが100以上ある大きなテーブルが複数(フィールド構造は全く同じ)あり、 そのレコードを一つにまとめる為重複データを抽出し削除したいのです 条件は「主キー以外の全てのフィールドのデータが一致してる重複データ」であり、 それをどうやればAccessの機能で出せるのか悩んでいます。 最初はクエリでグループ化して出そうと思ったのですがこのフィールド数では全て グループ化はできず、 VBAで一行ずつループで処理しようにもキー以外の全フィールド一致とする検索条件のSQLのWHERE式が複雑すぎると出て処理できませんでした フィールド数が多大なテーブルで主キー以外完全一致の重複レコードをうまく抽出するにはどうすればいいのでしょうか?

  • アクセス2010 最新データを抽出する方法

    はじめまして。 アクセスを猛勉強中の初心者です。 過去記事を探しましたが、解決できませんでしたのでご教示お願いします。 やりたいことは、2つのテーブルからクエリを使って、最新のデータを抽出したいです。 ですが、その中に抽出したくないワードが存在します。 それ以外のワードで最新のデータを抽出したいです。 まず、下記のような2つのテーブルがあります。 ●テーブル1        ・ID(主キー)       ・日付 ・コメント ・顧客ID ●テーブル2 ・顧客ID(主キー) ・顧客名 ・住所 次にこのテーブルをクエリにしてデータを返すと、下記のようになります。 日付    コメント      顧客名    ・2/1     保留       Aさん ・2/1     発送       Bさん       ・2/1     相談       Cさん ・2/2    次回未定     Bさん ・2/3     発送       Aさん  ・2/4    次回未定     Dさん        今回抽出したいデータは、「発送」というワードをはぶいた最新のデータをとりたいということです。 なので、データとしては、 日付    コメント      顧客名    ・2/1     保留       Aさん ・2/1     相談       Cさん ・2/2    次回未定     Bさん ・2/4    次回未定     Dさん と、このように抽出したいのです。 最新データの抽出にはMax関数を使ってでき、いらないワードである「発送」はクエリのフィールドの抽出条件に『<>”発送”』と入力することで抽出を防ぐことができたのですが、これらの方法でMax関数を入れて最新データの抽出をしようとすると、全ての「発送」を除いたデータが抽出されるので、最新データに該当する顧客のデータが消えてしまいます。 なので、本来のコメントデータが分からない状態になります。 また、エクセル側でパラメータクエリを使って資料を作成し、アクセスに触ったことがない人たちが使用するので、アクセスを更新してといったことができません。 なので、更新クエリなどを使ってのやり方以外の方法はないでしょうか? 全くの初心者ですので、言葉足らずで説明が分かり辛くて申し訳ありません。 ご教示をお願いいたします。

  • access2007 クエリで抽出

    初心者です。クエリで抽出したのですが、一部のデータが抜け落ちます。抽出条件のフィールドはテキスト型で、元のテーブルでコピペで統一しましたが、同じデータが抜け落ちます。削除してやり直しても同様でした。重複クエリを作成するとこのフィールドが重複して出てきます。どこを直したらいいのか見当がつきません。よろしくお願いします。

  • Accessのクエリーで、*が入っているデータを抜出す方法って?

    助けてください! Accessのクエリーで、*が入っているデータを抜き出すのってどうやるんですか? クエリーの元になるテーブルは1つ、非常に単純なテーブルです。  ●フィールド1=「*」もしくはNullもしくは「英数字」  ●フィールド2=製品番号  ●フィールド3=メーカ番号 テーブルには上記3つのフィールドしかありません。 このテーブルの、「フィールド1に『*』が入っているデータを抜出したいのです。(抜出すのはフィールド1~3全て) 単純に選択クエリーで「抽出条件」に「“*“」と入れると、「フィールド1に英数字が入っている」行まで選択しちゃうんです。そりゃそうだよなーとは思うのですが、じゃあ、どうやったら英数字の入っている行は無視して、純粋に「*」だけの行を抜出せるのかわかりません。 誰かー!助けて―!

  • クエリーで全部のデータを抽出する方法

    アクセスのクエリーでデータを抽出する時、具体的にはフォームでデータを入力し抽出するのですが、たとえばフォームのテキストボックスに数字を入れないとそのクエリーのフィールドは抽出がかからないようにしたいのです。(抽出フィールドが1つなら数字をいれなければクエリーのデータすべてが表示される) ----------------------------------- フィールド   A      B     c テーブル   テーブル1 テーブル1 テーブル1 抽出条件    []    [] または    ---------------------------------- 上はクエリーのデザインですがクエリーをひらくと抽出条件をきいてきますがA列は何も入力しないでB列では1と入力するとBの列に1の入ってるレコードを表示させたいのです。(もし空欄が無理ならAの列の時何かある文字を入力すると全部表示になる、でもいいです。) まわりくどくなりましたが、アクセス超入門者です。よろしくおねがいします。

  • アクセスで重複データの抽出について

    アクセスで添付画像のようなテーブルがあり、重複データの抽出を行いたいです。 抽出結果は 120 0 となるようにしたいです。 つまり、 ・フィールド1を基準に、フィールド2が全て0だった場合のみ抽出する という条件です。 どのように行えばよいか、お分かりの方お教え下さい。 よろしくお願いいたします。

  • accessで重複データの削除について

    accessというよりSQLについてなのかと思いますが、教えていただけないでしょうか。 重複するIDがあり、1件を除いて他のデータを削除してデータを抽出したいです。 抽出条件としては、[年月日]カラムがあるため、日付が一番直近のものを残したいです。  ※こちらも重複しております。 また、[フィルタ]カラムが「2」のレコードのみを対象としたいと思っています。 accessの場合、重複クエリを用いるのかと思い、クエリウィザードから作成しましたが 一意とはなりませんでした。 SELECT テーブル1.[共通ID], テーブル1.[連番], テーブル1.[郵便番号], テーブル1.[住所], テーブル1.[担当者名], テーブル1.[年月日], テーブル1.[フィルタ] FROM テーブル1 WHERE (((テーブル1.[共通ID]) In (SELECT [共通ID] FROM [テーブル1] As Tmp GROUP BY [共通ID] HAVING Count(*)>1 )) AND ((テーブル1.[フィルタ])=2)) ORDER BY テーブル1.[共通ID], テーブル1.[年月日] DESC; distinctも使ってみましたがうまくできませんでした。 何が原因でしょうか。 申し訳ありませんがご教示いただきたくお願いいたします。

  • フォームから複数のデータを抽出

    作業が進まず困っております。どうかお力をお貸し頂ければ幸いです。 数字のみが羅列されているものが2種類あります。(ID(1)・ID(2)とします) ID(1)は重複されていないデータです。 ID(2)は重複されているデータです。 テーブルに下記のように並んでいます。 ID(1)   ID(2) 123444  987654 123456  987654 123465  986431 このID(2)を元に、ID(1)のみが表示される新たなテーブルを作成します。 問題は、ID(1)の全データを新なテーブルに表示されるのではなく、ID(2)の中から1件~複数件抽出した状態で表示させる事です。 クエリで、1件のみならばテーブル作成が出来たのですが、仕事の内容としては不十分で使えません。(パラメータで入力出来る様にしました) ID(2)がそのつど何件出るか分からない為です。 自分だけが作業を行うならば、クエリでID(2)を入れれば問題ないのですが、 複数の人間がこのAccessを利用してID(1)のデータ抽出を行う予定です。 上司から、ID(2)を1件から複数件入力して、テーブルが作成出来るように作るように指示されています。 そこで、フォームを作成し、ID(2)を入れられるテキストボックスを複数作成し、 クエリにID(1)を表示させ、隣に下記の式をテキストボックスの数だけフィールドに入力しました。 式 IIf(IsNull([Forms]![フォーム 1]![ID(2)条件1]) , True,[ID(1)]=[Forms]![フォーム 1]![ID(2)条件1]) ※テキストボックスの数だけ「ID(2)条件」の最後の数字を増やしました。 しかし、表示されるのは1つのIDのみで、複数件表示させる事が出来ませんでした。 同じフィールドでは表示させる事は出来ないのでしょうか? 長くなってしまいましたが、宜しくお願い致します。

  • Accessで特定の重複データを抽出したい

    Access2003です。 重複クエリウィザードを使って、あるテーブルから画像(1)のようなデータを抽出するクエリを作りました。 抽出根拠は「口座番号」「受取人」「請求額」の一致です。 ここから更に「支払日が2016/01/10を含む重複データ」を抽出したいのですが、そのやり方がわかりません。 画像(2)の結果になるのが理想です。 お力添え宜しくお願いします。

専門家に質問してみよう