• ベストアンサー

Excelでのデータ抽出方法

お世話になります。Excelで下記のような同じ得意先が複数存在するリストから 得意先が重複しないようにリスト化(得意先1つにつき1行)することは可能でしょうか? レコード数が2万件近くあり、手作業では大変で困っております。 また、Excelで無理であればAccessに取り込んで作業をすることも可能です。 (最終的にはエクセルファイルとして出力希望です) 何かよい方法をご存知の方がいらっしゃいましたらご指導願います。 よろしくお願いいたします。 【抽出前】 項目  得意先名 01    A 02    B 03    B 04    B 05    C 06    C 07    D 08    E 09    E 10    F 【抽出後】 項目  得意先名 01    A 02    B 03    C 04    D 05    E 06    F

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

VBAマクロで重複のないリストを作成する方法です。何度か紹介したことがありますが、Directoryオブジェクトを利用します。 他にも方法はありますが、高速(2万件程度でしたら数秒)で重複のないリストが抽出できます。お試し下さい。 【手順】 1. [Alt]+[F11]でVisual Basic Editor起動(以下VBE) 2. VBE画面で[挿入]-[標準モジュール]クリック 3. 2.で開いたウインドウに下記VBAコードをコピー&ペースト 4. VBEを閉じる 5. 抽出範囲のセルを選択   -->例えば得意先名のあるセルB1~B20000を選択します 6. [ツール]-[マクロ]-[マクロ]で[重複データ除去]を実行 【以下VBAコード:場所=標準モジュール】(次行から終わりまで) 'Dictionaryオブジェクトを使用して重複のないリストを作成 Sub 重複データ除去()   Dim objDic As Object   Dim rngCel As Range   Dim Sh As Worksheet   '重複の無い値リスト作成   Set objDic = CreateObject("Scripting.Dictionary")   With objDic     For Each rngCel In Selection       If Not (IsEmpty(rngCel) Or .Exists(rngCel.Value)) Then         .Add Key:=rngCel.Value, Item:=Empty       End If     Next rngCel   End With   '抽出したデータがあれば   If objDic.Count > 0 Then     '新規シートに書き出し     Set Sh = Sheets.Add     Sh.Range("A1").Resize(objDic.Count) = _       Application.Transpose(objDic.keys)   End If   '後始末   Set Sh = Nothing   Set objDic = Nothing End Sub

snow-hat
質問者

お礼

お返事が遅くなりました。 納得の行く結果が得られそして処理が高速という点で 大変助かりました。 ありがとうございました。

その他の回答 (5)

  • macchan1
  • ベストアンサー率38% (52/136)
回答No.6

単純に重複の無い得意先名を取得したいんら、フィルタオプションを利用するのが簡単です。 得意先名の列を選択し、「データ」「フィルタオプション」で「重複するレコードは無視する」にチェックをいれてOKします。 このとき、抽出された範囲を選択してコピーするか、「指定した範囲」で「抽出範囲」を設定すればそのデータだけをコピーすることができます。

snow-hat
質問者

お礼

ご連絡ありがとうございます。 判りやすくご説明ありがとうございます。 フィルタオプションということで処理に時間はかかりますが、一番手軽に出来る方法だと思いました。 ご対応ありがとうございました。

  • jurarumin
  • ベストアンサー率34% (190/544)
回答No.4

#1です。 画面左にある「オブジェクト」の「クエリ」を選択してください。 次に、「デザインビューでクエリを作成する」を実行します。 「テーブルの表示」でテーブルを選択する事になるので、取り込んだデータがあるテーブルを選択します。 選択したら「テーブルの表示」を閉じます。 画面上の方にテーブルと各項目が表示されるので、「項目」「得意先名」をダブルクリックします。 すると、画面下に項目、得意先名が表示まれます。 表示した項目の上で右クリックをして「Σ集計」を選択します。 ↑この状態でグループ化 で、項目の「グループ化」を「最小」に変更します。 最後に画面上にある「!」で集計を実行します。

snow-hat
質問者

お礼

ご連絡ありがとうございます。 今回はExcel内で処理出来る結果を優先しましたが Accessでも同様の処理が高速に出来ることがわかり 大変参考になりました。 お忙しい中ご対応ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

Excelで何種類も、この実験をしたことがあるのですが、レコード数が2万件近くとなると、はっきりと処理スピードが分かれます。 データ-フィルターフィルタ・オプションーで、重複するレコードは無視するで、抽出してしまうか、以下のようなマクロのAdvancedFilter で、 Range("A1").CurrentRegion.Offset(,1).Resize(, 1).AdvancedFilter _      Action:=xlFilterCopy, _      CopyToRange:=Range("D1"), _      Unique:=True 'D1に出力する というのが、最も速いです。関数でする方法もあるのですが、20,000件にもなると、とても、これには追いつかないです。 それから、MSクエリに設定を書く方法もありますが、それだけの手間が掛かりますね。

snow-hat
質問者

お礼

ご連絡が遅くなり申し訳ございません。 ご指導いただきましたマクロなのですが、当方の知識不足のためうまく動かすことができませんでした。 申し訳ございませんでした。

  • denbee
  • ベストアンサー率28% (192/671)
回答No.2

質問です。 質問者様の目的は、得意先名を重複なく全ての種類取得したいだけでしょうか? それとも、例にある「項目」の抽出方法にも何か条件があるのでしょうか?

snow-hat
質問者

お礼

ご連絡ありがとうございます。 ご質問頂きました件、得意先名を重複なく全ての種類取得したいだけでございます。

  • jurarumin
  • ベストアンサー率34% (190/544)
回答No.1

Accessのクエリで 項目 ← 最小  得意先名 ← グループ化 としてみると抽出されるのでは?

snow-hat
質問者

お礼

ご連絡ありがとうございます。 申し訳ございません、Accessに取り込みをしましたが どこで最小やグループ化の設定をしたらよいかわかりませんでした。 知識不足で申し訳ございません。

専門家に質問してみよう